public void Equality_DifferentThen() { var a = new IfElseExpression { ThenExpression = new ConstantValueExpression() }; var b = new IfElseExpression(); Assert.AreNotEqual(a, b); Assert.AreNotEqual(a.GetHashCode(), b.GetHashCode()); }
public void DefaultValues() { var sut = new IfElseExpression(); Assert.AreEqual(new UnknownExpression(), sut.Condition); Assert.AreEqual(new UnknownExpression(), sut.ThenExpression); Assert.AreEqual(new UnknownExpression(), sut.ElseExpression); Assert.AreNotEqual(0, sut.GetHashCode()); Assert.AreNotEqual(1, sut.GetHashCode()); }
/* * private VariableReference BinaryOp(BinaryExpression binaryOp, OpCode oper, XzaarType tempVariableType) * { * var left = Visit(binaryOp.Left) as VariableReference; * var right = Visit(binaryOp.Right) as VariableReference; * var createTempVariableLeft = !(oper == OpCode.CmpEq || oper == OpCode.CmpGt || oper == OpCode.CmpLt || oper == OpCode.CmpGte || oper == OpCode.CmpLte); * var createTempVariableRight = createTempVariableLeft; * if (!createTempVariableLeft && left is FieldReference) createTempVariableLeft = true; * if (!createTempVariableLeft && right is FieldReference) createTempVariableRight = true; * return BinaryOp(left, right, oper, tempVariableType, createTempVariableLeft, createTempVariableRight); // true, true * } * * private VariableReference BinaryOp(VariableReference left, VariableReference right, OpCode oper, XzaarType tempVariableType, bool createTempVariableLeft, bool createTempVariableRight) * { * var lv = left; * var rv = right; * * if (left == null || right == null) * { * insideBinaryOperation = false; * return null; * } * * if (createTempVariableLeft) lv = TempVariable(left.Type); * if (createTempVariableRight) rv = TempVariable(right.Type); * var cv = TempVariable(tempVariableType); * if (createTempVariableLeft) * { * var fRef = left as FieldReference; * if (fRef != null) * { * ctx.AddInstruction(left.ArrayIndex != null * ? Instruction.Create(OpCode.StructGet, lv, fRef.Instance, fRef, left.ArrayIndex as VariableReference) * : Instruction.Create(OpCode.StructGet, lv, fRef.Instance, fRef)); * } * else * ctx.AddInstruction(Instruction.Create(OpCode.Assign, lv, left)); * } * if (createTempVariableRight) * { * var fRef = right as FieldReference; * if (fRef != null) * { * ctx.AddInstruction(right.ArrayIndex != null * ? Instruction.Create(OpCode.StructGet, rv, fRef.Instance, fRef, right.ArrayIndex as VariableReference) * : Instruction.Create(OpCode.StructGet, rv, fRef.Instance, fRef)); * } * else * ctx.AddInstruction(Instruction.Create(OpCode.Assign, rv, right)); * } * ctx.AddInstruction(Instruction.Create(oper, cv, lv, rv)); * insideBinaryOperation = false; * return cv; // return the temp variable we used to return the result of the comparison * } */ public object Visit(IfElseExpression ifElse) { var il = ctx.GetILGenerator(); var test = Visit(ifElse.Test); TryLoadReference(test, il); // 1. create temp variable var tempVariable = ctx.CurrentMethod.DefineVariable(typeof(bool)); // 2. assign temp variable with value il.StoreInLocal(tempVariable); // 3. load temp variable il.LoadLocal(tempVariable); // 4. create a label <end_label> that we want to mark last var endOfTrue = il.DefineLabel(); // 5. brfalse.s <end_label> ---- branch to end label il.BranchIfFalse(endOfTrue); // 6. Visit IfTrue if (ifElse.IfTrue != null) { Visit(ifElse.IfTrue); } Label?endOfFalse = null; if (ifElse.IfFalse != null) { // if we do have an 'else' // then we want to branch out to end of conditional endOfFalse = il.DefineLabel(); il.BranchToShortForm(endOfFalse.Value); } // 8. Mark label here il.MarkLabel(endOfTrue); // 9. Visit IfFalse (if not null) if (ifElse.IfFalse != null) { Visit(ifElse.IfFalse); // 10. mark the endOfFalse label // ReSharper disable once PossibleInvalidOperationException il.MarkLabel(endOfFalse.Value); } return(true); }
public void SettingValues() { var sut = new IfElseExpression { Condition = new ConstantValueExpression(), ThenExpression = new NullExpression(), ElseExpression = new ReferenceExpression() }; Assert.AreEqual(new ConstantValueExpression(), sut.Condition); Assert.AreEqual(new NullExpression(), sut.ThenExpression); Assert.AreEqual(new ReferenceExpression(), sut.ElseExpression); }
protected override ScalarExpression OnBuildQuery(QueryBuilderContext context) { ScalarExpression condition = Arguments[0].BuildQuery(context); ScalarExpression ifTrue = Arguments[1].BuildQuery(context); ScalarExpression ifFalse = Arguments[2].BuildQuery(context); var result = new IfElseExpression { BooleanExpression = condition, IfBlockExpression = ifTrue, ElseBlockExpression = ifFalse }; return(result); }
public static ScalarExpression CastToString(ScalarExpression boolExpression) { var result = new IfElseExpression { BooleanExpression = boolExpression, IfBlockExpression = new LiteralExpression { Value = new EDC.ReadiNow.Metadata.TypedValue("Yes") }, ElseBlockExpression = new LiteralExpression { Value = new EDC.ReadiNow.Metadata.TypedValue("No") } }; return(result); }
public void IfElseExpression() { var sst = new IfElseExpression { Condition = new ConstantValueExpression { Value = "true" }, ThenExpression = new ConstantValueExpression { Value = "1" }, ElseExpression = new ConstantValueExpression { Value = "2" } }; AssertPrint(sst, "(true) ? 1 : 2"); }
public void Equality_ReallyTheSame() { var a = new IfElseExpression { Condition = new ConstantValueExpression(), ThenExpression = new ConstantValueExpression(), ElseExpression = new ReferenceExpression() }; var b = new IfElseExpression { Condition = new ConstantValueExpression(), ThenExpression = new ConstantValueExpression(), ElseExpression = new ReferenceExpression() }; Assert.AreEqual(a, b); Assert.AreEqual(a.GetHashCode(), b.GetHashCode()); }
protected Expression Compile(int lambdaLevel) { Expression expression = CompileBinaryExpression(0, lambdaLevel); if (IsPunctuationOf("?")) { PushPosition(); Move(); Expression positive = Compile(lambdaLevel); SkipPunctuation(":"); Expression negative = Compile(lambdaLevel); IfElseExpression ifElse = new IfElseExpression(expression, positive, negative, PeekPos(), Pos); PopPosition(); return(ifElse); } else { return(expression); } }
public void VisitorWithReturnIsImplemented() { var sut = new IfElseExpression(); sut.Accept(23).VerifyWithReturn(v => v.Visit(sut, 23)); }
private object EvaluateIfElseExpression(IfElseExpression expression, VariableContext context) { return((bool)Evaluate(expression.Condition, context) ? Evaluate(expression.PositiveBranch, context) : Evaluate(expression.NegativeBranch, context)); }
public object Visit(IfElseExpression node) { return(null); }