From db0110627420afe943ea667dcd25239e365d1fb6 Mon Sep 17 00:00:00 2001 From: Manuel Walz Date: Mon, 1 Sep 2025 16:30:43 +0200 Subject: [PATCH] Fix assignment of MemberGenericArguments to revert assignment changes from commit f80d9aa4 Signed-off-by: Manuel Walz --- .../Dependencies/MethodCallDependency.cs | 3 +- .../Members/MethodCallDependencyTests.cs | 102 ++++++++++++++++++ .../Members/MethodDependencyTestBuild.cs | 71 +++++++++++- 3 files changed, 170 insertions(+), 6 deletions(-) diff --git a/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs b/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs index e8a205997..49e905107 100644 --- a/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using ArchUnitNET.Loader; namespace ArchUnitNET.Domain.Dependencies { @@ -9,7 +8,7 @@ public MethodCallDependency(IMember originMember, MethodMemberInstance calledMet : base(originMember, calledMethodInstance) { TargetMember = calledMethodInstance.Member; - TargetMemberGenericArguments = calledMethodInstance.GenericArguments; + TargetMemberGenericArguments = calledMethodInstance.MemberGenericArguments; } public IMember TargetMember { get; } diff --git a/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs index 36498dfb7..b6b1c7796 100644 --- a/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs @@ -33,6 +33,44 @@ public MethodCallDependencyTests() .FirstOrDefault(); } + [Fact] + public void UsesMemberGenericArguments() + { + var architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture; + var originClass = architecture.GetClassOfType( + typeof(ClassWithMethodWithGenericMethodArguments) + ); + var originMember = originClass + .GetMembersWithName( + nameof(ClassWithMethodWithGenericMethodArguments.Method).BuildMethodMemberName() + ) + .Single(); + var targetClass = architecture.GetClassOfType(typeof(ClassWithGenericMethodArguments)); + var targetMember = targetClass + .GetMethodMembersWithName( + nameof(ClassWithGenericMethodArguments.Method).BuildMethodMemberName() + ) + .Single(); + var memberGenericArgument = new GenericArgument( + new TypeInstance( + architecture.GetClassOfType(typeof(ClassForGenericArgument)) + ) + ); + var methodCallDependency = new MethodCallDependency( + targetMember, + new MethodMemberInstance( + targetMember, + Enumerable.Empty(), + [memberGenericArgument] + ) + ); + + Assert.Contains( + memberGenericArgument, + methodCallDependency.TargetMemberGenericArguments + ); + } + [Theory] [ClassData(typeof(MethodDependencyTestBuild.ConstructorTestData))] public void ConstructorsAddedToClass(Class classWithConstructors) @@ -68,6 +106,42 @@ MethodCallDependency expectedDependency Assert.True(originMember.HasMemberDependency(expectedDependency)); Assert.Contains(expectedDependency, originMember.GetMethodCallDependencies()); } + + [Theory] + [ClassData( + typeof(MethodDependencyTestBuild.MethodCallGenericConstructorArgumentsDependencyTestData) + )] + public void MethodCallGenericConstructorArgumentDependenciesAreFound( + IMember originMember, + MethodCallDependency expectedDependency + ) + { + Assert.Contains( + originMember.GetMethodCallDependencies(), + methodCallDependency => + methodCallDependency.TargetGenericArguments.SequenceEqual( + expectedDependency.TargetGenericArguments + ) + ); + } + + [Theory] + [ClassData( + typeof(MethodDependencyTestBuild.MethodCallGenericMethodArgumentsDependencyTestData) + )] + public void MethodCallGenericMethodArgumentDependenciesAreFound( + IMember originMember, + MethodCallDependency expectedDependency + ) + { + Assert.Contains( + originMember.GetMethodCallDependencies(), + methodCallDependency => + methodCallDependency.TargetMemberGenericArguments.SequenceEqual( + expectedDependency.TargetMemberGenericArguments + ) + ); + } } public class ClassWithMethodA @@ -99,6 +173,34 @@ public static async void MethodAAsync() } } + public class ClassWithMethodWithGenericConstructorArguments + { + public static void Method() + { + var classForGenericArguments = + new ClassWithGenericConstructorArguments(); + } + } + + // ReSharper disable once UnusedTypeParameter + public class ClassWithGenericConstructorArguments; + + public class ClassWithMethodWithGenericMethodArguments + { + public static void Method() + { + ClassWithGenericMethodArguments.Method(); + } + } + + public class ClassWithGenericMethodArguments + { + // ReSharper disable once UnusedTypeParameter + public static void Method() { } + } + + public class ClassForGenericArgument; + public class ClassWithConstructors { private FieldType _fieldTest; diff --git a/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs index b17fc7a44..60cdc7282 100644 --- a/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs @@ -4,8 +4,8 @@ using ArchUnitNET.Domain; using ArchUnitNET.Domain.Dependencies; using ArchUnitNET.Domain.Extensions; -using ArchUnitNET.Loader; using ArchUnitNETTests.Fluent.Extensions; +using JetBrains.Annotations; using Type = System.Type; namespace ArchUnitNETTests.Domain.Dependencies.Members @@ -19,7 +19,9 @@ private static object[] BuildMethodCallDependencyTestData( Type originType, string nameOfOriginMember, Type targetType, - string nameOfTargetMember + string nameOfTargetMember, + [CanBeNull] IEnumerable declaringGenericArgumentsTypes = null, + [CanBeNull] IEnumerable memberGenericArgumentsTypes = null ) { var originClass = Architecture.GetClassOfType(originType); @@ -30,13 +32,22 @@ string nameOfTargetMember originMember, new MethodMemberInstance( targetMember, - Enumerable.Empty(), - Enumerable.Empty() + CreateGenericArguments(declaringGenericArgumentsTypes ?? []), + CreateGenericArguments(memberGenericArgumentsTypes ?? []) ) ); return new object[] { originMember, expectedDependency }; } + private static IEnumerable CreateGenericArguments( + IEnumerable classTypes + ) + { + return classTypes + .Select(x => Architecture.GetClassOfType(x)) + .Select(x => new GenericArgument(new TypeInstance(x))); + } + private static object[] BuildMethodSignatureDependencyTestData( Type originType, string nameOfOriginMember, @@ -171,6 +182,58 @@ IEnumerator IEnumerable.GetEnumerator() } } + public class MethodCallGenericConstructorArgumentsDependencyTestData : IEnumerable + { + private readonly List _methodCallDependencyData = new List + { + BuildMethodCallDependencyTestData( + typeof(ClassWithMethodWithGenericConstructorArguments), + nameof(ClassWithMethodWithGenericConstructorArguments.Method) + .BuildMethodMemberName(), + typeof(ClassWithGenericConstructorArguments<>), + StaticConstants.ConstructorNameBase.BuildMethodMemberName(), + [typeof(ClassForGenericArgument)], + [] + ), + }; + + public IEnumerator GetEnumerator() + { + return _methodCallDependencyData.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + public class MethodCallGenericMethodArgumentsDependencyTestData : IEnumerable + { + private readonly List _methodCallDependencyData = new List + { + BuildMethodCallDependencyTestData( + typeof(ClassWithMethodWithGenericMethodArguments), + nameof(ClassWithMethodWithGenericMethodArguments.Method) + .BuildMethodMemberName(), + typeof(ClassWithGenericMethodArguments), + nameof(ClassWithGenericMethodArguments.Method).BuildMethodMemberName(), + [], + [typeof(ClassForGenericArgument)] + ), + }; + + public IEnumerator GetEnumerator() + { + return _methodCallDependencyData.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + public class ConstructorTestData : IEnumerable { private readonly List _methodCallDependencyData = new List