Beispiel #1
0
        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());
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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");
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
        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));
 }
Beispiel #12
0
 public object Visit(IfElseExpression node)
 {
     return(null);
 }