예제 #1
0
        private List <CilSigArg> CompleteSigArgs(CilInstructionMethod instruction, CilMethod method)
        {
            var isInstanceCall = instruction.CallConv.IsInstance;

            var instanceSigArg = new CilSigArg
            {
                Id   = ".this",
                Type = instruction.TypeSpec.GetCilType(_program)
            };

            var result = isInstanceCall ?
                         (new List <CilSigArg> {
                instanceSigArg
            }).Concat(instruction.SigArgs).ToList() :
                         instruction.SigArgs;

            var start = isInstanceCall ? 1 : 0;

            for (int i = start; i < result.Count; i++)
            {
                result[i].Id = isInstanceCall ? method.Arguments[i - 1].Id : method.Arguments[i].Id;
            }

            return(result);
        }
예제 #2
0
        public override void Init(AstContext context, ParseTreeNode parseNode)
        {
            // paramAttr + type
            var children2 = AstChildren.Empty()
                            .Add <ParamAttrAstNode>()
                            .Add <TypeAstNode>();

            if (children2.PopulateWith(parseNode))
            {
                SigArg = new CilSigArg
                {
                    Type = children2.Child2.Type
                };

                return;
            }

            // paramAttr + type + id
            var idChildren = AstChildren.Empty()
                             .Add <ParamAttrAstNode>()
                             .Add <TypeAstNode>()
                             .Add <IdAstNode>();

            if (idChildren.PopulateWith(parseNode))
            {
                SigArg = new CilSigArg
                {
                    Type = idChildren.Child2.Type,
                    Id   = idChildren.Child3.Value
                };

                return;
            }

            throw new NotImplementedException();
        }