Exemplo n.º 1
0
        protected CodeConstructor EmitTemplate(CodeTypeDeclaration ctd)
        {
            EmitAttribute(ctd);

            // A(n optional) field pointing to our bound structure

            if (UsesStructure)
            {
                CodeMemberField f = new CodeMemberField();
                f.Name       = "stmpl";
                f.Attributes = MemberAttributes.Private;
                f.Type       = NS.ParamsType.AsCodeDom;
                ctd.Members.Add(f);
            }

            // The template apply method.

            CodeMemberMethod meth = new CodeMemberMethod();

            meth.Name       = "ApplyTemplate";
            meth.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            meth.ReturnType = null;
            meth.Parameters.Add(CDH.Param(typeof(TargetBuilder), "tb"));

            CDH.EmitBaseChainVoid(meth);

            CodeVariableReferenceExpression tb = CDH.VRef("tb");

            if (UsesStructure)
            {
                info.Converter = delegate(string val) {
                    return(NS.MakeTargetNameExpr(val, CDH.ThisDot("stmpl"), null));
                };
            }

            info.EmitInfo(meth, tb);
            ctd.Members.Add(meth);

            // Constructor

            return(EmitConstructor(ctd));
        }
Exemplo n.º 2
0
        void EmitArguments(CodeTypeDeclaration cur_type)
        {
            CodeMemberMethod list, fetch, clear;
            CodeVariableReferenceExpression sink, source;

            // ListArguments prologue

            list            = new CodeMemberMethod();
            list.Name       = "ListArguments";
            list.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            list.ReturnType = null;
            list.Parameters.Add(CDH.Param(ArgInfoSink, "sink"));

            CDH.EmitBaseChainVoid(list);

            sink = CDH.VRef("sink");

            // FetchArgValues prologue

            fetch            = new CodeMemberMethod();
            fetch.Name       = "FetchArgValues";
            fetch.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            fetch.ReturnType = null;
            fetch.Parameters.Add(CDH.Param(ArgValueSource, "source"));

            CDH.EmitBaseChainVoid(fetch);

            source = new CodeVariableReferenceExpression("source");

            // ClearArgValues prologue

            clear            = new CodeMemberMethod();
            clear.Name       = "ClearArgValues";
            clear.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            clear.ReturnType = null;

            CDH.EmitBaseChainVoid(clear);

            // Per-arg statements

            if (target_arg_name != null)
            {
                EmitTargetArg(list, sink, fetch, source, clear, cur_type);
            }

            if (arguments.Count > 0)
            {
                list.Statements.Add(BaseNumArgs);
                fetch.Statements.Add(BaseNumArgs);
            }

            for (int i = 0; i < arguments.Count; i++)
            {
                arguments[i].EmitStatements(list, sink, fetch, source, clear);
                arguments[i].EmitField(cur_type);
            }

            // No epilogues.

            cur_type.Members.Add(list);
            cur_type.Members.Add(fetch);
            cur_type.Members.Add(clear);

            // NumArguments property override

            CodeMemberProperty p = new CodeMemberProperty();

            p.Name       = "NumArguments";
            p.HasGet     = true;
            p.HasSet     = false;
            p.Type       = new CodeTypeReference(typeof(int));
            p.Attributes = MemberAttributes.Public | MemberAttributes.Override;

            CodeBinaryOperatorExpression add = new CodeBinaryOperatorExpression();

            add.Left     = new CodePropertyReferenceExpression(CDH.Base, "NumArguments");
            add.Operator = CodeBinaryOperatorType.Add;
            add.Right    = new CodePrimitiveExpression(arguments.Count);

            p.GetStatements.Add(new CodeMethodReturnStatement(add));

            cur_type.Members.Add(p);
        }
Exemplo n.º 3
0
        void EmitAsComposite(CodeTypeDeclaration ctd)
        {
            if (fields.Count == 0)
            {
                return;
            }

            if (comp_default_idx >= 0)
            {
                EmitDefault(ctd);
            }

            // Prologues - TotalItems field

            CodeMemberProperty ti = new CodeMemberProperty();

            ti.Name       = "TotalItems";
            ti.HasGet     = true;
            ti.HasSet     = false;
            ti.Type       = new CodeTypeReference(typeof(int));
            ti.Attributes = MemberAttributes.Family | MemberAttributes.Override;

            CodeBinaryOperatorExpression add = new CodeBinaryOperatorExpression();

            add.Left     = new CodePropertyReferenceExpression(CDH.Base, "TotalItems");
            add.Operator = CodeBinaryOperatorType.Add;
            add.Right    = new CodePrimitiveExpression(fields.Count);

            CodeStatement ret = new CodeMethodReturnStatement(add);

            ti.GetStatements.Add(ret);

            ctd.Members.Add(ti);

            // Prologues - CopyItems

            CodeParameterDeclarationExpression p = CDH.Param(new CodeTypeReference(CDH.Result, 1), "r");

            CodeMemberMethod copy = new CodeMemberMethod();

            copy.Name       = "CopyItems";
            copy.ReturnType = null;
            copy.Parameters.Add(p);
            copy.Attributes = MemberAttributes.Family | MemberAttributes.Override;

            CDH.EmitBaseChainVoid(copy);

            CodeExpression copyarray = new CodeArgumentReferenceExpression(p.Name);

            copy.Statements.Add(BaseTotalItems);

            // Prologues - CloneTo method

            p = CDH.Param(CDH.Result, "r");

            CodeMemberMethod clone = new CodeMemberMethod();

            clone.Name       = "CloneTo";
            clone.ReturnType = null;
            clone.Parameters.Add(p);
            clone.Attributes = MemberAttributes.Family | MemberAttributes.Override;

            CDH.EmitBaseChainVoid(clone);

            CodeExpression cp = CDH.ARef(p.Name);

            CodeVariableDeclarationStatement vds = new CodeVariableDeclarationStatement();

            vds.Name           = "other";
            vds.Type           = new CodeTypeReference(ctd.Name);
            vds.InitExpression = new CodeCastExpression(vds.Type, cp);

            clone.Statements.Add(vds);
            CodeExpression other = CDH.VRef(vds.Name);

            // Now per-field statements

            foreach (FieldInfo fi in fields)
            {
                fi.Emit(ctd, copy, copyarray, clone, other);
            }

            // no epilogues.

            ctd.Members.Add(copy);
            ctd.Members.Add(clone);
        }