This is an automated email from the ASF dual-hosted git repository. henrib pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push: new b2d7c7ee JEXL: fix parsing error caused by ternary and ns call embedded in lambda via method call ; b2d7c7ee is described below commit b2d7c7eef909b23e79b88c6f203087bd17a1eb3b Author: Henri Biestro <hbies...@cloudera.com> AuthorDate: Wed May 29 15:49:38 2024 +0200 JEXL: fix parsing error caused by ternary and ns call embedded in lambda via method call ; --- .../org/apache/commons/jexl3/parser/Parser.jjt | 9 ++++++- .../org/apache/commons/jexl3/Issues400Test.java | 31 +++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt index 2aa71f9c..b6a6d896 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt +++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt @@ -1142,9 +1142,16 @@ void MethodCall() #void : {} (MemberAccess() (LOOKAHEAD(<LPAREN>) Arguments())+) #MethodNode(>1) } + +void MethodCallLookahead() #void : {} +{ + MemberAccess() <LPAREN> +} + + void MemberExpression() #void : {} { - LOOKAHEAD(MethodCall()) MethodCall() | MemberAccess() + LOOKAHEAD(MethodCallLookahead()) MethodCall() | MemberAccess() } void ValueExpression() #void : {} diff --git a/src/test/java/org/apache/commons/jexl3/Issues400Test.java b/src/test/java/org/apache/commons/jexl3/Issues400Test.java index fb64b811..f0778cea 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues400Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues400Test.java @@ -397,8 +397,18 @@ public class Issues400Test { } } + public static class VinzCaller { + private final JexlContext context; + VinzCaller(JexlContext context) { + this.context = context; + } + public Object execute(JexlScript script) { + return script.execute(context); + } + } + @Test - public void testNamespaceVsTernary() { + public void testNamespaceVsTernary0() { VinzContext ctxt = new VinzContext(); ctxt.set("Users", "USERS"); final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); @@ -413,4 +423,23 @@ public class Issues400Test { r = script.execute(ctxt); Assert.assertEquals("USERS.user", r); } + + @Test + public void testNamespaceVsTernary1() { + VinzContext ctxt = new VinzContext(); + ctxt.set("Users", "USERS"); + ctxt.set("vinz", new VinzCaller(ctxt)); + final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); + JexlScript script = jexl.createScript( + "vinz.execute(() -> {\n" + + " var test = 42;\n" + + " var user = useTest ? test : member(Users, 'user');\n" + + "})\n" , "useTest"); + Object r = script.execute(ctxt, false); + Assert.assertNotNull(r); + Assert.assertEquals("USERS.user", r); + r = script.execute(ctxt, true); + Assert.assertNotNull(r); + Assert.assertEquals(42, r); + } }