protected override Expression VisitMethodCall(MethodCallExpression e)
        {
            if (e.Method.DeclaringType == typeof(StringQueryExtensions))
            {
                return(VisitStringQxMethodCall(e));
            }

            if (e.Method.DeclaringType.IsStringType())
            {
                return(VisitStringMethodCall(e));
            }

            if (e.Method.DeclaringType == typeof(EnumerableQueryExtensions))
            {
                return(VisitEnumerableQxMethodCall(e));
            }

            if (e.Method.DeclaringType == typeof(SingleValueTypeQueryExtensions))
            {
                return(VisitSingleValueTypeQxMethodCall(e));
            }

            try
            {
                Visit(Expression.Constant(e.Evaluate()));
            }
            catch (Exception ex)
            {
                throw new NotSupportedException(
                          ExceptionMessages.LambdaParser_UnsupportedMethodCall.Inject(e.ToString()), ex);
            }

            return(e);
        }
Exemple #2
0
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     // => List<int>[]
     if (node.CanEvaluate())
     {
         return(this.VisitConstant(node.Evaluate()));
     }
     return(_methodVisitor.VisitMethodCall(node));
 }
        public void TestMethodMissingRequiredParam()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("noway");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("TwoArgumentMethod", s));
            var r  = mc.Evaluate(ctx);
        }
        public void TestCallNoArgs()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallNoArgs", new IExpression[] { }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(5, r);
        }
        public void TestSumEmpyDict()
        {
            var d  = new Dictionary <object, object>();
            var fo = new MethodCallExpression(new PlotLingoLib.Expressions.Values.VariableValue("p"),
                                              new FunctionExpression("sum", new IExpression[0]));
            var c = new RootContext();

            c.SetVariableValue("p", d);
            fo.Evaluate(c);
        }
        public void TestExtensionMethodWithContext()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("hi");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringWithCTX", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(6, r, "3*length of string");
        }
        public void TestExtensionMethodOverridesSameObjectGuy()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("hi");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringToOverride", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(4, r, "2*length of string");
        }
        public void TestMethodWithMultiDefinitionDefaultArg()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("noway");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CommonNameWithDefault", s));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual("noway10", r as string);
        }
        public void CallWithConversion()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new IntegerValue(5);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallWithShort", s));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual("5", r);
        }
        public void TestCallOneArg()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("length");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringArg", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(6, r);
        }
        public void TestMethodWithDefaultParam()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new StringValue("hithere");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("OneWithDefault"));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual("hi", r as string);
        }
        public void TestArgumentsEvaluatedOnlyOnce()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new MyStringExpression();
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringArg", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(1, s._evalCount, "# of times evaluated");
        }
        public void TestExtensionMethodWithMultiDefinition()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new IntegerValue(10);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CommonNameWithDefaultStatic", s));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual("10", r as string);
        }
        public void TestMethodWithMultiSignatureObjectInheritanceHigherClass()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s  = new ObjectValue(new Dictionary <object, object>() as IDictionary <object, object>);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("MultiSignatureHierarchyWithSig", s));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(20, (int)r);
        }
Exemple #15
0
 /// <summary>
 /// 访问方法表达式
 /// </summary>
 /// <param name="node">方法表达式</param>
 /// <returns></returns>
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     // => List<int>[]
     if (node.CanEvaluate())
     {
         return(this.VisitConstant(node.Evaluate()));
     }
     else
     {
         return(this.VisitMethodCall(node, MethodCallType.MethodCall));
     }
 }
        public void TestPropertyGet()
        {
            var ctx = new RootContext();
            var tc  = new testClass();

            tc.MyProp = 10;
            ctx.SetVariableValue("p", tc);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("MyProp"));
            var r  = mc.Evaluate(ctx);

            Assert.IsInstanceOfType(r, typeof(int));
            Assert.AreEqual(10, r);
        }
        public void TestExtensionMethodWithMultiSignatureHigherClass()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            var s = new ObjectValue(new t2()
            {
                i = 10, i2 = 20
            });
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("MultiSignatureHierarchyStatic", s));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(20, (int)r);
        }
        public void TestSumOneObj()
        {
            var d = new Dictionary <object, object>();

            d["hi"] = 10;
            var fo = new MethodCallExpression(new PlotLingoLib.Expressions.Values.VariableValue("p"),
                                              new FunctionExpression("sum", new IExpression[0]));
            var c = new RootContext();

            c.SetVariableValue("p", d);
            var v = fo.Evaluate(c);

            Assert.AreEqual(10, v, "Value");
        }
        public void TestPropertySetBadType()
        {
            var ctx = new RootContext();
            var tc  = new testClass();

            tc.MyProp = 10;
            ctx.SetVariableValue("p", tc);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("MyProp", new StringValue("hi there")));
            var r  = mc.Evaluate(ctx);

            Assert.IsInstanceOfType(r, typeof(testClass));
            Assert.AreEqual(tc, r);
            Assert.AreEqual(20, tc.MyProp);
        }
        protected virtual Expression VisitStringQxMethodCall(MethodCallExpression e)
        {
            var member = e.GetRightMostMember();

            var expressionIsNotForMember = member == null || member.Expression.NodeType == ExpressionType.Constant;

            if (expressionIsNotForMember)
            {
                return(Visit(Expression.Constant(e.Evaluate())));
            }

            var methodName = e.Method.Name;

            switch (methodName)
            {
            case "QxContains":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringContainsNode(e.Arguments[1].Evaluate().ToStringOrNull()));
                break;

            case "QxStartsWith":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringStartsWithNode(e.Arguments[1].Evaluate().ToStringOrNull()));
                break;

            case "QxEndsWith":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringEndsWithNode(e.Arguments[1].Evaluate().ToStringOrNull()));
                break;

            case "QxIsExactly":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringExactNode(e.Arguments[1].Evaluate().ToStringOrNull()));
                break;

            case "QxLike":
                Nodes.AddNode(CreateNewMemberNode(member).ToLikeNode(e.Arguments[1].Evaluate().ToStringOrNull()));
                break;

            case "QxToLower":
                Nodes.AddNode(CreateNewMemberNode(member).ToLowerNode());
                break;

            case "QxToUpper":
                Nodes.AddNode(CreateNewMemberNode(member).ToUpperNode());
                break;

            default:
                throw new SisoDbNotSupportedException("String query extension (Qx) method '{0}', is not supported.".Inject(methodName));
            }

            return(e);
        }
        public void TestMethodCallbackAlterResult()
        {
            var tc  = new testClass();
            var ctx = new RootContext();

            ctx.ExecutionContext.AddPostCallHook("CallNoArgs", "test", (obj, result) =>
            {
                return(33);
            });
            ctx.SetVariableValue("p", tc);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallNoArgs", new IExpression[] { }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(33, r, "Altered result");
        }
        public void TestPostMethod2HookCallInExtensionMethod()
        {
            var ctx = new RootContext();

            ctx.SetVariableValue("p", new testClass());
            int count1 = 0;
            int count2 = 0;

            ctx.ExecutionContext.AddPostCallHook("CallOneStringArgExt", "test1", (o, obj) => count1++);
            ctx.ExecutionContext.AddPostCallHook("CallOneStringArgExt", "test2", (o, obj) => count2++);
            var s  = new StringValue("hi");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringArgExt", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(1, count1, "# of times the first hook got called");
            Assert.AreEqual(1, count2, "# of times the second hook got called");
        }
        public void TestMethodOnObjectPostHookCallback()
        {
            var tc    = new testClass();
            var ctx   = new RootContext();
            int count = 0;

            ctx.ExecutionContext.AddPostCallHook("CallNoArgs", "test", (obj, result) =>
            {
                count++;
                Assert.AreEqual(tc, obj, "object that is passed in as central object");
                Assert.AreEqual(5, result, "Result not passed correctly");
                return(result);
            });
            ctx.SetVariableValue("p", tc);
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallNoArgs", new IExpression[] { }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(1, count, "# of times the callback was called");
        }
        public void TestSumSevenObj()
        {
            var d = new Dictionary <object, object>();

            d["hi"]    = 10;
            d[5]       = 20;
            d["there"] = 5;
            d["also"]  = 1;
            d["noway"] = 2;
            d["stuff"] = 4;
            d["ops"]   = 5;
            var fo = new MethodCallExpression(new PlotLingoLib.Expressions.Values.VariableValue("p"),
                                              new FunctionExpression("sum", new IExpression[0]));
            var c = new RootContext();

            c.SetVariableValue("p", d);
            var v = fo.Evaluate(c);

            Assert.AreEqual(47, v, "Value");
        }
        public void TestPostMethodHookCallInExtensionMethod()
        {
            var ctx = new RootContext();
            var tc  = new testClass();

            ctx.SetVariableValue("p", tc);
            int count = 0;

            ctx.ExecutionContext.AddPostCallHook("CallOneStringArgExt", "test", (obj, result) =>
            {
                count++;
                Assert.AreEqual(tc, obj, "Object that is getting the callb ack");
                Assert.AreEqual(4, result, "Result of callback");
                return(result);
            });
            var s  = new StringValue("hi");
            var mc = new MethodCallExpression(new VariableValue("p"), new FunctionExpression("CallOneStringArgExt", new IExpression[] { s }));
            var r  = mc.Evaluate(ctx);

            Assert.AreEqual(1, count, "# of times the hook got called");
        }
        protected virtual Expression VisitStringMethodCall(MethodCallExpression e)
        {
            var member = e.GetRightMostMember();

            var expressionIsNotForMember = member == null || member.Expression.NodeType == ExpressionType.Constant;

            if (expressionIsNotForMember)
            {
                return(Visit(Expression.Constant(e.Evaluate())));
            }

            var methodName = e.Method.Name;

            switch (methodName)
            {
            case "Contains":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringContainsNode(e.Arguments[0].Evaluate().ToStringOrNull()));
                break;

            case "StartsWith":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringStartsWithNode(e.Arguments[0].Evaluate().ToStringOrNull()));
                break;

            case "EndsWith":
                Nodes.AddNode(CreateNewMemberNode(member).ToStringEndsWithNode(e.Arguments[0].Evaluate().ToStringOrNull()));
                break;

            case "ToLower":
                Nodes.AddNode(CreateNewMemberNode(member).ToLowerNode());
                break;

            case "ToUpper":
                Nodes.AddNode(CreateNewMemberNode(member).ToUpperNode());
                break;
            }

            return(e);
        }