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

Reply via email to