Boo.Lang.Compiler.Steps.ImplementICallableOnCallableDefinitions.ImplementRegularICallableCall C# (CSharp) Méthode

ImplementRegularICallableCall() private méthode

private ImplementRegularICallableCall ( Method call, InternalCallableType type, ClassDefinition node, CallableSignature signature ) : void
call Boo.Lang.Compiler.Ast.Method
type Boo.Lang.Compiler.TypeSystem.InternalCallableType
node Boo.Lang.Compiler.Ast.ClassDefinition
signature Boo.Lang.Compiler.TypeSystem.CallableSignature
Résultat void
        void ImplementRegularICallableCall(
            Method call,
            InternalCallableType type,
            ClassDefinition node,
            CallableSignature signature)
        {
            MethodInvocationExpression mie = CreateInvokeInvocation(type);
            IParameter[] parameters = signature.Parameters;
            int fixedParametersLength = signature.AcceptVarArgs ? parameters.Length - 1 : parameters.Length;
            for (int i=0; i<fixedParametersLength; ++i)
            {
                SlicingExpression slice = CodeBuilder.CreateSlicing(
                            CodeBuilder.CreateReference(call.Parameters[0]),
                            i);
                mie.Arguments.Add(slice);
            }

            if (signature.AcceptVarArgs)
            {
                if (parameters.Length == 1)
                {
                    mie.Arguments.Add(CodeBuilder.CreateReference(call.Parameters[0]));
                }
                else
                {
                    mie.Arguments.Add(
                        CodeBuilder.CreateMethodInvocation(
                            RuntimeServices_GetRange1,
                            CodeBuilder.CreateReference(call.Parameters[0]),
                            CodeBuilder.CreateIntegerLiteral(fixedParametersLength)));
                }
            }

            if (TypeSystemServices.VoidType == signature.ReturnType)
            {
                call.Body.Add(mie);
            }
            else
            {
                call.Body.Add(new ReturnStatement(mie));
            }
        }