mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
fix 2 special cases of method invocation
--HG-- branch : dev
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Orchard.Widgets.SimpleScripting.Compiler;
|
using Orchard.Widgets.SimpleScripting.Compiler;
|
||||||
|
|
||||||
@@ -18,7 +19,6 @@ namespace Orchard.Tests.Modules.SimpleScripting {
|
|||||||
public void EvaluateInvalidBooleanExpression() {
|
public void EvaluateInvalidBooleanExpression() {
|
||||||
var result = EvaluateSimpleExpression("true and 1");
|
var result = EvaluateSimpleExpression("true and 1");
|
||||||
Assert.That(result.IsError, Is.True);
|
Assert.That(result.IsError, Is.True);
|
||||||
Trace.WriteLine(string.Format("Evaluation error: {0}", result.Error.Message));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -63,6 +63,22 @@ namespace Orchard.Tests.Modules.SimpleScripting {
|
|||||||
Assert.That(result.Value, Is.EqualTo(2 + 3));
|
Assert.That(result.Value, Is.EqualTo(2 + 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void EvaluateSimpleMethodCall4() {
|
||||||
|
var result = EvaluateSimpleExpression("foo",
|
||||||
|
(m, args) => (m == "foo") ? true : false);
|
||||||
|
Assert.That(result.IsError, Is.False);
|
||||||
|
Assert.That(result.Value, Is.EqualTo(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void EvaluateSimpleMethodCall5() {
|
||||||
|
var result = EvaluateSimpleExpression("foo()",
|
||||||
|
(m, args) => (m == "foo") ? true : false);
|
||||||
|
Assert.That(result.IsError, Is.False);
|
||||||
|
Assert.That(result.Value, Is.EqualTo(true));
|
||||||
|
}
|
||||||
|
|
||||||
private EvaluationResult EvaluateSimpleExpression(string expression) {
|
private EvaluationResult EvaluateSimpleExpression(string expression) {
|
||||||
return EvaluateSimpleExpression(expression, (m, args) => null);
|
return EvaluateSimpleExpression(expression, (m, args) => null);
|
||||||
}
|
}
|
||||||
@@ -71,10 +87,15 @@ namespace Orchard.Tests.Modules.SimpleScripting {
|
|||||||
string expression, Func<string, IList<object>, object> methodInvocationCallback) {
|
string expression, Func<string, IList<object>, object> methodInvocationCallback) {
|
||||||
|
|
||||||
var ast = new Parser(expression).Parse();
|
var ast = new Parser(expression).Parse();
|
||||||
|
foreach(var error in ast.GetErrors()) {
|
||||||
|
Trace.WriteLine(string.Format("Error during parsing of '{0}': {1}", expression, error.Message));
|
||||||
|
}
|
||||||
|
Assert.That(ast.GetErrors().Any(), Is.False);
|
||||||
var result = new Interpreter().Evalutate(new EvaluationContext {
|
var result = new Interpreter().Evalutate(new EvaluationContext {
|
||||||
Tree = ast,
|
Tree = ast,
|
||||||
MethodInvocationCallback = methodInvocationCallback
|
MethodInvocationCallback = methodInvocationCallback
|
||||||
});
|
});
|
||||||
|
Trace.WriteLine(string.Format("Result of evaluation of '{0}': {1}", expression, result));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -129,10 +129,18 @@ namespace Orchard.Widgets.SimpleScripting.Compiler {
|
|||||||
var target = _lexer.Token();
|
var target = _lexer.Token();
|
||||||
_lexer.NextToken();
|
_lexer.NextToken();
|
||||||
|
|
||||||
bool hasParenthesis = (IsMatch(TokenKind.OpenParen) != null);
|
bool isParenthesizedCall = (IsMatch(TokenKind.OpenParen) != null);
|
||||||
|
|
||||||
var arguments = new List<AstNode>();
|
var arguments = new List<AstNode>();
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// Special case: we might reach the end of the token stream
|
||||||
|
if (_lexer.Token().Kind == TokenKind.Eof)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Special case: we must support "foo()"
|
||||||
|
if (isParenthesizedCall && _lexer.Token().Kind == TokenKind.CloseParen)
|
||||||
|
break;
|
||||||
|
|
||||||
var argument = ParseExpression();
|
var argument = ParseExpression();
|
||||||
arguments.Add(argument);
|
arguments.Add(argument);
|
||||||
|
|
||||||
@@ -140,7 +148,7 @@ namespace Orchard.Widgets.SimpleScripting.Compiler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasParenthesis)
|
if (isParenthesizedCall)
|
||||||
Match(TokenKind.CloseParen);
|
Match(TokenKind.CloseParen);
|
||||||
|
|
||||||
return new MethodCallAstNode(target, arguments);
|
return new MethodCallAstNode(target, arguments);
|
||||||
|
Reference in New Issue
Block a user