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); }
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); }
/// <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); }