public ICallableType GetCallableType(CallableSignature signature) { AnonymousCallableType type = GetCachedCallableType(signature); if (type == null) { type = new AnonymousCallableType(TypeSystemServices, signature); _cache.Add(signature, type); } return type; }
private IType CreateConcreteCallableType(Node sourceNode, AnonymousCallableType anonymousType) { var module = TypeSystemServices.GetCompilerGeneratedTypesModule(); var name = GenerateCallableTypeNameFrom(sourceNode, module); ClassDefinition cd = My<CallableTypeBuilder>.Instance.CreateEmptyCallableDefinition(name); cd.Annotate(AnonymousCallableTypeAnnotation); cd.Modifiers |= TypeMemberModifiers.Public; cd.LexicalInfo = sourceNode.LexicalInfo; cd.Members.Add(CreateInvokeMethod(anonymousType)); Method beginInvoke = CreateBeginInvokeMethod(anonymousType); cd.Members.Add(beginInvoke); cd.Members.Add(CreateEndInvokeMethod(anonymousType)); AddGenericTypes(cd); module.Members.Add(cd); return (IType)cd.Entity; }
public IType GetConcreteCallableType(Node sourceNode, AnonymousCallableType anonymousType) { return anonymousType.ConcreteType ?? (anonymousType.ConcreteType = CreateConcreteCallableType(sourceNode, anonymousType)); }
Method CreateInvokeMethod(AnonymousCallableType anonymousType) { CallableSignature signature = anonymousType.GetSignature(); return CodeBuilder.CreateRuntimeMethod("Invoke", signature.ReturnType, signature.Parameters, signature.AcceptVarArgs); }