diff --git a/ArchUnitNET/Domain/Assembly.cs b/ArchUnitNET/Domain/Assembly.cs index ee388db29..cb1121119 100644 --- a/ArchUnitNET/Domain/Assembly.cs +++ b/ArchUnitNET/Domain/Assembly.cs @@ -6,21 +6,25 @@ using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; namespace ArchUnitNET.Domain { public class Assembly : IHasName, IHasAttributes { - public Assembly(string name, string fullName, bool isOnlyReferenced) + public Assembly(string name, string fullName, bool isOnlyReferenced , [CanBeNull] List referencedAssemblyNames) { Name = name; FullName = fullName; IsOnlyReferenced = isOnlyReferenced; + ReferencedAssemblyNames = referencedAssemblyNames; } public bool IsOnlyReferenced { get; } public string Name { get; } + + [CanBeNull] public List ReferencedAssemblyNames { get; } public string FullName { get; } public IEnumerable Attributes => AttributeInstances.Select(instance => instance.Type); diff --git a/ArchUnitNET/Loader/ArchBuilder.cs b/ArchUnitNET/Loader/ArchBuilder.cs index a94506a36..b56941777 100644 --- a/ArchUnitNET/Loader/ArchBuilder.cs +++ b/ArchUnitNET/Loader/ArchBuilder.cs @@ -42,12 +42,14 @@ public ArchBuilder() public IEnumerable Assemblies => _assemblyRegistry.Assemblies; public IEnumerable Namespaces => _namespaceRegistry.Namespaces; - public void AddAssembly([NotNull] AssemblyDefinition moduleAssembly, bool isOnlyReferenced) + public void AddAssembly([NotNull] AssemblyDefinition moduleAssembly, bool isOnlyReferenced, [CanBeNull] IEnumerable moduleReferences) { + var references = moduleReferences?.Select(reference => reference.Name).ToList(); + if (!_assemblyRegistry.ContainsAssembly(moduleAssembly.Name.FullName)) { var assembly = _assemblyRegistry.GetOrCreateAssembly(moduleAssembly.Name.FullName, - moduleAssembly.FullName, isOnlyReferenced); + moduleAssembly.FullName, isOnlyReferenced, references); _loadTaskRegistry.Add(typeof(CollectAssemblyAttributes), new CollectAssemblyAttributes(assembly, moduleAssembly, _typeFactory)); } diff --git a/ArchUnitNET/Loader/ArchLoader.cs b/ArchUnitNET/Loader/ArchLoader.cs index 1ba93d1df..48567facc 100644 --- a/ArchUnitNET/Loader/ArchLoader.cs +++ b/ArchUnitNET/Loader/ArchLoader.cs @@ -107,7 +107,7 @@ private void LoadModule(string fileName, string nameSpace, bool includeDependenc var processedAssemblies = new List { module.Assembly.Name }; var resolvedModules = new List(); _assemblyResolver.AddLib(module.Assembly); - _archBuilder.AddAssembly(module.Assembly, false); + _archBuilder.AddAssembly(module.Assembly, false, module.AssemblyReferences); foreach (var assemblyReference in module.AssemblyReferences) { if (includeDependencies && recursive) @@ -124,7 +124,7 @@ private void LoadModule(string fileName, string nameSpace, bool includeDependenc { var assemblyDefinition = _assemblyResolver.Resolve(assemblyReference) ?? throw new AssemblyResolutionException(assemblyReference); - _archBuilder.AddAssembly(assemblyDefinition, false); + _archBuilder.AddAssembly(assemblyDefinition, false, null); resolvedModules.AddRange(assemblyDefinition.Modules); } } @@ -166,7 +166,7 @@ private void AddReferencedAssembliesRecursively(AssemblyNameReference currentAss var filterResult = filterFunc?.Invoke(assemblyDefinition); if (filterResult?.LoadThisAssembly != false) { - _archBuilder.AddAssembly(assemblyDefinition, false); + _archBuilder.AddAssembly(assemblyDefinition, false, null); resolvedModules.AddRange(assemblyDefinition.Modules); } diff --git a/ArchUnitNET/Loader/AssemblyRegistry.cs b/ArchUnitNET/Loader/AssemblyRegistry.cs index ee698bbff..66180e8ea 100644 --- a/ArchUnitNET/Loader/AssemblyRegistry.cs +++ b/ArchUnitNET/Loader/AssemblyRegistry.cs @@ -15,10 +15,10 @@ internal class AssemblyRegistry public IEnumerable Assemblies => _assemblies.Values; - public Assembly GetOrCreateAssembly(string assemblyName, string assemblyFullName, bool isOnlyReferenced) + public Assembly GetOrCreateAssembly(string assemblyName, string assemblyFullName, bool isOnlyReferenced, List assemblyReferences) { return RegistryUtils.GetFromDictOrCreateAndAdd(assemblyName, _assemblies, - s => new Assembly(assemblyName, assemblyFullName, isOnlyReferenced)); + s => new Assembly(assemblyName, assemblyFullName, isOnlyReferenced, assemblyReferences)); } public bool ContainsAssembly(string assemblyName) diff --git a/ArchUnitNET/Loader/TypeFactory.cs b/ArchUnitNET/Loader/TypeFactory.cs index 65a1bccf5..190b7ff20 100644 --- a/ArchUnitNET/Loader/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -142,7 +142,6 @@ private ITypeInstance CreateTypeFromTypeReference(TypeReference typeRefer } } - TypeDefinition typeDefinition; try { @@ -162,7 +161,7 @@ private ITypeInstance CreateTypeFromTypeReference(TypeReference typeRefer var currentNamespace = _namespaceRegistry.GetOrCreateNamespace(declaringTypeReference.Namespace); var currentAssembly = _assemblyRegistry.GetOrCreateAssembly(typeReference.Module.Assembly.Name.FullName, - typeReference.Module.Assembly.FullName, true); + typeReference.Module.Assembly.FullName, true, null); Type type; bool isCompilerGenerated, isNested, isGeneric; diff --git a/ArchUnitNETTests/Fluent/ArchRuleEqualityTests.cs b/ArchUnitNETTests/Fluent/ArchRuleEqualityTests.cs index c081bcfe0..6d14cda06 100644 --- a/ArchUnitNETTests/Fluent/ArchRuleEqualityTests.cs +++ b/ArchUnitNETTests/Fluent/ArchRuleEqualityTests.cs @@ -5,6 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Fluent; +using ArchUnitNETTests.Fluent.Syntax; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs index 239d9b818..01c9d55c7 100644 --- a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs +++ b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs @@ -93,7 +93,7 @@ public static Type CreateShallowStubType(this Class clazz) private static Assembly CreateStubAssembly(this System.Reflection.Assembly assembly) { - return new Assembly(assembly.FullName, assembly.FullName, false); + return new Assembly(assembly.FullName, assembly.FullName, false, null); } private static Namespace CreateStubNamespace(this string namespc)