Exemple #1
0
        protected override void Emit(CodeTypeDeclaration ctd)
        {
            EmitEmptyCtor (ctd);

            // Parameter fields

            foreach (string name in sparams.Keys)
            EmitParameter (ctd, name);

            // ApplyDefaults

            EmitApplyDefaults (ctd);

            // Apply prologue

            CodeParameterDeclarationExpression p1 =
            new CodeParameterDeclarationExpression (ProjBuilder, "proj");
            CodeParameterDeclarationExpression p2 =
            new CodeParameterDeclarationExpression (CDH.String, "declloc");
            CodeParameterDeclarationExpression p3 =
            new CodeParameterDeclarationExpression (CDH.ILog, "log");

            CodeMemberMethod apply = new CodeMemberMethod ();
            apply.Name = "Apply";
            apply.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            apply.ReturnType = CDH.Bool;
            apply.Parameters.Add (p1);
            apply.Parameters.Add (p2);
            apply.Parameters.Add (p3);

            CDH.EmitBaseChainBool (apply);

            // Elements

            if (elts.Count > 0) {
            apply.Statements.Add (CDH.Variable (ProvBuilder, "pb"));
            apply.Statements.Add (CDH.Variable (TargBuilder, "tb"));

            CodeArgumentReferenceExpression proj = CDH.ARef ("proj");
            CodeArgumentReferenceExpression declloc = CDH.ARef ("declloc");
            CodeArgumentReferenceExpression log = CDH.ARef ("log");
            CodeVariableReferenceExpression pb = CDH.VRef ("pb");
            CodeVariableReferenceExpression tb = CDH.VRef ("tb");

            foreach (StructureElement se in elts)
            se.EmitApply (apply, proj, declloc, log, pb, tb);
            }

            // Apply epilogue

            apply.Statements.Add (new CodeMethodReturnStatement (CDH.False));
            ctd.Members.Add (apply);
        }
Exemple #2
0
        void EmitApplyDefaults(CodeTypeDeclaration ctd)
        {
            CodeMemberMethod meth = new CodeMemberMethod ();
            meth.Name = "ApplyDefaults";
            meth.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            meth.ReturnType = CDH.Bool;
            meth.Parameters.Add (CDH.Param (BMBase, "bmb"));
            meth.Parameters.Add (CDH.Param (CDH.ILog, "log"));

            CodeArgumentReferenceExpression bmb = CDH.ARef ("bmb");
            CodeArgumentReferenceExpression log = CDH.ARef ("log");

            // Set the parameters

            foreach (string param in sparams.Keys) {
            StructureParameterKind kind = sparams[param];
            string val = defaults[param];

            CodeAssignStatement assg = new CodeAssignStatement ();
            assg.Left = CDH.ThisDot (param);

            switch (kind) {
            case StructureParameterKind.Basis:
            if (val[val.Length - 1] != '/')
            // Canonicalize basis names.
            val += '/';
            goto case StructureParameterKind.Target;
            case StructureParameterKind.Target:
            assg.Right = new CodePrimitiveExpression (val);
            break;
            case StructureParameterKind.Structure:
            CodeMethodInvokeExpression mie = new CodeMethodInvokeExpression ();
            mie.Method = new CodeMethodReferenceExpression (bmb, "GetNamespaceTemplate");
            mie.Parameters.Add (new CodePrimitiveExpression (val));
            mie.Parameters.Add (log);
            UserType stype = structtypes[param];
            assg.Right = new CodeCastExpression (stype.AsCodeDom, mie);
            break;
            }

            meth.Statements.Add (assg);

            if (kind == StructureParameterKind.Structure)
            meth.Statements.Add (CDH.IfNullReturnTrue (assg.Left));
            }

            // All done.

            meth.Statements.Add (new CodeMethodReturnStatement (CDH.False));

            ctd.Members.Add (meth);
        }
Exemple #3
0
        protected override void Emit(CodeTypeDeclaration ctd)
        {
            EmitAttribute(ctd);

            // Constructor

            CodeConstructor ctor = EmitEmptyCtor(ctd);

            ctor.Parameters.Add(CDH.Param(NS.ParamsType, "stmpl"));
            ctor.BaseConstructorArgs.Add(CDH.ARef("stmpl"));

            // Matcher attr

            CodeAttributeDeclaration kattr =
                new CodeAttributeDeclaration("Mono.Build.Bundling.MatcherAttribute");

            kattr.Arguments.Add(new CodeAttributeArgument(KindExpression));
            ctd.CustomAttributes.Add(kattr);

            // GetRegex override

            CodeMemberMethod method = new CodeMemberMethod();

            method.Name = "GetRegex";
            //method.Attributes = MemberAttributes.Family | MemberAttributes.Override;
            method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            method.ReturnType = CDH.String;
            method.LinePragma = Location;

            CodeExpression val = new CodePrimitiveExpression(Regex);
            CodeStatement  ret = new CodeMethodReturnStatement(val);

            ret.LinePragma = Location;
            method.Statements.Add(ret);
            ctd.Members.Add(method);

            // GetMatchType override

            method      = new CodeMemberMethod();
            method.Name = "GetMatchType";
            //method.Attributes = MemberAttributes.Family | MemberAttributes.Override;
            method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
            method.ReturnType = CDH.Type;
            method.LinePragma = Location;

            val            = new CodeTypeOfExpression(MatchType.AsCodeDom);
            ret            = new CodeMethodReturnStatement(val);
            ret.LinePragma = Location;
            method.Statements.Add(ret);
            ctd.Members.Add(method);
        }
Exemple #4
0
        CodeConstructor EmitConstructor(CodeTypeDeclaration ctd)
        {
            // The ctor that inits the field and chains to the parent if necc.

            CodeConstructor ctor = EmitEmptyCtor(ctd);
            CodeArgumentReferenceExpression stmpl = CDH.ARef("stmpl");

            ctor.Parameters.Add(CDH.Param(NS.ParamsType, "stmpl"));

            if (UsesStructure)
            {
                CodeAssignStatement assg = new CodeAssignStatement();
                assg.Left  = CDH.ThisDot("stmpl");
                assg.Right = stmpl;
                ctor.Statements.Add(assg);
            }

            ctor.BaseConstructorArgs.Add(ContextualStructRef(basestruct, stmpl));
            return(ctor);
        }
Exemple #5
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);
        }