Boo.Lang.Compiler.TypeSystem.AnonymousCallablesManager.CreateBeginInvokeExtension C# (CSharp) Method

CreateBeginInvokeExtension() private method

private CreateBeginInvokeExtension ( ICallableType anonymousType, Method beginInvoke, MethodInvocationExpression &mie ) : Method
anonymousType ICallableType
beginInvoke Boo.Lang.Compiler.Ast.Method
mie Boo.Lang.Compiler.Ast.MethodInvocationExpression
return Boo.Lang.Compiler.Ast.Method
        Method CreateBeginInvokeExtension(ICallableType anonymousType, Method beginInvoke, out MethodInvocationExpression mie)
        {
            InternalMethod beginInvokeEntity = (InternalMethod)beginInvoke.Entity;

            Method extension = CodeBuilder.CreateMethod("BeginInvoke", TypeSystemServices.Map(typeof(IAsyncResult)),
                                        TypeMemberModifiers.Public | TypeMemberModifiers.Static);
            extension.Attributes.Add(CodeBuilder.CreateAttribute(Types.BooExtensionAttribute));
            if (MetadataUtil.HasClrExtensions())
            {
                extension.Attributes.Add(CodeBuilder.CreateAttribute(Types.ClrExtensionAttribute));
            }

            ParameterDeclaration self = CodeBuilder.CreateParameterDeclaration(0, "self", beginInvokeEntity.DeclaringType);

            extension.Parameters.Add(self);
            CodeBuilder.DeclareParameters(extension, anonymousType.GetSignature().Parameters, 1);

            mie = CodeBuilder.CreateMethodInvocation(
                        CodeBuilder.CreateReference(self),
                        beginInvokeEntity);

            ParameterDeclarationCollection parameters = extension.Parameters;
            for (int i = 1; i < parameters.Count; ++i)
            {
                mie.Arguments.Add(CodeBuilder.CreateReference(parameters[i]));
            }
            extension.Body.Add(new ReturnStatement(mie));
            return extension;
        }