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 5072cdd3 JEXL-412: try a different map-entry vs ns call resolution;
5072cdd3 is described below

commit 5072cdd36c1e80e0889f24133606a8cf6d7d4fe7
Author: Henri Biestro <hbies...@cloudera.com>
AuthorDate: Mon Dec 18 19:26:21 2023 +0100

    JEXL-412: try a different map-entry vs ns call resolution;
---
 .../org/apache/commons/jexl3/internal/Engine.java  |  3 --
 .../apache/commons/jexl3/parser/JexlParser.java    |  4 +--
 .../org/apache/commons/jexl3/parser/Parser.jjt     |  2 ++
 .../org/apache/commons/jexl3/Issues400Test.java    | 34 +++++++++++++---------
 4 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/internal/Engine.java 
b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
index e824f5b2..6057d01b 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Engine.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
@@ -997,9 +997,6 @@ public class Engine extends JexlEngine {
     protected ASTJexlScript parse(final JexlInfo info, final JexlFeatures 
parsingf, final String src, final Scope scope) {
         final boolean cached = src.length() < cacheThreshold && cache != null;
         final JexlFeatures features = parsingf != null ? parsingf : 
DEFAULT_FEATURES;
-       // if (features.getNameSpaces().isEmpty() && !functions.isEmpty()) {
-       //     features = new 
JexlFeatures(features).nameSpaces(functions.keySet());
-       // }
         final Source source = cached? new Source(features, src) : null;
         ASTJexlScript script;
         if (source != null) {
diff --git a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java 
b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
index 290e3c01..21f8e84b 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
@@ -28,8 +28,8 @@ import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.function.Predicate;
 
+import org.apache.commons.jexl3.JexlContext;
 import org.apache.commons.jexl3.JexlEngine;
 import org.apache.commons.jexl3.JexlException;
 import org.apache.commons.jexl3.JexlFeatures;
@@ -602,7 +602,7 @@ public abstract class JexlParser extends StringParser {
         final String name = ns.image;
         if (isVariable(name)) {
             // the namespace sticks to the colon as in 'ns:fun()' (vs 'ns : 
fun()')
-            return colon.beginColumn - 1 == ns.endColumn && isNamespace(name);
+            return colon.beginColumn - 1 == ns.endColumn && ((colon.endColumn 
== fun.beginColumn - 1) || isNamespace(name));
         }
         return true;
     }
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 725c5582..520b3c8c 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -890,6 +890,8 @@ void MapLiteral() : {}
 
 void MapEntry() : {}
 {
+    Identifier(true) <COLON> Expression()
+    |
     Expression() <COLON> Expression()
 }
 
diff --git a/src/test/java/org/apache/commons/jexl3/Issues400Test.java 
b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
index c11b28c4..e1f79bb1 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues400Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
@@ -237,19 +237,27 @@ public class Issues400Test {
     final Map<Object, Object> ctl = new HashMap<>();
     ctl.put("one", 1);
     ctl.put("two", 2);
-    final String fnsrc = "function f(x) { x }\n" +
-        "let one = 'one', two = 'two';\n" +
-        "{ one : f(1), two:f(2) }";
-    final JexlContext jc = new MapContext();
-    final JexlEngine jexl = new JexlBuilder().create();
-    try {
-      final JexlScript e = jexl.createScript(fnsrc);
-      final Object o = e.execute(jc);
-      Assert.assertTrue(o instanceof Map);
-      Map<?, ?> map = (Map<?, ?>) o;
-      Assert.assertEquals(map, ctl);
-    } catch (JexlException.Parsing xparse) {
-      Assert.fail(fnsrc + " : " + xparse.getMessage());
+    final String fnsrc0 = "function f(x) { x }\n" +
+        "let one = 'one', two = 'two';\n";
+    for(String map0 : Arrays.asList(
+        "{ one : f(1), two:f(2) }",
+        "{ one: f(1), two: f(2) }",
+        "{ one: f(1), two:f(2) }",
+        "{ one :f(1), two:f(2) }")) {
+      final String fnsrc = fnsrc0 + map0;
+      final JexlContext jc = new MapContext();
+      final JexlEngine jexl = new JexlBuilder().create();
+      try {
+        final JexlScript e = jexl.createScript(fnsrc);
+        final Object o = e.execute(jc);
+        Assert.assertTrue(o instanceof Map);
+        Map<?, ?> map = (Map<?, ?>) o;
+        Assert.assertEquals(map, ctl);
+      } catch (JexlException.Parsing xparse) {
+        Assert.fail(fnsrc + " : " + xparse.getMessage());
+      } catch (JexlException xother) {
+        Assert.fail(fnsrc + " : " + xother.getMessage());
+      }
     }
   }
 

Reply via email to