protected override Expression VisitBinaryExpression(BinaryExpression expression)
        {
            var currentlyInBooleanExpression = _inBooleanExpression;
            var ret = new BooleanFlagExpression(false);
            switch (expression.NodeType)
            {
                case ExpressionType.Equal:
                case ExpressionType.NotEqual:
                    _inBooleanExpression = false;
                    ret =
                        new BooleanFlagExpression(
                            (
                            // Allowed: x.prop=constant
                            (expression.Left is MemberExpression && expression.Right is ConstantExpression) ||
                            // Allowed: x.prop=y.other_prop
                            (expression.Left is MemberExpression && expression.Right is MemberExpression)
                            ) &&
                            // Check left and right expression content are optimisable
                            IsTrue(VisitExpression(expression.Left)) &&
                                                  IsTrue(VisitExpression(expression.Right)));
                    break;
 
                case ExpressionType.OrElse:
                case ExpressionType.AndAlso:
                    _inBooleanExpression = true;
                    ret = 
                        new BooleanFlagExpression(
                            // Check left and right expression content are optimisable
                            IsTrue(VisitExpression(expression.Left)) &&
                                                  IsTrue(VisitExpression(expression.Right)));
                    break;
            }
            _inBooleanExpression = currentlyInBooleanExpression;
            return ret;
        }
Exemple #2
0
        protected override Expression VisitBinaryExpression(BinaryExpression expression)
        {
            var currentlyInBooleanExpression = _inBooleanExpression;
            var ret = new BooleanFlagExpression(false);

            switch (expression.NodeType)
            {
            case ExpressionType.Equal:
            case ExpressionType.NotEqual:
                _inBooleanExpression = false;
                ret =
                    new BooleanFlagExpression(
                        (
                            // Allowed: x.prop=constant
                            (expression.Left is MemberExpression && expression.Right is ConstantExpression) ||
                            // Allowed: x.prop=y.other_prop
                            (expression.Left is MemberExpression && expression.Right is MemberExpression)
                        ) &&
                        // Check left and right expression content are optimisable
                        IsTrue(VisitExpression(expression.Left)) &&
                        IsTrue(VisitExpression(expression.Right)));
                break;

            case ExpressionType.OrElse:
            case ExpressionType.AndAlso:
                _inBooleanExpression = true;
                ret =
                    new BooleanFlagExpression(
                        // Check left and right expression content are optimisable
                        IsTrue(VisitExpression(expression.Left)) &&
                        IsTrue(VisitExpression(expression.Right)));
                break;
            }
            _inBooleanExpression = currentlyInBooleanExpression;
            return(ret);
        }