Exemple #1
0
        public override void EmitApply(CodeMemberMethod apply, CodeArgumentReferenceExpression proj,
                                       CodeArgumentReferenceExpression declloc,
                                       CodeArgumentReferenceExpression log,
                                       CodeVariableReferenceExpression pb,
                                       CodeVariableReferenceExpression tb)
        {
            apply.Statements.Add(new CodeCommentStatement("Create provider for param " +
                                                          basisparam));

            CodeMethodInvokeExpression mie = new CodeMethodInvokeExpression();

            mie.Method = new CodeMethodReferenceExpression(proj, "EnsureProvider");
            mie.Parameters.Add(new CodeFieldReferenceExpression(CDH.This, basisparam));
            mie.Parameters.Add(declloc);

            apply.Statements.Add(new CodeAssignStatement(pb, mie));

            // Tell the PB about our Structure arguments so it can
            // use them to instantiate the objects we reference.
            // FIXME: catch if the provider references a rule or template
            // that requires a structure we don't have.

            //if (Structure != null) {
            mie        = new CodeMethodInvokeExpression();
            mie.Method = new CodeMethodReferenceExpression(pb, "AddContextStructure");
            mie.Parameters.Add(CDH.This);
            apply.Statements.Add(mie);

            foreach (string param in Structure.Parameters)
            {
                if (Structure[param] != StructureParameterKind.Structure)
                {
                    continue;
                }

                mie        = new CodeMethodInvokeExpression();
                mie.Method = new CodeMethodReferenceExpression(pb, "AddContextStructure");
                mie.Parameters.Add(new CodeFieldReferenceExpression(CDH.This, param));
                apply.Statements.Add(mie);
            }
            //}

            foreach (BGTargetBuilder iter in targs)
            {
                iter.EmitApply(apply, pb, tb, log);
            }

            foreach (string key in lits.Keys)
            {
                CodeExpression val = CDH.ResultExpression(lits[key]);

                CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression();
                cmie.Method = new CodeMethodReferenceExpression(pb, "DefineConstantTarget");
                cmie.Parameters.Add(new CodePrimitiveExpression(key));
                cmie.Parameters.Add(val);
                cmie.Parameters.Add(log);

                apply.Statements.Add(CDH.IfTrueReturnTrue(cmie));
            }
        }