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

Reply via email to