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