internal static bool IsCompilerGeneratorEnumerator(this MethodDeclaration methodDeclaration, ref Lambda.Method methodBlock) { var methodDefinition = methodDeclaration.Annotation <MethodDefinition>(); var candidateNewObj = methodDefinition.Body.Instructions[1]; if (candidateNewObj.OpCode.Equals(OpCodes.Newobj)) { var memberReference = candidateNewObj.Operand as Mono.Cecil.MethodReference; if (memberReference != null) { var constructorInfo = memberReference.GetActualMethod <ConstructorInfo>(); if (constructorInfo != null && constructorInfo.DeclaringType.IsCompilerGenerated() && IsEnumerator(methodDefinition)) { Instruction initializer = methodDefinition.Body.Instructions[0]; methodBlock = new Lambda.CompilerGeneratedEnumerator(initializer, candidateNewObj); return(true); } } } return(false); }
protected internal Expression VisitCompilerGeneratedEnumerator(CompilerGeneratedEnumerator enumerator) { return enumerator.Update(enumerator.Enumerator); }