コード例 #1
0
 public override Expression ToExpression(ParserContext parserContext)
 {
     Expression test = ExpressionFingerprint.ToExpression(this.Test, parserContext);
     Expression ifTrue = ExpressionFingerprint.ToExpression(this.IfTrue, parserContext);
     Expression ifFalse = ExpressionFingerprint.ToExpression(this.IfFalse, parserContext);
     return Expression.Condition(test, ifTrue, ifFalse);
 }
コード例 #2
0
        public static ConstantExpressionFingerprint Create(ConstantExpression expression, ParserContext parserContext) {
            ConstantExpressionFingerprint fingerprint = new ConstantExpressionFingerprint(expression) {
                HoistedLocalsIndex = parserContext.HoistedValues.Count
            };

            parserContext.HoistedValues.Add(expression.Value);
            return fingerprint;
        }
コード例 #3
0
 public static ParameterExpressionFingerprint Create(ParameterExpression expression, ParserContext parserContext)
 {
     if (expression == parserContext.ModelParameter)
     {
         return new ParameterExpressionFingerprint(expression);
     }
     return null;
 }
コード例 #4
0
 public static MemberExpressionFingerprint Create(MemberExpression expression, ParserContext parserContext)
 {
     ExpressionFingerprint fingerprint = ExpressionFingerprint.Create(expression.Expression, parserContext);
     if ((fingerprint == null) && (expression.Expression != null))
     {
         return null;
     }
     return new MemberExpressionFingerprint(expression) { Target = fingerprint };
 }
コード例 #5
0
 public static UnaryExpressionFingerprint Create(UnaryExpression expression, ParserContext parserContext)
 {
     ExpressionFingerprint fingerprint = ExpressionFingerprint.Create(expression.Operand, parserContext);
     if ((fingerprint == null) && (expression.Operand != null))
     {
         return null;
     }
     return new UnaryExpressionFingerprint(expression) { Operand = fingerprint };
 }
コード例 #6
0
 public override Expression ToExpression(ParserContext parserContext)
 {
     Expression expression = ExpressionFingerprint.ToExpression(this.Operand, parserContext);
     if (base.NodeType == ExpressionType.UnaryPlus)
     {
         return Expression.UnaryPlus(expression, this.Method);
     }
     return Expression.MakeUnary(base.NodeType, expression, base.Type, this.Method);
 }
コード例 #7
0
 public static ParameterExpressionFingerprint Create(ParameterExpression expression, ParserContext parserContext) {
     if (expression == parserContext.ModelParameter) {
         return new ParameterExpressionFingerprint(expression);
     }
     else {
         // degenerate case - uncaptured parameter expression passed into the system
         return null;
     }
 }
コード例 #8
0
        public static MemberExpressionFingerprint Create(MemberExpression expression, ParserContext parserContext) {
            ExpressionFingerprint target = Create(expression.Expression, parserContext);
            if (target == null && expression.Expression != null) {
                return null;
            }

            return new MemberExpressionFingerprint(expression) {
                Target = target
            };
        }
コード例 #9
0
        public override Expression ToExpression(ParserContext parserContext) {
            Expression operandExpr = ToExpression(Operand, parserContext);

            // in .NET 3.5 SP1, Expression.MakeUnary() throws if NodeType is UnaryPlus, so special-case
            if (NodeType == ExpressionType.UnaryPlus) {
                return Expression.UnaryPlus(operandExpr, Method);
            }
            else {
                return Expression.MakeUnary(NodeType, operandExpr, Type, Method);
            }
        }
コード例 #10
0
        public static ExpressionFingerprint Create(Expression expression, ParserContext parserContext)
        {
            {
                BinaryExpression binaryExpression = expression as BinaryExpression;
                if (binaryExpression != null) {
                    return BinaryExpressionFingerprint.Create(binaryExpression, parserContext);
                }
            }

            {
                ConditionalExpression conditionalExpression = expression as ConditionalExpression;
                if (conditionalExpression != null) {
                    return ConditionalExpressionFingerprint.Create(conditionalExpression, parserContext);
                }
            }

            {
                ConstantExpression constantExpression = expression as ConstantExpression;
                if (constantExpression != null) {
                    return ConstantExpressionFingerprint.Create(constantExpression, parserContext);
                }
            }

            {
                MemberExpression memberExpression = expression as MemberExpression;
                if (memberExpression != null) {
                    return MemberExpressionFingerprint.Create(memberExpression, parserContext);
                }
            }

            {
                MethodCallExpression methodCallExpression = expression as MethodCallExpression;
                if (methodCallExpression != null) {
                    return MethodCallExpressionFingerprint.Create(methodCallExpression, parserContext);
                }
            }

            {
                ParameterExpression parameterExpression = expression as ParameterExpression;
                if (parameterExpression != null) {
                    return ParameterExpressionFingerprint.Create(parameterExpression, parserContext);
                }
            }

            {
                UnaryExpression unaryExpression = expression as UnaryExpression;
                if (unaryExpression != null) {
                    return UnaryExpressionFingerprint.Create(unaryExpression, parserContext);
                }
            }

            // unknown expression
            return null;
        }
コード例 #11
0
        public static UnaryExpressionFingerprint Create(UnaryExpression expression, ParserContext parserContext) {
            ExpressionFingerprint operand = Create(expression.Operand, parserContext);
            if (operand == null && expression.Operand != null) {
                // couldn't convert the operand, so bail
                return null;
            }

            return new UnaryExpressionFingerprint(expression) {
                Operand = operand
            };
        }
コード例 #12
0
 public static ReadOnlyCollection<ExpressionFingerprint> Create(IEnumerable<Expression> expressions, ParserContext parserContext)
 {
     List<ExpressionFingerprint> list = new List<ExpressionFingerprint>();
     foreach (Expression expression in expressions)
     {
         ExpressionFingerprint item = Create(expression, parserContext);
         if ((item == null) && (expression != null))
         {
             return null;
         }
         list.Add(item);
     }
     return new ReadOnlyCollection<ExpressionFingerprint>(list);
 }
コード例 #13
0
 public static MethodCallExpressionFingerprint Create(MethodCallExpression expression, ParserContext parserContext)
 {
     ReadOnlyCollection<ExpressionFingerprint> onlys = ExpressionFingerprint.Create(expression.Arguments, parserContext);
     if (onlys == null)
     {
         return null;
     }
     ExpressionFingerprint fingerprint = ExpressionFingerprint.Create(expression.Object, parserContext);
     if ((fingerprint == null) && (expression.Object != null))
     {
         return null;
     }
     return new MethodCallExpressionFingerprint(expression) { Arguments = onlys, Target = fingerprint };
 }
コード例 #14
0
        public static MethodCallExpressionFingerprint Create(MethodCallExpression expression, ParserContext parserContext) {
            ReadOnlyCollection<ExpressionFingerprint> arguments = Create(expression.Arguments, parserContext);
            if (arguments == null) {
                return null;
            }

            ExpressionFingerprint target = Create(expression.Object, parserContext);
            if (target == null && expression.Object != null) {
                return null;
            }

            return new MethodCallExpressionFingerprint(expression) {
                Arguments = arguments,
                Target = target
            };
        }
コード例 #15
0
 public static BinaryExpressionFingerprint Create(BinaryExpression expression, ParserContext parserContext)
 {
     if (expression.Conversion != null)
     {
         return null;
     }
     ExpressionFingerprint fingerprint = ExpressionFingerprint.Create(expression.Left, parserContext);
     if ((fingerprint == null) && (expression.Left != null))
     {
         return null;
     }
     ExpressionFingerprint fingerprint2 = ExpressionFingerprint.Create(expression.Right, parserContext);
     if ((fingerprint2 == null) && (expression.Right != null))
     {
         return null;
     }
     return new BinaryExpressionFingerprint(expression) { Left = fingerprint, Right = fingerprint2 };
 }
コード例 #16
0
 public static ConditionalExpressionFingerprint Create(ConditionalExpression expression, ParserContext parserContext)
 {
     ExpressionFingerprint fingerprint = ExpressionFingerprint.Create(expression.Test, parserContext);
     if ((fingerprint == null) && (expression.Test != null))
     {
         return null;
     }
     ExpressionFingerprint fingerprint2 = ExpressionFingerprint.Create(expression.IfTrue, parserContext);
     if ((fingerprint2 == null) && (expression.IfTrue != null))
     {
         return null;
     }
     ExpressionFingerprint fingerprint3 = ExpressionFingerprint.Create(expression.IfFalse, parserContext);
     if ((fingerprint3 == null) && (expression.IfFalse != null))
     {
         return null;
     }
     return new ConditionalExpressionFingerprint(expression) { Test = fingerprint, IfTrue = fingerprint2, IfFalse = fingerprint3 };
 }
コード例 #17
0
 public static ExpressionFingerprint Create(Expression expression, ParserContext parserContext)
 {
     BinaryExpression expression2 = expression as BinaryExpression;
     if (expression2 != null)
     {
         return BinaryExpressionFingerprint.Create(expression2, parserContext);
     }
     ConditionalExpression expression3 = expression as ConditionalExpression;
     if (expression3 != null)
     {
         return ConditionalExpressionFingerprint.Create(expression3, parserContext);
     }
     ConstantExpression expression4 = expression as ConstantExpression;
     if (expression4 != null)
     {
         return ConstantExpressionFingerprint.Create(expression4, parserContext);
     }
     MemberExpression expression5 = expression as MemberExpression;
     if (expression5 != null)
     {
         return MemberExpressionFingerprint.Create(expression5, parserContext);
     }
     MethodCallExpression expression6 = expression as MethodCallExpression;
     if (expression6 != null)
     {
         return MethodCallExpressionFingerprint.Create(expression6, parserContext);
     }
     ParameterExpression expression7 = expression as ParameterExpression;
     if (expression7 != null)
     {
         return ParameterExpressionFingerprint.Create(expression7, parserContext);
     }
     UnaryExpression expression8 = expression as UnaryExpression;
     if (expression8 != null)
     {
         return UnaryExpressionFingerprint.Create(expression8, parserContext);
     }
     return null;
 }
コード例 #18
0
        public static BinaryExpressionFingerprint Create(BinaryExpression expression, ParserContext parserContext) {
            if (expression.Conversion != null) {
                // we don't support the Conversion property
                return null;
            }

            // if any fingerprinting fails, bail out
            ExpressionFingerprint left = Create(expression.Left, parserContext);
            if (left == null && expression.Left != null) {
                return null;
            }

            ExpressionFingerprint right = Create(expression.Right, parserContext);
            if (right == null && expression.Right != null) {
                return null;
            }

            return new BinaryExpressionFingerprint(expression) {
                Left = left,
                Right = right
            };
        }
コード例 #19
0
        public static ConditionalExpressionFingerprint Create(ConditionalExpression expression, ParserContext parserContext) {
            // if any fingerprinting fails, bail out
            ExpressionFingerprint test = Create(expression.Test, parserContext);
            if (test == null && expression.Test != null) {
                return null;
            }

            ExpressionFingerprint ifTrue = Create(expression.IfTrue, parserContext);
            if (ifTrue == null && expression.IfTrue != null) {
                return null;
            }

            ExpressionFingerprint ifFalse = Create(expression.IfFalse, parserContext);
            if (ifFalse == null && expression.IfFalse != null) {
                return null;
            }

            return new ConditionalExpressionFingerprint(expression) {
                Test = test,
                IfTrue = ifTrue,
                IfFalse = ifFalse
            };
        }
コード例 #20
0
 public override Expression ToExpression(ParserContext parserContext) {
     Expression testExpr = ToExpression(Test, parserContext);
     Expression ifTrueExpr = ToExpression(IfTrue, parserContext);
     Expression ifFalseExpr = ToExpression(IfFalse, parserContext);
     return Expression.Condition(testExpr, ifTrueExpr, ifFalseExpr);
 }
コード例 #21
0
 public abstract Expression ToExpression(ParserContext parserContext);
コード例 #22
0
 protected static IEnumerable<Expression> ToExpression(IEnumerable<ExpressionFingerprint> fingerprints, ParserContext parserContext) {
     return from fingerprint in fingerprints select ToExpression(fingerprint, parserContext);
 }
コード例 #23
0
 protected static Expression ToExpression(ExpressionFingerprint fingerprint, ParserContext parserContext) {
     return (fingerprint != null) ? fingerprint.ToExpression(parserContext) : null;
 }
コード例 #24
0
 public static ReadOnlyCollection<ExpressionFingerprint> Create(IEnumerable<Expression> expressions, ParserContext parserContext) {
     List<ExpressionFingerprint> fingerprints = new List<ExpressionFingerprint>();
     foreach (Expression expression in expressions) {
         ExpressionFingerprint fingerprint = Create(expression, parserContext);
         if (fingerprint == null && expression != null) {
             // something couldn't be parsed properly
             return null;
         }
         else {
             fingerprints.Add(fingerprint);
         }
     }
     return new ReadOnlyCollection<ExpressionFingerprint>(fingerprints);
 }
コード例 #25
0
        public static ExpressionFingerprint Create(Expression expression, ParserContext parserContext)
        {
            {
                BinaryExpression binaryExpression = expression as BinaryExpression;
                if (binaryExpression != null)
                {
                    return(BinaryExpressionFingerprint.Create(binaryExpression, parserContext));
                }
            }

            {
                ConditionalExpression conditionalExpression = expression as ConditionalExpression;
                if (conditionalExpression != null)
                {
                    return(ConditionalExpressionFingerprint.Create(conditionalExpression, parserContext));
                }
            }

            {
                ConstantExpression constantExpression = expression as ConstantExpression;
                if (constantExpression != null)
                {
                    return(ConstantExpressionFingerprint.Create(constantExpression, parserContext));
                }
            }

            {
                MemberExpression memberExpression = expression as MemberExpression;
                if (memberExpression != null)
                {
                    return(MemberExpressionFingerprint.Create(memberExpression, parserContext));
                }
            }

            {
                MethodCallExpression methodCallExpression = expression as MethodCallExpression;
                if (methodCallExpression != null)
                {
                    return(MethodCallExpressionFingerprint.Create(methodCallExpression, parserContext));
                }
            }

            {
                ParameterExpression parameterExpression = expression as ParameterExpression;
                if (parameterExpression != null)
                {
                    return(ParameterExpressionFingerprint.Create(parameterExpression, parserContext));
                }
            }

            {
                UnaryExpression unaryExpression = expression as UnaryExpression;
                if (unaryExpression != null)
                {
                    return(UnaryExpressionFingerprint.Create(unaryExpression, parserContext));
                }
            }

            // unknown expression
            return(null);
        }
コード例 #26
0
        public static ReadOnlyCollection <ExpressionFingerprint> Create(IEnumerable <Expression> expressions, ParserContext parserContext)
        {
            List <ExpressionFingerprint> fingerprints = new List <ExpressionFingerprint>();

            foreach (Expression expression in expressions)
            {
                ExpressionFingerprint fingerprint = Create(expression, parserContext);
                if (fingerprint == null && expression != null)
                {
                    // something couldn't be parsed properly
                    return(null);
                }
                else
                {
                    fingerprints.Add(fingerprint);
                }
            }
            return(new ReadOnlyCollection <ExpressionFingerprint>(fingerprints));
        }
コード例 #27
0
 public override Expression ToExpression(ParserContext parserContext)
 {
     Expression left = ExpressionFingerprint.ToExpression(this.Left, parserContext);
     Expression right = ExpressionFingerprint.ToExpression(this.Right, parserContext);
     return Expression.MakeBinary(base.NodeType, left, right, this.IsLiftedToNull, this.Method);
 }
コード例 #28
0
 protected static Expression ToExpression(ExpressionFingerprint fingerprint, ParserContext parserContext)
 {
     return((fingerprint != null) ? fingerprint.ToExpression(parserContext) : null);
 }
コード例 #29
0
 protected static IEnumerable <Expression> ToExpression(IEnumerable <ExpressionFingerprint> fingerprints, ParserContext parserContext)
 {
     return(from fingerprint in fingerprints select ToExpression(fingerprint, parserContext));
 }
コード例 #30
0
 public abstract Expression ToExpression(ParserContext parserContext);
コード例 #31
0
        public static MethodCallExpressionFingerprint Create(MethodCallExpression expression, ParserContext parserContext)
        {
            ReadOnlyCollection <ExpressionFingerprint> arguments = Create(expression.Arguments, parserContext);

            if (arguments == null)
            {
                return(null);
            }

            ExpressionFingerprint target = Create(expression.Object, parserContext);

            if (target == null && expression.Object != null)
            {
                return(null);
            }

            return(new MethodCallExpressionFingerprint(expression)
            {
                Arguments = arguments,
                Target = target
            });
        }
コード例 #32
0
 public override Expression ToExpression(ParserContext parserContext)
 {
     Expression instance = ExpressionFingerprint.ToExpression(this.Target, parserContext);
     IEnumerable<Expression> arguments = ExpressionFingerprint.ToExpression(this.Arguments, parserContext);
     return Expression.Call(instance, this.Method, arguments);
 }
コード例 #33
0
 public override Expression ToExpression(ParserContext parserContext) {
     Expression targetExpr = ToExpression(Target, parserContext);
     return Expression.MakeMemberAccess(targetExpr, Member);
 }
コード例 #34
0
 public override Expression ToExpression(ParserContext parserContext) {
     // (Type) HoistedValues[HoistedLocalsIndex]
     BinaryExpression arrayIndex = Expression.ArrayIndex(ParserContext.HoistedValuesParameter, Expression.Constant(HoistedLocalsIndex));
     UnaryExpression castExpr = Expression.Convert(arrayIndex, Type);
     return castExpr;
 }
コード例 #35
0
 public override Expression ToExpression(ParserContext parserContext) {
     // The only time an instance of this class exists is if it represents the actual model parameter,
     // so just return it directly.
     return parserContext.ModelParameter;
 }
コード例 #36
0
 public override Expression ToExpression(ParserContext parserContext)
 {
     return Expression.MakeMemberAccess(ExpressionFingerprint.ToExpression(this.Target, parserContext), this.Member);
 }