void EmitTargetArg(CodeMemberMethod list, CodeVariableReferenceExpression sink, CodeMemberMethod fetch, CodeVariableReferenceExpression source, CodeMemberMethod clear, CodeTypeDeclaration cur_type) { // Field definition expression CodeMemberField fieldmem = new CodeMemberField(CDH.String, target_arg_name); fieldmem.Attributes = MemberAttributes.Family; cur_type.Members.Add(fieldmem); CodeFieldReferenceExpression fieldref = CDH.ThisDot(target_arg_name); // ListArguments CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression(); invoke.Method = new CodeMethodReferenceExpression(sink, "WantTargetName"); invoke.Parameters.Add(new CodePrimitiveExpression(target_arg_reqd)); list.Statements.Add(invoke); // FetchArgValues invoke = new CodeMethodInvokeExpression(); invoke.Method = new CodeMethodReferenceExpression(source, "GetTargetName"); CodeAssignStatement assg = new CodeAssignStatement(fieldref, invoke); fetch.Statements.Add(assg); // ClearArgValues assg = new CodeAssignStatement(fieldref, CDH.Null); clear.Statements.Add(assg); }
void EmitDefault(CodeTypeDeclaration ctd) { // Override the HasDefault property CodeMemberProperty p = new CodeMemberProperty(); p.Name = "HasDefault"; p.Attributes = MemberAttributes.Public | MemberAttributes.Override; p.Type = new CodeTypeReference(typeof(bool)); p.HasGet = true; p.HasSet = false; p.GetStatements.Add(new CodeMethodReturnStatement(CDH.True)); ctd.Members.Add(p); // Override the Default property p = new CodeMemberProperty(); p.Name = "Default"; p.Attributes = MemberAttributes.Public | MemberAttributes.Override; p.Type = CDH.Result; p.HasGet = true; p.HasSet = false; CodeExpression e = CDH.ThisDot(fields[comp_default_idx].Name); p.GetStatements.Add(new CodeMethodReturnStatement(e)); ctd.Members.Add(p); }
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); }
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)); }
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); }
public void Emit(CodeTypeDeclaration ctd, CodeMemberMethod copy, CodeExpression copyarray, CodeMemberMethod clone, CodeExpression other) { // The field itself CodeMemberField f = new CodeMemberField(); f.Name = Name; f.Attributes = MemberAttributes.Public; f.LinePragma = Line; f.Type = Type.AsCodeDom; f.CustomAttributes.Add(FieldAttr); ctd.Members.Add(f); // Copy statement in CopyItems CodeIndexerExpression index = new CodeIndexerExpression(); index.TargetObject = copyarray; index.Indices.Add(ResultBuilder.BasePlusN(Idx)); CodeFieldReferenceExpression fld = CDH.ThisDot(Name); CodeMethodInvokeExpression conv = new CodeMethodInvokeExpression(CDH.This, "FieldAsResult", new CodeExpression[] { fld }); CodeAssignStatement assg = new CodeAssignStatement(index, conv); copy.Statements.Add(assg); // Add statement to clone result in CloneItems CodeFieldReferenceExpression lhs = new CodeFieldReferenceExpression(other, Name); conv = new CodeMethodInvokeExpression(CDH.This, "CloneField", new CodeExpression[] { fld }); assg = new CodeAssignStatement(lhs, new CodeCastExpression(f.Type, conv)); clone.Statements.Add(assg); }
protected override void Emit(CodeTypeDeclaration type) { type.CustomAttributes.Add(new CodeAttributeDeclaration("System.Serializable")); // Initialized constructor CodeFieldReferenceExpression left = CDH.ThisDot("Value"); CodeConstructor ctor = EmitEmptyCtor(type); ctor.Parameters.Add(CDH.Param(etype, "init")); ctor.Statements.Add(new CodeAssignStatement(left, CDH.VRef("init"))); // Default constructor. ctor = EmitEmptyCtor(type); CodeTypeReferenceExpression tre = new CodeTypeReferenceExpression(etype.AsCodeDom); CodeFieldReferenceExpression right = new CodeFieldReferenceExpression(tre, DefaultName); ctor.Statements.Add(new CodeAssignStatement(left, right)); }
public void EmitStatements(CodeMemberMethod list, CodeVariableReferenceExpression sink, CodeMemberMethod fetch, CodeVariableReferenceExpression source, CodeMemberMethod clear) { CodeExpression idexpr = RuleBuilder.BasePlusN(Idx); // List CodeMethodInvokeExpression invoke = CDH.AddBareInvoke(list, sink, "AddArg"); invoke.Parameters.Add(idexpr); invoke.Parameters.Add(new CodePrimitiveExpression(Name)); invoke.Parameters.Add(new CodeTypeOfExpression(arg_class.AsCodeDom)); invoke.Parameters.Add(Flags); // Fetch invoke = new CodeMethodInvokeExpression(); invoke.Method = new CodeMethodReferenceExpression(source, "GetArgValue"); invoke.Parameters.Add(idexpr); CodeMethodReferenceExpression mref = new CodeMethodReferenceExpression(); mref.TargetObject = TRERule; if (conv == RuleArgConversion.None) { switch (Count) { case ArgCount.OneOrMore: goto case ArgCount.ZeroOrMore; case ArgCount.ZeroOrMore: mref.MethodName = "AsArray"; mref.TypeArguments.Add(Type.AsCodeDom); break; case ArgCount.Optional: mref.MethodName = "AsOptional"; mref.TypeArguments.Add(Type.AsCodeDom); break; case ArgCount.Standard: mref.MethodName = "AsSingle"; mref.TypeArguments.Add(Type.AsCodeDom); break; } } else { mref.TypeArguments.Add(Type.AsCodeDom); mref.TypeArguments.Add(arg_class.AsCodeDom); switch (Count) { case ArgCount.OneOrMore: goto case ArgCount.ZeroOrMore; case ArgCount.ZeroOrMore: mref.MethodName = "AsArrayConv"; break; case ArgCount.Optional: if (conv == RuleArgConversion.ToValueType) { mref.MethodName = "AsOptionalValue"; } else { mref.MethodName = "AsOptionalRef"; } break; case ArgCount.Standard: mref.MethodName = "AsSingleConv"; break; } } CodeMethodInvokeExpression inv2 = new CodeMethodInvokeExpression(); inv2.Method = mref; inv2.Parameters.Add(invoke); CodeAssignStatement assg = new CodeAssignStatement(CDH.ThisDot(Name), inv2); fetch.Statements.Add(assg); // ClearArgValues. Can't clear standard value types -- eg, 'bool member;'. // Those we trust will get set again when FetchArgValues is called next time. if (conv != RuleArgConversion.ToValueType || Count != ArgCount.Standard) { assg = new CodeAssignStatement(CDH.ThisDot(Name), CDH.Null); clear.Statements.Add(assg); } }