public ParameterStructure(string name, ParameterAttributes attr, TypeStructure pt, CilStructure def)
 {
     Name = name;
     Attributes = attr;
     ParamType = pt;
     DefaultValue = def;
     AppendChild(DefaultValue);
 }
 public LoopLocalStructure(string name, TypeStructure dt, CilStructure def)
     : base(dt)
 {
     Name = name;
     DataType = dt;
     DefaultValue = def;
     Local = new LocalStructure(name, dt);
     AppendChild(DefaultValue);
     AppendChild(Local);
 }
 internal void ChildBuildCode(CilStructure stru, bool isRet)
 {
     for (var i = 0; i < this.Count; ++i)
     {
         if (i == this.Count - 1 && isRet)
         {
             this[i].BuildCode();
         }
         else
         {
             PopBuildCode(this[i]);
         }
     }
 }
 internal void BuildCall(CilStructure variant, CodeGenerator cg)
 {
     var ls = RenewBaseInstance as LoadStoreStructure;
     if(ls != null)
     {
         ls.BuildCall(variant, cg);
     }
     else if (RenewBaseInstance is MethodStructure)
     {
         cg.GenerateCall(this);
     }
     else
     {
         RenewBaseInstance.BuildCall(cg);
     }
 }
 public CallStructure(TypeStructure rt, BuilderStructure call, ExpressionStructure pre, CilStructure variant)
     : base(rt)
 {
     Call = call;
     Pre = pre;
     Access = pre;
     Variant = variant;
     Arguments = new List<ExpressionStructure>();
     Converters = new List<BuilderStructure>();
     if (Access != null)
     {
         AppendChild(Access);
     }
     if (Arguments != null)
     {
         AppendChild(Arguments);
     }
 }
 public CallStructure(TypeStructure rt, BuilderStructure call, ExpressionStructure pre, CilStructure access, CilStructure variant, IReadOnlyList<ExpressionStructure> args, IReadOnlyList<BuilderStructure> convs, bool isVariadic = false)
     : base(rt)
 {
     Call = call;
     Pre = pre;
     Access = access;
     Variant = variant;
     Arguments = args;
     Converters = convs;
     IsVariadic = isVariadic;
     if (Access != null)
     {
         AppendChild(Access);
     }
     if (Arguments != null)
     {
         AppendChild(Arguments);
     }
 }
 internal void BuildCall(CilStructure variant, CodeGenerator cg)
 {
     var b = variant as BuilderStructure;
     if(b != null && BaseInstance != null)
     {
         variant = b.RenewInstance(BaseInstance);
     }
     var f = variant as FieldStructure;
     if(f != null)
     {
         if(f.IsEnumField)
         {
             cg.GeneratePrimitive((dynamic)f.DefaultValue);
         }
         else if (IsStore)
         {
             if(f.IsStatic)
             {
                 cg.GenerateStore(f);
                 cg.GenerateLoad(f);
             }
             else
             {
                 cg.GenerateCode(OpCodes.Dup);
                 var temp = new LocalStructure(f.DataType, cg);
                 cg.GenerateStore(temp);
                 cg.GenerateStore(f);
                 cg.GenerateLoad(temp);
             }
         }
         else
         {
             cg.GenerateLoad(f);
         }
         return;
     }
     var l = variant as LocalStructure;
     if (l != null)
     {
         if (IsStore)
         {
             cg.GenerateStore(l);
         }
         cg.GenerateLoad(l);
         return;
     }
     var p = variant as ParameterStructure;
     if(p != null)
     {
         if (IsStore)
         {
             cg.GenerateStore(p);
         }
         cg.GenerateLoad(p);
         return;
     }
     var lo = variant as LoopLocalStructure;
     if (lo != null)
     {
         if (IsStore)
         {
             cg.GenerateStore(lo.Local);
         }
         cg.GenerateLoad(lo.Local);
         return;
     }
     var v = variant as ValueStructure;
     if(v != null)
     {
         cg.GeneratePrimitive(v.Value);
         return;
     }
     throw new InvalidOperationException();
 }
 internal void TraversalPreBuild(CilStructure stru)
 {
     var c = stru as BuilderStructure;
     if (c != null)
     {
         c.RelayPreBuild();
     }
     foreach (var v in stru)
     {
         TraversalPreBuild(v);
     }
 }
 internal void TraversalPostBuild(CilStructure stru)
 {
     foreach (var v in stru.Reverse())
     {
         TraversalPostBuild(v);
     }
     var c = stru as BuilderStructure;
     if(c != null)
     {
         c.RelayPostBuild();
     }
 }