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)); } }