/// <summary> /// 条件 AND。 /// </summary> /// <param name="l"></param> /// <param name="r"></param> /// <returns></returns> public static ET And(ET left, params ET[] rights) { return EnumOp(CodeBinaryOperatorType.BooleanAnd, left, rights); }
private static ET EnumOp(CodeBinaryOperatorType opType, ET left, params ET[] rights) { if (rights.Length == 0) return left; return EnumOpImpl(opType, left, rights, 0); }
private static ET EnumOpImpl(CodeBinaryOperatorType opType, ET l, ET[] rights, int index) { ET r; if (index == rights.Length - 1) r = rights[index]; else r = EnumOpImpl(opType, rights[index], rights, index + 1); return new BuilderBinaryOperator(l, opType, r); }
/// <summary> /// フィールドへの参照を作成します。 /// </summary> /// <param name="target"></param> /// <param name="name"></param> /// <returns></returns> private static ET BinaryOperator(ET l, CodeBinaryOperatorType op, ET r) { return new BuilderBinaryOperator(l, op, r); }
protected static CodeExpression[] GetExpresions(ET[] trees) { CodeExpression[] codes = new CodeExpression[trees.Length]; for (int i = 0; i < codes.Length; i++) codes[i] = trees[i].Expression; return codes; }
/// <summary> /// 代入式ステートメントを作成します。 /// </summary> /// <param name="target"></param> /// <param name="value"></param> /// <returns></returns> public static CodeAssignStatement Assign(ET target, object value) { return Assign(target, V(value)); }
public BuilderArrayIndex(ET target, params ET[] indexer) { this.Target = target; this.Indexer = indexer; }
/// <summary> /// フィールドへの参照を作成します。 /// </summary> /// <param name="target"></param> /// <param name="name"></param> /// <returns></returns> public static ET F(ET target, string name) { return new BuilderField(target, name); }
/// <summary> /// フィールドへの参照を作成します。 /// </summary> /// <param name="target"></param> /// <param name="name"></param> /// <returns></returns> public static ET P(ET target, string name) { return new BuilderProperty(target, name); }
/// <summary> /// プロパティに代入するステートメントを作成します。 /// </summary> /// <param name="propertyName"></param> /// <param name="value"></param> /// <returns></returns> public CodeAssignStatement AssignF(string fieldName, ET value) { return Assign(THIS.F(fieldName), value); }
/// <summary> /// 現在の式に値を代入する代入式ステートメントを作成します。 /// </summary> /// <param name="value"></param> /// <returns></returns> public CodeAssignStatement Assign(ET value) { return Assign(this, value); }
public BuilderProperty(ET target, string name) { this.Target = target; this.Name = name; }
public BuilderField(ET target, string name) { this.Target = target; this.Name = name; }
public BuilderBinaryOperator(ET l, CodeBinaryOperatorType op, ET r) { this.Left = l; this.Operation = op; this.Right = r; }
/// <summary> /// 配列参照を作成します。 /// </summary> /// <param name="target"></param> /// <param name="indexer"></param> /// <returns></returns> public static ET ArrayIndex(ET target, params ET[] indexer) { return new BuilderArrayIndex(target, indexer); }
/// <summary> /// メソッドへの参照を作成します。 /// </summary> /// <param name="target"></param> /// <param name="name"></param> /// <returns></returns> public static ET RefMethod(ET target, string name) { return new BuilderMethodReference(target, name); }
/// <summary> /// 代入式ステートメントを作成します。 /// </summary> /// <param name="target"></param> /// <param name="value"></param> /// <returns></returns> public static CodeAssignStatement Assign(ET target, ET value) { return new CodeAssignStatement(target.Expression, value.Expression); }
/// <summary> /// メソッド呼び出しを作成します。 /// </summary> /// <param name="target"></param> /// <param name="name"></param> /// <param name="parameters"></param> /// <returns></returns> public static ET M(ET target, string name, params ET[] parameters) { return new BuilderMethodInvoke( (BuilderMethodReference)target.RefMethod(name), parameters); }
/// <summary> /// プロパティに代入するステートメントを作成します。 /// </summary> /// <param name="propertyName"></param> /// <param name="value"></param> /// <returns></returns> public CodeAssignStatement AssignP(string propertyName, ET value) { return Assign(THIS.P(propertyName), value); }
public BuilderMethodReference(ET target, string name, params CodeTypeReference[] genericTypes) { this.Target = target; this.Name = name; this.GenericTypes = genericTypes; }