This is an automated email from the ASF dual-hosted git repository.
henrib pushed a commit to branch JEXL-476
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/JEXL-476 by this push:
new 4e2f8b35 JEXL-476: Mention functions in the safeUndefined
documentation, review cleanups
4e2f8b35 is described below
commit 4e2f8b35b18fc8fc4ba6dbe01436657504afa261
Author: henrib <[email protected]>
AuthorDate: Thu Nov 12 15:18:36 2026 +0100
JEXL-476: Mention functions in the safeUndefined documentation, review
cleanups
Address review comments: use isSafeAccess instead of a cast when calling
a method without an object, name the safeUndefined flag in test476 and
check a call on a null result is tolerated by the null-coalescing operator.
Co-Authored-By: Claude <[email protected]>
---
src/main/java/org/apache/commons/jexl3/internal/Interpreter.java | 2 +-
src/site/xdoc/reference/syntax.xml | 2 +-
src/test/java/org/apache/commons/jexl3/Issues400Test.java | 9 ++++++---
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
index a079f572..1fff1edd 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
@@ -1721,7 +1721,7 @@ public class Interpreter extends InterpreterBase {
object = data;
if (object == null) {
// no object, we fail
- return isSafe() || ((ASTIdentifierAccess)
methodNode).isSafe()
+ return isSafe() || isSafeAccess(methodNode)
? null
: unsolvableMethod(methodNode, "<null>.<?>(...)");
}
diff --git a/src/site/xdoc/reference/syntax.xml
b/src/site/xdoc/reference/syntax.xml
index 5c62b84e..90b5aff6 100644
--- a/src/site/xdoc/reference/syntax.xml
+++ b/src/site/xdoc/reference/syntax.xml
@@ -292,7 +292,7 @@
Note that this can also be used in a chain as in
<code>x?[y]?[z]</code>.
</p>
<p>Whether safe-access operators shortcut non-existent
references - an undefined variable,
- property or method - as they do null is determined by
the <code>safeUndefined</code> option,
+ property, method or function - as they do null is
determined by the <code>safeUndefined</code> option,
true by default; when false, only null is shortcut and
a non-existent reference is an error.
</p>
<p>Access operators can be overloaded in
<code>JexlArithmetic</code>, so that
diff --git a/src/test/java/org/apache/commons/jexl3/Issues400Test.java
b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
index cdd6e985..5099c84a 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues400Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
@@ -1440,17 +1440,20 @@ public class Issues400Test {
{"nul(1)", err, err, err, err},
{"nul + 1", err, err, err, err},
{"nul.y ?? 1", 1, 1, 1, 1},
+ // a call on a null result
+ {"map.get('z')(1) ?? 1", 1, 1, 1, 1},
};
final JexlContext ctxt = new MapContext();
ctxt.set("nul", null);
+ ctxt.set("map", Collections.emptyMap());
for (int m = 0; m < 4; ++m) {
- final boolean undef = (m & 2) == 0;
+ final boolean safeUndefined = (m & 2) == 0;
final boolean safe = (m & 1) != 0;
- final JexlEngine jexl = new
JexlBuilder().strict(true).safe(safe).safeUndefined(undef).create();
+ final JexlEngine jexl = new
JexlBuilder().strict(true).safe(safe).safeUndefined(safeUndefined).create();
for (final Object[] c : cases) {
final String src = (String) c[0];
final Object expected = c[m + 1];
- final String msg = src + ", safeUndefined: " + undef + ",
safe: " + safe;
+ final String msg = src + ", safeUndefined: " + safeUndefined +
", safe: " + safe;
final JexlScript script = jexl.createScript(src);
if (expected == err) {
assertThrows(JexlException.class, () ->
script.execute(ctxt), msg);