From b97d47e52f85d449d6900a5be5ef8a643c178168 Mon Sep 17 00:00:00 2001 From: Andrii Derevianko Date: Mon, 12 Dec 2022 15:49:04 +0100 Subject: [PATCH 1/4] assembly references 1st version Signed-off-by: Andrii Derevianko --- ArchUnitNET/Domain/Assembly.cs | 2 +- ArchUnitNET/Loader/ArchBuilder.cs | 15 ++++++++++++++- ArchUnitNET/Loader/ArchLoader.cs | 6 +++--- ArchUnitNET/Loader/AssemblyRegistry.cs | 4 ++-- ArchUnitNET/Loader/TypeFactory.cs | 3 ++- .../Fluent/Extensions/BuildMocksExtensions.cs | 2 +- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ArchUnitNET/Domain/Assembly.cs b/ArchUnitNET/Domain/Assembly.cs index ee388db29..b5484bcbb 100644 --- a/ArchUnitNET/Domain/Assembly.cs +++ b/ArchUnitNET/Domain/Assembly.cs @@ -11,7 +11,7 @@ namespace ArchUnitNET.Domain { public class Assembly : IHasName, IHasAttributes { - public Assembly(string name, string fullName, bool isOnlyReferenced) + public Assembly(string name, string fullName, List referencedAssemblyNames, bool isOnlyReferenced) { Name = name; FullName = fullName; diff --git a/ArchUnitNET/Loader/ArchBuilder.cs b/ArchUnitNET/Loader/ArchBuilder.cs index a94506a36..c748283f7 100644 --- a/ArchUnitNET/Loader/ArchBuilder.cs +++ b/ArchUnitNET/Loader/ArchBuilder.cs @@ -42,7 +42,7 @@ 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) { if (!_assemblyRegistry.ContainsAssembly(moduleAssembly.Name.FullName)) { @@ -51,6 +51,19 @@ public void AddAssembly([NotNull] AssemblyDefinition moduleAssembly, bool isOnly _loadTaskRegistry.Add(typeof(CollectAssemblyAttributes), new CollectAssemblyAttributes(assembly, moduleAssembly, _typeFactory)); } + }*/ + + public void AddAssembly([NotNull] AssemblyDefinition moduleAssembly, IEnumerable moduleReferences, bool isOnlyReferenced) + { + var references = moduleReferences.Select(reference => reference.Name).ToList(); + + if (!_assemblyRegistry.ContainsAssembly(moduleAssembly.Name.FullName)) + { + var assembly = _assemblyRegistry.GetOrCreateAssembly(moduleAssembly.Name.FullName, + moduleAssembly.FullName, references, isOnlyReferenced); + _loadTaskRegistry.Add(typeof(CollectAssemblyAttributes), + new CollectAssemblyAttributes(assembly, moduleAssembly, _typeFactory)); + } } public void LoadTypesForModule(ModuleDefinition module, string namespaceFilter) diff --git a/ArchUnitNET/Loader/ArchLoader.cs b/ArchUnitNET/Loader/ArchLoader.cs index 1ba93d1df..2ca5148ec 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, module.AssemblyReferences, false); 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, null, false); 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, null,false); resolvedModules.AddRange(assemblyDefinition.Modules); } diff --git a/ArchUnitNET/Loader/AssemblyRegistry.cs b/ArchUnitNET/Loader/AssemblyRegistry.cs index ee698bbff..60aa072f3 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, List assemblyReferences, bool isOnlyReferenced) { return RegistryUtils.GetFromDictOrCreateAndAdd(assemblyName, _assemblies, - s => new Assembly(assemblyName, assemblyFullName, isOnlyReferenced)); + s => new Assembly(assemblyName, assemblyFullName, assemblyReferences , isOnlyReferenced)); } public bool ContainsAssembly(string assemblyName) diff --git a/ArchUnitNET/Loader/TypeFactory.cs b/ArchUnitNET/Loader/TypeFactory.cs index 65a1bccf5..f7e388c55 100644 --- a/ArchUnitNET/Loader/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -162,7 +162,8 @@ 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, null ,true); + Type type; bool isCompilerGenerated, isNested, isGeneric; diff --git a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs index 239d9b818..504892390 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, null,false); } private static Namespace CreateStubNamespace(this string namespc) From 7fd2b1796147cd4c21a4593d70601945e932c41c Mon Sep 17 00:00:00 2001 From: Andrii Derevianko Date: Wed, 14 Dec 2022 15:35:55 +0100 Subject: [PATCH 2/4] assembly references, idk if worked, no tests Signed-off-by: Andrii Derevianko --- ArchUnitNET/Domain/Assembly.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ArchUnitNET/Domain/Assembly.cs b/ArchUnitNET/Domain/Assembly.cs index b5484bcbb..02dfbb33a 100644 --- a/ArchUnitNET/Domain/Assembly.cs +++ b/ArchUnitNET/Domain/Assembly.cs @@ -16,11 +16,14 @@ public Assembly(string name, string fullName, List referencedAssemblyNam Name = name; FullName = fullName; IsOnlyReferenced = isOnlyReferenced; + ReferencedAssemblyNames = referencedAssemblyNames; } public bool IsOnlyReferenced { get; } public string Name { get; } + + public List ReferencedAssemblyNames { get; } public string FullName { get; } public IEnumerable Attributes => AttributeInstances.Select(instance => instance.Type); From 59f2ae672c9d811cd9aeee6fc3c56f7260a4f98a Mon Sep 17 00:00:00 2001 From: Andrii Derevianko Date: Thu, 19 Jan 2023 15:34:32 +0100 Subject: [PATCH 3/4] assembly references, it is working now Signed-off-by: Andrii Derevianko --- ArchUnitNET/Domain/Assembly.cs | 5 +++-- ArchUnitNET/Loader/ArchBuilder.cs | 17 +++-------------- ArchUnitNET/Loader/ArchLoader.cs | 6 +++--- ArchUnitNET/Loader/AssemblyRegistry.cs | 4 ++-- ArchUnitNET/Loader/TypeFactory.cs | 2 +- .../Fluent/ArchRuleEqualityTests.cs | 1 + .../Fluent/Extensions/BuildMocksExtensions.cs | 2 +- 7 files changed, 14 insertions(+), 23 deletions(-) diff --git a/ArchUnitNET/Domain/Assembly.cs b/ArchUnitNET/Domain/Assembly.cs index 02dfbb33a..cb1121119 100644 --- a/ArchUnitNET/Domain/Assembly.cs +++ b/ArchUnitNET/Domain/Assembly.cs @@ -6,12 +6,13 @@ using System.Collections.Generic; using System.Linq; +using JetBrains.Annotations; namespace ArchUnitNET.Domain { public class Assembly : IHasName, IHasAttributes { - public Assembly(string name, string fullName, List referencedAssemblyNames, bool isOnlyReferenced) + public Assembly(string name, string fullName, bool isOnlyReferenced , [CanBeNull] List referencedAssemblyNames) { Name = name; FullName = fullName; @@ -23,7 +24,7 @@ public Assembly(string name, string fullName, List referencedAssemblyNam public string Name { get; } - public List ReferencedAssemblyNames { 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 c748283f7..b56941777 100644 --- a/ArchUnitNET/Loader/ArchBuilder.cs +++ b/ArchUnitNET/Loader/ArchBuilder.cs @@ -42,25 +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) { - if (!_assemblyRegistry.ContainsAssembly(moduleAssembly.Name.FullName)) - { - var assembly = _assemblyRegistry.GetOrCreateAssembly(moduleAssembly.Name.FullName, - moduleAssembly.FullName, isOnlyReferenced); - _loadTaskRegistry.Add(typeof(CollectAssemblyAttributes), - new CollectAssemblyAttributes(assembly, moduleAssembly, _typeFactory)); - } - }*/ - - public void AddAssembly([NotNull] AssemblyDefinition moduleAssembly, IEnumerable moduleReferences, bool isOnlyReferenced) - { - var references = moduleReferences.Select(reference => reference.Name).ToList(); + var references = moduleReferences?.Select(reference => reference.Name).ToList(); if (!_assemblyRegistry.ContainsAssembly(moduleAssembly.Name.FullName)) { var assembly = _assemblyRegistry.GetOrCreateAssembly(moduleAssembly.Name.FullName, - moduleAssembly.FullName, references, 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 2ca5148ec..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, module.AssemblyReferences, 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, null, 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, null,false); + _archBuilder.AddAssembly(assemblyDefinition, false, null); resolvedModules.AddRange(assemblyDefinition.Modules); } diff --git a/ArchUnitNET/Loader/AssemblyRegistry.cs b/ArchUnitNET/Loader/AssemblyRegistry.cs index 60aa072f3..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, List assemblyReferences, bool isOnlyReferenced) + public Assembly GetOrCreateAssembly(string assemblyName, string assemblyFullName, bool isOnlyReferenced, List assemblyReferences) { return RegistryUtils.GetFromDictOrCreateAndAdd(assemblyName, _assemblies, - s => new Assembly(assemblyName, assemblyFullName, assemblyReferences , 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 f7e388c55..8feef9d6d 100644 --- a/ArchUnitNET/Loader/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -162,7 +162,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, null ,true); + typeReference.Module.Assembly.FullName, true, null); Type type; 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 504892390..f2eaaa279 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, null,false); + return new Assembly(assembly.FullName, assembly.FullName,false, null); } private static Namespace CreateStubNamespace(this string namespc) From c145c9e5bf282233e53e60beba2f3830de329387 Mon Sep 17 00:00:00 2001 From: Andrii Derevianko Date: Thu, 19 Jan 2023 17:39:14 +0100 Subject: [PATCH 4/4] visual changes Signed-off-by: Andrii Derevianko --- ArchUnitNET/Loader/TypeFactory.cs | 2 -- ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/ArchUnitNET/Loader/TypeFactory.cs b/ArchUnitNET/Loader/TypeFactory.cs index 8feef9d6d..190b7ff20 100644 --- a/ArchUnitNET/Loader/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -142,7 +142,6 @@ private ITypeInstance CreateTypeFromTypeReference(TypeReference typeRefer } } - TypeDefinition typeDefinition; try { @@ -163,7 +162,6 @@ 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, null); - Type type; bool isCompilerGenerated, isNested, isGeneric; diff --git a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs index f2eaaa279..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, null); + return new Assembly(assembly.FullName, assembly.FullName, false, null); } private static Namespace CreateStubNamespace(this string namespc)