From 1cfa42f686781daf3fbaceddfe319523bf22e4b5 Mon Sep 17 00:00:00 2001 From: Optano-Dev <69143350+Optano-Dev@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:02:58 +0200 Subject: [PATCH] fix: Refine iterator and async method body scanning Instead of resolving the first newobj instruction, search all newobj instructions for the first type that actually declares a MoveNext method. This prevents picking up an unrelated compiler-generated object. Fixes #280 Signed-off-by: Optano-Dev <69143350+Optano-Dev@users.noreply.github.com> --- ArchUnitNET/Loader/TypeProcessor.cs | 30 ++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/ArchUnitNET/Loader/TypeProcessor.cs b/ArchUnitNET/Loader/TypeProcessor.cs index e04e658b..c765cdd8 100644 --- a/ArchUnitNET/Loader/TypeProcessor.cs +++ b/ArchUnitNET/Loader/TypeProcessor.cs @@ -864,9 +864,20 @@ private static void HandleIterator( DomainResolver domainResolver ) { - var compilerGeneratedGeneratorObject = ( - (MethodReference)methodBody.Instructions.First(inst => inst.IsNewObjectOp()).Operand - ).DeclaringType.Resolve(); + var compilerGeneratedGeneratorObject = methodBody + .Instructions.Where(inst => inst.IsNewObjectOp()) + .Select(inst => ((MethodReference)inst.Operand).DeclaringType.Resolve()) + .FirstOrDefault(type => + type != null + && type.Methods.Any(method => method.Name == nameof(IEnumerator.MoveNext)) + ); + + if (compilerGeneratedGeneratorObject == null) + { + methodDefinition = methodBody.Method; + return; + } + methodDefinition = compilerGeneratedGeneratorObject.Methods.First(method => method.Name == nameof(IEnumerator.MoveNext) ); @@ -898,10 +909,15 @@ private static void HandleAsync( DomainResolver domainResolver ) { - var compilerGeneratedGeneratorObject = ( - (MethodReference) - methodBody.Instructions.FirstOrDefault(inst => inst.IsNewObjectOp())?.Operand - )?.DeclaringType.Resolve(); + var compilerGeneratedGeneratorObject = methodBody + .Instructions.Where(inst => inst.IsNewObjectOp()) + .Select(inst => ((MethodReference)inst.Operand).DeclaringType.Resolve()) + .FirstOrDefault(type => + type != null + && type.Methods.Any(method => + method.Name == nameof(IAsyncStateMachine.MoveNext) + ) + ); if (compilerGeneratedGeneratorObject == null) {