Expression CreateDelegate(IType type, Expression source) { var method = (IMethod)GetEntity(source); Expression target = method.IsStatic ? CodeBuilder.CreateNullLiteral() : ((MemberReferenceExpression)source).Target; var cType = GetConcreteType(type) ?? TypeSystemServices.GetConcreteCallableType(source, (AnonymousCallableType)type); return(CodeBuilder.CreateConstructorInvocation(cType.GetConstructors().First(), target, CodeBuilder.CreateAddressOfExpression(method))); }
override public void LeaveCallableTypeReference(CallableTypeReference node) { IParameter[] parameters = new IParameter[node.Parameters.Count]; for (int i = 0; i < parameters.Length; ++i) { parameters[i] = new InternalParameter(node.Parameters[i], i); } IType returnType = null; if (null != node.ReturnType) { returnType = GetType(node.ReturnType); } else { returnType = TypeSystemServices.VoidType; } node.Entity = TypeSystemServices.GetConcreteCallableType(node, new CallableSignature(parameters, returnType)); }
override public void LeaveCallableTypeReference(CallableTypeReference node) { node.Entity = TypeSystemServices.GetConcreteCallableType(node, CallableSignatureFor(node)); }