void MakeExplicitParameterTypeInference(LambdaResolveResult e, IType t) { // C# 4.0 spec: §7.5.2.7 Explicit parameter type inferences if (e.IsImplicitlyTyped || !e.HasParameterList) return; Log.WriteLine(" MakeExplicitParameterTypeInference from " + e + " to " + t); IMethod m = GetDelegateOrExpressionTreeSignature(t); if (m == null) return; for (int i = 0; i < e.Parameters.Count && i < m.Parameters.Count; i++) { MakeExactInference(e.Parameters[i].Type, m.Parameters[i].Type); } }
static MethodDeclaration GetMethod(RefactoringContext context, LambdaResolveResult lambda, BlockStatement body, bool noReturnValue = false) { var method = new MethodDeclaration { Name = "Method" }; if (noReturnValue) { method.ReturnType = new PrimitiveType ("void"); } else { var type = lambda.GetInferredReturnType (lambda.Parameters.Select (p => p.Type).ToArray ()); method.ReturnType = type.Name == "?" ? new PrimitiveType ("void") : context.CreateShortType (type); } foreach (var param in lambda.Parameters) method.Parameters.Add (new ParameterDeclaration (context.CreateShortType (param.Type), param.Name)); method.Body = body; if (lambda.IsAsync) method.Modifiers |= Modifiers.Async; return method; }