From e96327fc7e8339040cdf8c8c9805f0c53b770ebf Mon Sep 17 00:00:00 2001 From: Alexander Linne Date: Fri, 26 Sep 2025 11:35:12 +0200 Subject: [PATCH] Fix attribute loading for cases where the base class is not available Signed-off-by: Alexander Linne --- ArchUnit.sln | 2 +- ArchUnitNET/Loader/MonoCecilAttributeExtensions.cs | 7 +++++-- ArchUnitNETTests/Loader/ArchLoaderTests.cs | 2 +- .../AssemblyAttribute.cs | 4 ---- .../FilteredDirectoryLoaderTestAssembly/Class1.cs | 8 +++++++- .../FilteredDirectoryLoaderTestAssembly.csproj | 2 +- .../FilteredDirectoryUnavailableTypesAssembly.csproj} | 1 + .../UnavailableTypes.cs | 7 +++++++ 8 files changed, 23 insertions(+), 10 deletions(-) delete mode 100644 TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/AssemblyAttribute.cs rename TestAssemblies/{FilteredDirectoryAssemblyAttributeAssembly/FilteredDirectoryAssemblyAttributeAssembly.csproj => FilteredDirectoryUnavailableTypesAssembly/FilteredDirectoryUnavailableTypesAssembly.csproj} (75%) create mode 100644 TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/UnavailableTypes.cs diff --git a/ArchUnit.sln b/ArchUnit.sln index e11f9e66..abcde8c4 100644 --- a/ArchUnit.sln +++ b/ArchUnit.sln @@ -46,7 +46,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchUnitNET.TUnitTests", "A EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceAssembly", "TestAssemblies\InterfaceAssembly\InterfaceAssembly.csproj", "{076E223C-32D3-4672-8B00-925CDBC1383E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FilteredDirectoryAssemblyAttributeAssembly", "TestAssemblies\FilteredDirectoryAssemblyAttributeAssembly\FilteredDirectoryAssemblyAttributeAssembly.csproj", "{AA695589-8CCC-4474-9A7F-01A6376C375A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FilteredDirectoryUnavailableTypesAssembly", "TestAssemblies\FilteredDirectoryUnavailableTypesAssembly\FilteredDirectoryUnavailableTypesAssembly.csproj", "{AA695589-8CCC-4474-9A7F-01A6376C375A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/ArchUnitNET/Loader/MonoCecilAttributeExtensions.cs b/ArchUnitNET/Loader/MonoCecilAttributeExtensions.cs index 389b0f7f..b6ea3009 100644 --- a/ArchUnitNET/Loader/MonoCecilAttributeExtensions.cs +++ b/ArchUnitNET/Loader/MonoCecilAttributeExtensions.cs @@ -21,9 +21,12 @@ TypeFactory typeFactory attributeTypeReference ); var attribute = attributeType.Type as Attribute; - if (attributeType.Type is UnavailableType unavailableType) + if ( + attribute == null + && (attributeType.Type is UnavailableType || attributeType.Type is Class) + ) { - attribute = new Attribute(unavailableType, null, null); + attribute = new Attribute(attributeType.Type, null, null); } if (attribute == null) { diff --git a/ArchUnitNETTests/Loader/ArchLoaderTests.cs b/ArchUnitNETTests/Loader/ArchLoaderTests.cs index 44f1ddbb..31aaacdc 100644 --- a/ArchUnitNETTests/Loader/ArchLoaderTests.cs +++ b/ArchUnitNETTests/Loader/ArchLoaderTests.cs @@ -149,7 +149,7 @@ public void UnavailableTypeTest() System.IO.SearchOption.AllDirectories ) .Build(); - Assert.Single(architecture.Types); + Assert.Equal(3, architecture.Types.Count()); var loggerType = architecture.ReferencedTypes.WhereFullNameIs("Serilog.ILogger"); Assert.NotNull(loggerType); Assert.True(loggerType is UnavailableType); diff --git a/TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/AssemblyAttribute.cs b/TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/AssemblyAttribute.cs deleted file mode 100644 index 2af89891..00000000 --- a/TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/AssemblyAttribute.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace FilteredDirectoryAssemblyAttributeAssembly; - -[AttributeUsage(AttributeTargets.Assembly)] -public class AssemblyAttribute : Attribute { } diff --git a/TestAssemblies/FilteredDirectoryLoaderTestAssembly/Class1.cs b/TestAssemblies/FilteredDirectoryLoaderTestAssembly/Class1.cs index 86785f5e..8f69b7fd 100644 --- a/TestAssemblies/FilteredDirectoryLoaderTestAssembly/Class1.cs +++ b/TestAssemblies/FilteredDirectoryLoaderTestAssembly/Class1.cs @@ -1,6 +1,7 @@ +using FilteredDirectoryUnavailableTypesAssembly; using Serilog; -[assembly: FilteredDirectoryAssemblyAttributeAssembly.AssemblyAttribute] +[assembly: Assembly] namespace FilteredDirectoryLoaderTestAssembly; @@ -13,3 +14,8 @@ public Class1() this.logger = new LoggerConfiguration().CreateLogger(); } } + +public class DerivedAttribute : BaseAttribute { } + +[Derived] +public class ClassWithDerivedAttribute { } diff --git a/TestAssemblies/FilteredDirectoryLoaderTestAssembly/FilteredDirectoryLoaderTestAssembly.csproj b/TestAssemblies/FilteredDirectoryLoaderTestAssembly/FilteredDirectoryLoaderTestAssembly.csproj index 5d621bd8..f34d6d4f 100644 --- a/TestAssemblies/FilteredDirectoryLoaderTestAssembly/FilteredDirectoryLoaderTestAssembly.csproj +++ b/TestAssemblies/FilteredDirectoryLoaderTestAssembly/FilteredDirectoryLoaderTestAssembly.csproj @@ -11,7 +11,7 @@ - + False diff --git a/TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/FilteredDirectoryAssemblyAttributeAssembly.csproj b/TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/FilteredDirectoryUnavailableTypesAssembly.csproj similarity index 75% rename from TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/FilteredDirectoryAssemblyAttributeAssembly.csproj rename to TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/FilteredDirectoryUnavailableTypesAssembly.csproj index c96ac234..066f63af 100644 --- a/TestAssemblies/FilteredDirectoryAssemblyAttributeAssembly/FilteredDirectoryAssemblyAttributeAssembly.csproj +++ b/TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/FilteredDirectoryUnavailableTypesAssembly.csproj @@ -4,5 +4,6 @@ enable enable false + FilteredDirectoryUnavailableTypesAssembly diff --git a/TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/UnavailableTypes.cs b/TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/UnavailableTypes.cs new file mode 100644 index 00000000..fe44501b --- /dev/null +++ b/TestAssemblies/FilteredDirectoryUnavailableTypesAssembly/UnavailableTypes.cs @@ -0,0 +1,7 @@ +namespace FilteredDirectoryUnavailableTypesAssembly; + +[AttributeUsage(AttributeTargets.Assembly)] +public class AssemblyAttribute : Attribute { } + +[AttributeUsage(AttributeTargets.All)] +public class BaseAttribute : Attribute { }