You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2022/04/25 10:18:45 UTC

[commons-jexl] branch JEXL-360 updated (64a2d7d4 -> 207a6e7c)

This is an automated email from the ASF dual-hosted git repository.

henrib pushed a change to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git


    from 64a2d7d4 JEXL-360: release notest
     add 3c405d09 Group some updates.
     add da3aa906 Bump actions/cache from 3 to 3.0.2
     add bab46ba1 Bump actions/setup-java from 2 to 3
     new 17011dc0 JEXL-360: added operators, syntax, basic tests
     new e30a253c JEXL-360: javadoc fix
     new 4de81c02 JEXL-360: checkstyle fix, allow star import for parser nodes
     new deafd379 JEXL-360: try a more refined arithmetic; - refactored tests;
     new 1c0ea015 JEXL-360: added operators, syntax, basic tests
     new 5d077d1f JEXL-360: javadoc fix
     new ed4da519 JEXL-360; rebased after JEXL-365
     new 881464dd JEXL-360: added operators, syntax, basic tests
     new 58ebee42 JEXL-360: javadoc fix
     new 5f041a3f JEXL-360: added operators, syntax, basic tests
     new 0bb73fcc JEXL-360: javadoc fix
     new a2a5f01c JEXL-360: release notest
     new 207a6e7c Merge branch 'JEXL-360' of https://gitbox.apache.org/repos/asf/commons-jexl into JEXL-360

The 13 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/maven.yml |  4 ++--
 src/changes/changes.xml     | 12 +++++++++---
 2 files changed, 11 insertions(+), 5 deletions(-)


[commons-jexl] 09/13: JEXL-360: javadoc fix

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 58ebee4278e6999bc8db4d74020a5699c94c3452
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 18:37:50 2022 +0100

    JEXL-360: javadoc fix
---
 src/main/java/org/apache/commons/jexl3/JexlOperator.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index a36e8f30..43fa03da 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,7 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -322,21 +322,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),


[commons-jexl] 08/13: JEXL-360: added operators, syntax, basic tests

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 881464dd7a631f76e6be5ed4c8f4b8f85b201f52
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 16:20:42 2022 +0100

    JEXL-360: added operators, syntax, basic tests
---
 .../org/apache/commons/jexl3/JexlOperator.java     | 45 ++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index 3a43d5b7..a36e8f30 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -104,6 +104,30 @@ public enum JexlOperator {
      */
     XOR("^", "xor", 2),
 
+    /**
+     * Bit-pattern right-shift operator.
+     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
+     * @see JexlArithmetic#shiftRight(Object, Object)
+     */
+    SHIFTRIGHT(">>", "shiftRight", 2),
+
+    /**
+     * Bit-pattern right-shift unsigned operator.
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
+     * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
+     */
+    SHIFTRIGHTU(">>>", "shiftRightUnsigned", 2),
+
+    /**
+     * Bit-pattern left-shift operator.
+     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
+     * @see JexlArithmetic#shiftLeft(Object, Object)
+     */
+    SHIFTLEFT("<<", "shiftLeft", 2),
+
     /**
      * Bit-pattern right-shift operator.
      * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
@@ -296,6 +320,27 @@ public enum JexlOperator {
      */
     SELF_XOR("^=", "selfXor", XOR),
 
+    /**
+     * Self-right-shift operator.
+     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
+     */
+    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+
+    /**
+     * Self-right-shift unsigned operator.
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
+     */
+    SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
+
+    /**
+     * Self-left-shift operator.
+     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
+     */
+    SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),
+
     /**
      * Self-right-shift operator.
      * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>


[commons-jexl] 05/13: JEXL-360: added operators, syntax, basic tests

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 1c0ea015d658db440937a91dc42ccf1136e3b299
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 16:20:42 2022 +0100

    JEXL-360: added operators, syntax, basic tests
---
 src/main/java/org/apache/commons/jexl3/JexlOperator.java | 14 +++++++-------
 src/main/java/org/apache/commons/jexl3/parser/Parser.jjt |  4 ++--
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index 3a43d5b7..daa68f35 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >> y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,7 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
+     * <br><strong>Syntax:</strong> <code>x << y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -298,21 +298,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
+     * <br><strong>Syntax:</strong> <code>x >>= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
+     * <br><strong>Syntax:</strong> <code>x << y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),
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 58d46906..9ad94800 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -582,7 +582,7 @@ void EqualityExpression() #void : {}
 void RelationalExpression() #void : {}
 {
   AdditiveExpression()
-  ( LOOKAHEAD(2) (
+  (
     (<lt> |<LT>)  AdditiveExpression() #LTNode(2)
    |
     (<gt> | <GT>) ShiftExpression() #GTNode(2)
@@ -602,7 +602,7 @@ void RelationalExpression() #void : {}
     <eeq> ShiftExpression() #EWNode(2) // ends with
    |
     <ene> AdditiveExpression() #NEWNode(2) // not ends with
-  ) )?
+  )?
 }
 
 /***************************************


[commons-jexl] 13/13: Merge branch 'JEXL-360' of https://gitbox.apache.org/repos/asf/commons-jexl into JEXL-360

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 207a6e7c001af7f1c71722902c9140203980d11d
Merge: a2a5f01c 64a2d7d4
Author: henrib <he...@apache.org>
AuthorDate: Mon Apr 25 12:16:50 2022 +0200

    Merge branch 'JEXL-360' of https://gitbox.apache.org/repos/asf/commons-jexl into JEXL-360



[commons-jexl] 03/13: JEXL-360: checkstyle fix, allow star import for parser nodes

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 4de81c021440e1620bda8cc03405de622c7f590d
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 19:05:30 2022 +0100

    JEXL-360: checkstyle fix, allow star import for parser nodes
---
 src/main/config/checkstyle.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/config/checkstyle.xml b/src/main/config/checkstyle.xml
index 2af2a528..cb82fd5d 100644
--- a/src/main/config/checkstyle.xml
+++ b/src/main/config/checkstyle.xml
@@ -55,7 +55,7 @@ limitations under the License.
 
   <module name="TreeWalker">
     <module name="AvoidStarImport">
-      <property name="excludes" value="org.junit.Assert"/>
+      <property name="excludes" value="org.junit.Assert,org.apache.commons.jexl3.parser"/>
     </module>
     <module name="RedundantImport"/>
     <module name="UnusedImports"/>


[commons-jexl] 06/13: JEXL-360: javadoc fix

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 5d077d1f0d803ef58f0aebff673b50e878af8aab
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 18:37:50 2022 +0100

    JEXL-360: javadoc fix
---
 src/main/java/org/apache/commons/jexl3/JexlOperator.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index daa68f35..3a43d5b7 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,7 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -298,21 +298,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),


[commons-jexl] 02/13: JEXL-360: javadoc fix

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit e30a253c6f3ce0d3cf4fb73774c313839eaedbf1
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 18:37:50 2022 +0100

    JEXL-360: javadoc fix
---
 src/main/java/org/apache/commons/jexl3/JexlOperator.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index daa68f35..3a43d5b7 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,7 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -298,21 +298,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),


[commons-jexl] 12/13: JEXL-360: release notest

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit a2a5f01ca64039d3bae9823cb9e723d83017f80b
Author: henrib <he...@apache.org>
AuthorDate: Mon Apr 11 18:27:20 2022 +0200

    JEXL-360: release notest
---
 RELEASE-NOTES.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 0053aa1e..a1d9b7c2 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -40,6 +40,7 @@ New Features in 3.3:
 ====================
 * JEXL-365:     Lambda expressions
 * JEXL-363:     Allow retrieving captured variables in script
+* JEXL-360:     Add missing bitshift operators ( >>, >>>, <<)
 * JEXL-359:     Allow per-operator arithmetic handling of null arguments
 * JEXL-357:     Configure accessible packages/classes/methods/fields
 


[commons-jexl] 07/13: JEXL-360; rebased after JEXL-365

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit ed4da519948e62df04c9f5864302f5b93c5c30fd
Author: henrib <he...@apache.org>
AuthorDate: Mon Apr 11 18:05:33 2022 +0200

    JEXL-360; rebased after JEXL-365
---
 src/main/java/org/apache/commons/jexl3/parser/Parser.jjt       | 10 +++++-----
 src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java |  6 +++---
 2 files changed, 8 insertions(+), 8 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 9ad94800..c3fd7fad 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -581,9 +581,9 @@ void EqualityExpression() #void : {}
 
 void RelationalExpression() #void : {}
 {
-  AdditiveExpression()
-  (
-    (<lt> |<LT>)  AdditiveExpression() #LTNode(2)
+  ShiftExpression()
+  ( LOOKAHEAD(2) (
+    (<lt> |<LT>)  ShiftExpression() #LTNode(2)
    |
     (<gt> | <GT>) ShiftExpression() #GTNode(2)
    |
@@ -601,8 +601,8 @@ void RelationalExpression() #void : {}
    |
     <eeq> ShiftExpression() #EWNode(2) // ends with
    |
-    <ene> AdditiveExpression() #NEWNode(2) // not ends with
-  )?
+    <ene> ShiftExpression() #NEWNode(2) // not ends with
+  ) )?
 }
 
 /***************************************
diff --git a/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java b/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java
index 2ee14b9c..2bff54d3 100644
--- a/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java
+++ b/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java
@@ -43,7 +43,7 @@ public class ShiftOperatorsTest extends JexlTestCase {
 
     @Test
     public void testLeftShiftIntValue() throws Exception {
-        final String expr = "(x, y)->{ x << y }";
+        final String expr = "(x, y)-> x << y";
         asserter.assertExpression(expr, 1L << 2, 1L, 2);
         asserter.assertExpression(expr, 1L << -2, 1L, -2);
         asserter.assertExpression(expr, -1L << 2, -1L, 2);
@@ -62,7 +62,7 @@ public class ShiftOperatorsTest extends JexlTestCase {
 
     @Test
     public void testRightShiftIntValue() throws Exception {
-        final String expr = "(x, y)->{ x >> y }";
+        final String expr = "(x, y)-> x >> y";
         asserter.assertExpression(expr, 42L >> 2, 42L, 2);
         asserter.assertExpression(expr, 42L >> -2, 42L, -2);
         asserter.assertExpression(expr, -42L >> 2, -42L, 2);
@@ -81,7 +81,7 @@ public class ShiftOperatorsTest extends JexlTestCase {
 
     @Test
     public void testRightShiftUnsignedIntValue() throws Exception {
-        final String expr = "(x, y)->{ x >>> y }";
+        final String expr = "(x, y)-> x >>> y";
         asserter.assertExpression(expr, 42L >>> 2, 42L, 2);
         asserter.assertExpression(expr, 42L >>> -2, 42L, -2);
         asserter.assertExpression(expr, -42L >>> 2, -42L, 2);


[commons-jexl] 11/13: JEXL-360: javadoc fix

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 0bb73fcc9a8736778972d56edd982958a832e40d
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 18:37:50 2022 +0100

    JEXL-360: javadoc fix
---
 src/main/java/org/apache/commons/jexl3/JexlOperator.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index daa68f35..3a43d5b7 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,7 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -298,21 +298,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),


[commons-jexl] 01/13: JEXL-360: added operators, syntax, basic tests

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 17011dc0e5b9f60a5dbef3f867d327beb5439613
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 16:20:42 2022 +0100

    JEXL-360: added operators, syntax, basic tests
---
 .../org/apache/commons/jexl3/JexlArithmetic.java   |  39 +++++++
 .../org/apache/commons/jexl3/JexlOperator.java     |  45 ++++++++
 .../apache/commons/jexl3/internal/Debugger.java    | 109 +++++-------------
 .../apache/commons/jexl3/internal/Interpreter.java | 128 +++++++++------------
 .../apache/commons/jexl3/internal/Operators.java   |   6 +
 .../commons/jexl3/internal/ScriptVisitor.java      | 106 +++++------------
 .../org/apache/commons/jexl3/parser/Parser.jjt     |  39 +++++--
 .../apache/commons/jexl3/parser/ParserVisitor.java |  12 ++
 .../org/apache/commons/jexl3/ArithmeticTest.java   |  30 +++++
 9 files changed, 277 insertions(+), 237 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java b/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
index 9c3033ab..b34d3678 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
@@ -1308,6 +1308,45 @@ public class JexlArithmetic {
         return !toBoolean(val);
     }
 
+    /**
+     * Shifts a bit pattern to the right.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &lt;&lt; right.
+     */
+    public Object shiftLeft(Object left, Object right) {
+        final long l = toLong(left);
+        final int r = toInteger(right);
+        return l << r;
+    }
+
+    /**
+     * Shifts a bit pattern to the right.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &gt;&gt; right.
+     */
+    public Object shiftRight(Object left, Object right) {
+        final long l = toLong(left);
+        final long r = toInteger(right);
+        return l >> r;
+    }
+
+    /**
+     * Shifts a bit pattern to the right unsigned.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &gt;&gt;&gt; right.
+     */
+    public Object shiftRightUnsigned(Object left, Object right) {
+        final long l = toLong(left);
+        final long r = toInteger(right);
+        return l >>> r;
+    }
+
     /**
      * Performs a comparison.
      *
diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index 6f21e411..daa68f35 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -104,6 +104,30 @@ public enum JexlOperator {
      */
     XOR("^", "xor", 2),
 
+    /**
+     * Bit-pattern right-shift operator.
+     * <br><strong>Syntax:</strong> <code>x >> y</code>
+     * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
+     * @see JexlArithmetic#shiftRight(Object, Object)
+     */
+    SHIFTRIGHT(">>", "shiftRight", 2),
+
+    /**
+     * Bit-pattern right-shift unsigned operator.
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
+     * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
+     */
+    SHIFTRIGHTU(">>>", "shiftRightUnsigned", 2),
+
+    /**
+     * Bit-pattern left-shift operator.
+     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
+     * @see JexlArithmetic#shiftLeft(Object, Object)
+     */
+    SHIFTLEFT("<<", "shiftLeft", 2),
+
     /**
      * Equals operator.
      * <br><strong>Syntax:</strong> <code>x == y</code>
@@ -272,6 +296,27 @@ public enum JexlOperator {
      */
     SELF_XOR("^=", "selfXor", XOR),
 
+    /**
+     * Self-right-shift operator.
+     * <br><strong>Syntax:</strong> <code>x >>= y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
+     */
+    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
+
+    /**
+     * Self-right-shift unsigned operator.
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
+     */
+    SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
+
+    /**
+     * Self-left-shift operator.
+     * <br><strong>Syntax:</strong> <code>x << y</code>
+     * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
+     */
+    SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),
+
     /**
      * Marker for side effect.
      * <br>Returns this from 'self*' overload method to let the engine know the side effect has been performed and
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Debugger.java b/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
index 55ef75a6..dcd6ea4b 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
@@ -20,86 +20,9 @@ package org.apache.commons.jexl3.internal;
 import org.apache.commons.jexl3.JexlExpression;
 import org.apache.commons.jexl3.JexlInfo;
 import org.apache.commons.jexl3.JexlScript;
-import org.apache.commons.jexl3.parser.ASTAddNode;
-import org.apache.commons.jexl3.parser.ASTAndNode;
-import org.apache.commons.jexl3.parser.ASTArguments;
-import org.apache.commons.jexl3.parser.ASTArrayAccess;
-import org.apache.commons.jexl3.parser.ASTArrayLiteral;
-import org.apache.commons.jexl3.parser.ASTAssignment;
-import org.apache.commons.jexl3.parser.ASTBitwiseAndNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseComplNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseOrNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseXorNode;
-import org.apache.commons.jexl3.parser.ASTBlock;
-import org.apache.commons.jexl3.parser.ASTBreak;
-import org.apache.commons.jexl3.parser.ASTConstructorNode;
-import org.apache.commons.jexl3.parser.ASTContinue;
-import org.apache.commons.jexl3.parser.ASTDivNode;
-import org.apache.commons.jexl3.parser.ASTDoWhileStatement;
-import org.apache.commons.jexl3.parser.ASTEQNode;
-import org.apache.commons.jexl3.parser.ASTERNode;
-import org.apache.commons.jexl3.parser.ASTEWNode;
-import org.apache.commons.jexl3.parser.ASTEmptyFunction;
-import org.apache.commons.jexl3.parser.ASTExtendedLiteral;
-import org.apache.commons.jexl3.parser.ASTFalseNode;
-import org.apache.commons.jexl3.parser.ASTForeachStatement;
-import org.apache.commons.jexl3.parser.ASTFunctionNode;
-import org.apache.commons.jexl3.parser.ASTGENode;
-import org.apache.commons.jexl3.parser.ASTGTNode;
-import org.apache.commons.jexl3.parser.ASTIdentifier;
-import org.apache.commons.jexl3.parser.ASTIdentifierAccess;
-import org.apache.commons.jexl3.parser.ASTIfStatement;
-import org.apache.commons.jexl3.parser.ASTJexlLambda;
-import org.apache.commons.jexl3.parser.ASTJexlScript;
-import org.apache.commons.jexl3.parser.ASTJxltLiteral;
-import org.apache.commons.jexl3.parser.ASTLENode;
-import org.apache.commons.jexl3.parser.ASTLTNode;
-import org.apache.commons.jexl3.parser.ASTMapEntry;
-import org.apache.commons.jexl3.parser.ASTMapLiteral;
-import org.apache.commons.jexl3.parser.ASTMethodNode;
-import org.apache.commons.jexl3.parser.ASTModNode;
-import org.apache.commons.jexl3.parser.ASTMulNode;
-import org.apache.commons.jexl3.parser.ASTNENode;
-import org.apache.commons.jexl3.parser.ASTNEWNode;
-import org.apache.commons.jexl3.parser.ASTNRNode;
-import org.apache.commons.jexl3.parser.ASTNSWNode;
-import org.apache.commons.jexl3.parser.ASTNotNode;
-import org.apache.commons.jexl3.parser.ASTNullLiteral;
-import org.apache.commons.jexl3.parser.ASTNumberLiteral;
-import org.apache.commons.jexl3.parser.ASTOrNode;
-import org.apache.commons.jexl3.parser.ASTRangeNode;
-import org.apache.commons.jexl3.parser.ASTReference;
-import org.apache.commons.jexl3.parser.ASTReferenceExpression;
-import org.apache.commons.jexl3.parser.ASTRegexLiteral;
-import org.apache.commons.jexl3.parser.ASTReturnStatement;
-import org.apache.commons.jexl3.parser.ASTSWNode;
-import org.apache.commons.jexl3.parser.ASTSetAddNode;
-import org.apache.commons.jexl3.parser.ASTSetAndNode;
-import org.apache.commons.jexl3.parser.ASTSetDivNode;
-import org.apache.commons.jexl3.parser.ASTSetLiteral;
-import org.apache.commons.jexl3.parser.ASTSetModNode;
-import org.apache.commons.jexl3.parser.ASTSetMultNode;
-import org.apache.commons.jexl3.parser.ASTSetOrNode;
-import org.apache.commons.jexl3.parser.ASTSetSubNode;
-import org.apache.commons.jexl3.parser.ASTSetXorNode;
-import org.apache.commons.jexl3.parser.ASTSizeFunction;
-import org.apache.commons.jexl3.parser.ASTStringLiteral;
-import org.apache.commons.jexl3.parser.ASTSubNode;
-import org.apache.commons.jexl3.parser.ASTTernaryNode;
-import org.apache.commons.jexl3.parser.ASTTrueNode;
-import org.apache.commons.jexl3.parser.ASTUnaryMinusNode;
-import org.apache.commons.jexl3.parser.ASTVar;
-import org.apache.commons.jexl3.parser.ASTWhileStatement;
-import org.apache.commons.jexl3.parser.ASTAnnotatedStatement;
-import org.apache.commons.jexl3.parser.ASTAnnotation;
-import org.apache.commons.jexl3.parser.ASTNullpNode;
-
-import org.apache.commons.jexl3.parser.JexlNode;
-import org.apache.commons.jexl3.parser.ParserVisitor;
+import org.apache.commons.jexl3.parser.*;
 
 import java.util.regex.Pattern;
-import org.apache.commons.jexl3.parser.ASTUnaryPlusNode;
-import org.apache.commons.jexl3.parser.StringParser;
 
 /**
  * Helps pinpoint the cause of problems in expressions that fail during evaluation.
@@ -520,6 +443,21 @@ public class Debugger extends ParserVisitor implements JexlInfo.Detail {
         return infixChildren(node, " & ", false, data);
     }
 
+    @Override
+    protected Object visit(final ASTShiftRightNode node, final Object data) {
+        return infixChildren(node, " >> ", false, data);
+    }
+
+    @Override
+    protected Object visit(final ASTShiftRightUnsignedNode node, final Object data) {
+        return infixChildren(node, " >>> ", false, data);
+    }
+
+    @Override
+    protected Object visit(final ASTShiftLeftNode node, final Object data) {
+        return infixChildren(node, " << ", false, data);
+    }
+
     @Override
     protected Object visit(final ASTBitwiseComplNode node, final Object data) {
         return prefixChild(node, "~", data);
@@ -1097,6 +1035,21 @@ public class Debugger extends ParserVisitor implements JexlInfo.Detail {
         return infixChildren(node, " ^= ", false, data);
     }
 
+    @Override
+    protected Object visit(final ASTSetShiftRightNode node, final Object data) {
+        return infixChildren(node, " >>= ", false, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftRightUnsignedNode node, final Object data) {
+        return infixChildren(node, " >>>= ", false, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftLeftNode node, final Object data) {
+        return infixChildren(node, " <<= ", false, data);
+    }
+
     @Override
     protected Object visit(final ASTAnnotation node, final Object data) {
         final int num = node.jjtGetNumChildren();
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 226040e6..469e184d 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
@@ -33,82 +33,7 @@ import org.apache.commons.jexl3.JxltEngine;
 import org.apache.commons.jexl3.introspection.JexlMethod;
 import org.apache.commons.jexl3.introspection.JexlPropertyGet;
 
-import org.apache.commons.jexl3.parser.ASTAddNode;
-import org.apache.commons.jexl3.parser.ASTAndNode;
-import org.apache.commons.jexl3.parser.ASTAnnotatedStatement;
-import org.apache.commons.jexl3.parser.ASTAnnotation;
-import org.apache.commons.jexl3.parser.ASTArguments;
-import org.apache.commons.jexl3.parser.ASTArrayAccess;
-import org.apache.commons.jexl3.parser.ASTArrayLiteral;
-import org.apache.commons.jexl3.parser.ASTAssignment;
-import org.apache.commons.jexl3.parser.ASTBitwiseAndNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseComplNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseOrNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseXorNode;
-import org.apache.commons.jexl3.parser.ASTBlock;
-import org.apache.commons.jexl3.parser.ASTBreak;
-import org.apache.commons.jexl3.parser.ASTConstructorNode;
-import org.apache.commons.jexl3.parser.ASTContinue;
-import org.apache.commons.jexl3.parser.ASTDivNode;
-import org.apache.commons.jexl3.parser.ASTDoWhileStatement;
-import org.apache.commons.jexl3.parser.ASTEQNode;
-import org.apache.commons.jexl3.parser.ASTERNode;
-import org.apache.commons.jexl3.parser.ASTEWNode;
-import org.apache.commons.jexl3.parser.ASTEmptyFunction;
-import org.apache.commons.jexl3.parser.ASTExtendedLiteral;
-import org.apache.commons.jexl3.parser.ASTFalseNode;
-import org.apache.commons.jexl3.parser.ASTForeachStatement;
-import org.apache.commons.jexl3.parser.ASTFunctionNode;
-import org.apache.commons.jexl3.parser.ASTGENode;
-import org.apache.commons.jexl3.parser.ASTGTNode;
-import org.apache.commons.jexl3.parser.ASTIdentifier;
-import org.apache.commons.jexl3.parser.ASTIdentifierAccess;
-import org.apache.commons.jexl3.parser.ASTIdentifierAccessJxlt;
-import org.apache.commons.jexl3.parser.ASTIfStatement;
-import org.apache.commons.jexl3.parser.ASTJexlLambda;
-import org.apache.commons.jexl3.parser.ASTJexlScript;
-import org.apache.commons.jexl3.parser.ASTJxltLiteral;
-import org.apache.commons.jexl3.parser.ASTLENode;
-import org.apache.commons.jexl3.parser.ASTLTNode;
-import org.apache.commons.jexl3.parser.ASTMapEntry;
-import org.apache.commons.jexl3.parser.ASTMapLiteral;
-import org.apache.commons.jexl3.parser.ASTMethodNode;
-import org.apache.commons.jexl3.parser.ASTModNode;
-import org.apache.commons.jexl3.parser.ASTMulNode;
-import org.apache.commons.jexl3.parser.ASTNENode;
-import org.apache.commons.jexl3.parser.ASTNEWNode;
-import org.apache.commons.jexl3.parser.ASTNRNode;
-import org.apache.commons.jexl3.parser.ASTNSWNode;
-import org.apache.commons.jexl3.parser.ASTNotNode;
-import org.apache.commons.jexl3.parser.ASTNullLiteral;
-import org.apache.commons.jexl3.parser.ASTNullpNode;
-import org.apache.commons.jexl3.parser.ASTNumberLiteral;
-import org.apache.commons.jexl3.parser.ASTOrNode;
-import org.apache.commons.jexl3.parser.ASTRangeNode;
-import org.apache.commons.jexl3.parser.ASTReference;
-import org.apache.commons.jexl3.parser.ASTReferenceExpression;
-import org.apache.commons.jexl3.parser.ASTRegexLiteral;
-import org.apache.commons.jexl3.parser.ASTReturnStatement;
-import org.apache.commons.jexl3.parser.ASTSWNode;
-import org.apache.commons.jexl3.parser.ASTSetAddNode;
-import org.apache.commons.jexl3.parser.ASTSetAndNode;
-import org.apache.commons.jexl3.parser.ASTSetDivNode;
-import org.apache.commons.jexl3.parser.ASTSetLiteral;
-import org.apache.commons.jexl3.parser.ASTSetModNode;
-import org.apache.commons.jexl3.parser.ASTSetMultNode;
-import org.apache.commons.jexl3.parser.ASTSetOrNode;
-import org.apache.commons.jexl3.parser.ASTSetSubNode;
-import org.apache.commons.jexl3.parser.ASTSetXorNode;
-import org.apache.commons.jexl3.parser.ASTSizeFunction;
-import org.apache.commons.jexl3.parser.ASTStringLiteral;
-import org.apache.commons.jexl3.parser.ASTSubNode;
-import org.apache.commons.jexl3.parser.ASTTernaryNode;
-import org.apache.commons.jexl3.parser.ASTTrueNode;
-import org.apache.commons.jexl3.parser.ASTUnaryMinusNode;
-import org.apache.commons.jexl3.parser.ASTUnaryPlusNode;
-import org.apache.commons.jexl3.parser.ASTVar;
-import org.apache.commons.jexl3.parser.ASTWhileStatement;
-import org.apache.commons.jexl3.parser.JexlNode;
+import org.apache.commons.jexl3.parser.*;
 
 /**
  * An interpreter of JEXL syntax.
@@ -358,6 +283,42 @@ public class Interpreter extends InterpreterBase {
         }
     }
 
+    @Override
+    protected Object visit(final ASTShiftLeftNode node, final Object data) {
+        final Object left = node.jjtGetChild(0).jjtAccept(this, data);
+        final Object right = node.jjtGetChild(1).jjtAccept(this, data);
+        try {
+            final Object result = operators.tryOverload(node, JexlOperator.SHIFTLEFT, left, right);
+            return result != JexlEngine.TRY_FAILED ? result : arithmetic.shiftLeft(left, right);
+        } catch (final ArithmeticException xrt) {
+            throw new JexlException(findNullOperand(node, left, right), "<< error", xrt);
+        }
+    }
+
+    @Override
+    protected Object visit(final ASTShiftRightNode node, final Object data) {
+        final Object left = node.jjtGetChild(0).jjtAccept(this, data);
+        final Object right = node.jjtGetChild(1).jjtAccept(this, data);
+        try {
+            final Object result = operators.tryOverload(node, JexlOperator.SHIFTRIGHT, left, right);
+            return result != JexlEngine.TRY_FAILED ? result : arithmetic.shiftRight(left, right);
+        } catch (final ArithmeticException xrt) {
+            throw new JexlException(findNullOperand(node, left, right), ">> error", xrt);
+        }
+    }
+
+    @Override
+    protected Object visit(final ASTShiftRightUnsignedNode node, final Object data) {
+        final Object left = node.jjtGetChild(0).jjtAccept(this, data);
+        final Object right = node.jjtGetChild(1).jjtAccept(this, data);
+        try {
+            final Object result = operators.tryOverload(node, JexlOperator.SHIFTRIGHTU, left, right);
+            return result != JexlEngine.TRY_FAILED ? result : arithmetic.shiftRightUnsigned(left, right);
+        } catch (final ArithmeticException xrt) {
+            throw new JexlException(findNullOperand(node, left, right), ">> error", xrt);
+        }
+    }
+
     @Override
     protected Object visit(final ASTEQNode node, final Object data) {
         final Object left = node.jjtGetChild(0).jjtAccept(this, data);
@@ -1277,6 +1238,21 @@ public class Interpreter extends InterpreterBase {
         return executeAssign(node, JexlOperator.SELF_XOR, data);
     }
 
+    @Override
+    protected Object visit(final ASTSetShiftLeftNode node, final Object data) {
+        return executeAssign(node, JexlOperator.SELF_SHIFTLEFT, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftRightNode node, final Object data) {
+        return executeAssign(node, JexlOperator.SELF_SHIFTRIGHT, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftRightUnsignedNode node, final Object data) {
+        return executeAssign(node, JexlOperator.SELF_SHIFTRIGHTU, data);
+    }
+
     /**
      * Executes an assignment with an optional side-effect operator.
      * @param node     the node
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Operators.java b/src/main/java/org/apache/commons/jexl3/internal/Operators.java
index a72dc1d6..e26d1ea3 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Operators.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Operators.java
@@ -187,6 +187,12 @@ public class Operators {
                     return arithmetic.or(args[0], args[1]);
                 case SELF_XOR:
                     return arithmetic.xor(args[0], args[1]);
+                case SELF_SHIFTLEFT:
+                    return arithmetic.shiftLeft(args[0], args[1]);
+                case SELF_SHIFTRIGHT:
+                    return arithmetic.shiftRight(args[0], args[1]);
+                case SELF_SHIFTRIGHTU:
+                    return arithmetic.shiftRightUnsigned(args[0], args[1]);
                 default:
                     // unexpected, new operator added?
                     throw new UnsupportedOperationException(operator.getOperatorSymbol());
diff --git a/src/main/java/org/apache/commons/jexl3/internal/ScriptVisitor.java b/src/main/java/org/apache/commons/jexl3/internal/ScriptVisitor.java
index 19afd277..bdcd51e4 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/ScriptVisitor.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/ScriptVisitor.java
@@ -18,81 +18,7 @@ package org.apache.commons.jexl3.internal;
 
 import org.apache.commons.jexl3.JexlExpression;
 import org.apache.commons.jexl3.JexlScript;
-import org.apache.commons.jexl3.parser.ASTAddNode;
-import org.apache.commons.jexl3.parser.ASTAndNode;
-import org.apache.commons.jexl3.parser.ASTAnnotatedStatement;
-import org.apache.commons.jexl3.parser.ASTAnnotation;
-import org.apache.commons.jexl3.parser.ASTArguments;
-import org.apache.commons.jexl3.parser.ASTArrayAccess;
-import org.apache.commons.jexl3.parser.ASTArrayLiteral;
-import org.apache.commons.jexl3.parser.ASTAssignment;
-import org.apache.commons.jexl3.parser.ASTBitwiseAndNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseComplNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseOrNode;
-import org.apache.commons.jexl3.parser.ASTBitwiseXorNode;
-import org.apache.commons.jexl3.parser.ASTBlock;
-import org.apache.commons.jexl3.parser.ASTBreak;
-import org.apache.commons.jexl3.parser.ASTConstructorNode;
-import org.apache.commons.jexl3.parser.ASTContinue;
-import org.apache.commons.jexl3.parser.ASTDivNode;
-import org.apache.commons.jexl3.parser.ASTDoWhileStatement;
-import org.apache.commons.jexl3.parser.ASTEQNode;
-import org.apache.commons.jexl3.parser.ASTERNode;
-import org.apache.commons.jexl3.parser.ASTEWNode;
-import org.apache.commons.jexl3.parser.ASTEmptyFunction;
-import org.apache.commons.jexl3.parser.ASTExtendedLiteral;
-import org.apache.commons.jexl3.parser.ASTFalseNode;
-import org.apache.commons.jexl3.parser.ASTForeachStatement;
-import org.apache.commons.jexl3.parser.ASTFunctionNode;
-import org.apache.commons.jexl3.parser.ASTGENode;
-import org.apache.commons.jexl3.parser.ASTGTNode;
-import org.apache.commons.jexl3.parser.ASTIdentifier;
-import org.apache.commons.jexl3.parser.ASTIdentifierAccess;
-import org.apache.commons.jexl3.parser.ASTIfStatement;
-import org.apache.commons.jexl3.parser.ASTJexlScript;
-import org.apache.commons.jexl3.parser.ASTJxltLiteral;
-import org.apache.commons.jexl3.parser.ASTLENode;
-import org.apache.commons.jexl3.parser.ASTLTNode;
-import org.apache.commons.jexl3.parser.ASTMapEntry;
-import org.apache.commons.jexl3.parser.ASTMapLiteral;
-import org.apache.commons.jexl3.parser.ASTMethodNode;
-import org.apache.commons.jexl3.parser.ASTModNode;
-import org.apache.commons.jexl3.parser.ASTMulNode;
-import org.apache.commons.jexl3.parser.ASTNENode;
-import org.apache.commons.jexl3.parser.ASTNEWNode;
-import org.apache.commons.jexl3.parser.ASTNRNode;
-import org.apache.commons.jexl3.parser.ASTNSWNode;
-import org.apache.commons.jexl3.parser.ASTNotNode;
-import org.apache.commons.jexl3.parser.ASTNullLiteral;
-import org.apache.commons.jexl3.parser.ASTNullpNode;
-import org.apache.commons.jexl3.parser.ASTNumberLiteral;
-import org.apache.commons.jexl3.parser.ASTOrNode;
-import org.apache.commons.jexl3.parser.ASTRangeNode;
-import org.apache.commons.jexl3.parser.ASTReference;
-import org.apache.commons.jexl3.parser.ASTReferenceExpression;
-import org.apache.commons.jexl3.parser.ASTRegexLiteral;
-import org.apache.commons.jexl3.parser.ASTReturnStatement;
-import org.apache.commons.jexl3.parser.ASTSWNode;
-import org.apache.commons.jexl3.parser.ASTSetAddNode;
-import org.apache.commons.jexl3.parser.ASTSetAndNode;
-import org.apache.commons.jexl3.parser.ASTSetDivNode;
-import org.apache.commons.jexl3.parser.ASTSetLiteral;
-import org.apache.commons.jexl3.parser.ASTSetModNode;
-import org.apache.commons.jexl3.parser.ASTSetMultNode;
-import org.apache.commons.jexl3.parser.ASTSetOrNode;
-import org.apache.commons.jexl3.parser.ASTSetSubNode;
-import org.apache.commons.jexl3.parser.ASTSetXorNode;
-import org.apache.commons.jexl3.parser.ASTSizeFunction;
-import org.apache.commons.jexl3.parser.ASTStringLiteral;
-import org.apache.commons.jexl3.parser.ASTSubNode;
-import org.apache.commons.jexl3.parser.ASTTernaryNode;
-import org.apache.commons.jexl3.parser.ASTTrueNode;
-import org.apache.commons.jexl3.parser.ASTUnaryMinusNode;
-import org.apache.commons.jexl3.parser.ASTUnaryPlusNode;
-import org.apache.commons.jexl3.parser.ASTVar;
-import org.apache.commons.jexl3.parser.ASTWhileStatement;
-import org.apache.commons.jexl3.parser.JexlNode;
-import org.apache.commons.jexl3.parser.ParserVisitor;
+import org.apache.commons.jexl3.parser.*;
 
 /**
  * Fully abstract to avoid public interface exposition.
@@ -230,6 +156,21 @@ public class ScriptVisitor extends ParserVisitor {
         return visitNode(node, data);
     }
 
+    @Override
+    protected Object visit(final ASTShiftLeftNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
+    @Override
+    protected Object visit(final ASTShiftRightUnsignedNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
+    @Override
+    protected Object visit(final ASTShiftRightNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
     @Override
     protected Object visit(final ASTEQNode node, final Object data) {
         return visitNode(node, data);
@@ -485,6 +426,21 @@ public class ScriptVisitor extends ParserVisitor {
         return visitNode(node, data);
     }
 
+    @Override
+    protected Object visit(final ASTSetShiftLeftNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftRightUnsignedNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
+    @Override
+    protected Object visit(final ASTSetShiftRightNode node, final Object data) {
+        return visitNode(node, data);
+    }
+
     @Override
     protected Object visit(final ASTJxltLiteral node, final Object data) {
         return visitNode(node, data);
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 633e49c2..58d46906 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -195,6 +195,9 @@ TOKEN_MGR_DECLS : {
     | < and_assign : "&=" >
     | < or_assign : "|=" >
     | < xor_assign : "^=" >
+    | < lshift_assign : "<<=" >
+    | < rshiftu_assign : ">>>=" >
+    | < rshift_assign : ">>=" >
 
     | < assign : "=" >
     | < plus : "+" >
@@ -209,6 +212,9 @@ TOKEN_MGR_DECLS : {
     | < and : "&" >
     | < or : "|" >
     | < xor : "^" >
+    | < lshift : "<<" >
+    | < rshiftu : ">>>" >
+    | < rshift : ">>" >
 
     | < tilda : "~" >
     | < range : ".." >
@@ -504,6 +510,12 @@ void AssignmentExpression() #void : {}
     <xor_assign> Expression() #SetXorNode(2)
   |
     <minus_assign>  Expression() #SetSubNode(2)
+  |
+    <lshift_assign>  Expression() #SetShiftLeftNode(2)
+  |
+    <rshift_assign>  Expression() #SetShiftRightNode(2)
+  |
+    <rshiftu_assign>  Expression() #SetShiftRightUnsignedNode(2)
   |
     <assign> Expression() #Assignment(2)
   ) )*
@@ -573,21 +585,21 @@ void RelationalExpression() #void : {}
   ( LOOKAHEAD(2) (
     (<lt> |<LT>)  AdditiveExpression() #LTNode(2)
    |
-    (<gt> | <GT>) AdditiveExpression() #GTNode(2)
+    (<gt> | <GT>) ShiftExpression() #GTNode(2)
    |
-    (<le> | <LE>) AdditiveExpression() #LENode(2)
+    (<le> | <LE>) ShiftExpression() #LENode(2)
    |
-    (<ge> | <GE>) AdditiveExpression() #GENode(2)
+    (<ge> | <GE>) ShiftExpression() #GENode(2)
    |
-    <req> AdditiveExpression() #ERNode(2) // equals regexp
+    <req> ShiftExpression() #ERNode(2) // equals regexp
    |
-    <rne> AdditiveExpression() #NRNode(2) // not equals regexp
+    <rne> ShiftExpression() #NRNode(2) // not equals regexp
    |
-    <seq> AdditiveExpression() #SWNode(2) // starts with
+    <seq> ShiftExpression() #SWNode(2) // starts with
    |
-    <sne> AdditiveExpression() #NSWNode(2) // not starts with
+    <sne> ShiftExpression() #NSWNode(2) // not starts with
    |
-    <eeq> AdditiveExpression() #EWNode(2) // ends with
+    <eeq> ShiftExpression() #EWNode(2) // ends with
    |
     <ene> AdditiveExpression() #NEWNode(2) // not ends with
   ) )?
@@ -596,6 +608,17 @@ void RelationalExpression() #void : {}
 /***************************************
  *      Arithmetic
  ***************************************/
+void ShiftExpression() #void : {}
+{
+    AdditiveExpression()
+    ( LOOKAHEAD(2) (
+      <lshift> AdditiveExpression() #ShiftLeftNode(2) // left shift
+    |
+      <rshift> AdditiveExpression() #ShiftRightNode(2) // right shift
+    |
+      <rshiftu> AdditiveExpression() #ShiftRightUnsignedNode(2) // right shift unsigned
+    ) )*
+}
 
 void AdditiveExpression() #void : {}
 {
diff --git a/src/main/java/org/apache/commons/jexl3/parser/ParserVisitor.java b/src/main/java/org/apache/commons/jexl3/parser/ParserVisitor.java
index 876a61b1..a6560225 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/ParserVisitor.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/ParserVisitor.java
@@ -78,6 +78,12 @@ public abstract class ParserVisitor {
 
     protected abstract Object visit(ASTBitwiseAndNode node, Object data);
 
+    protected abstract Object visit(ASTShiftLeftNode node, final Object data);
+
+    protected abstract Object visit(ASTShiftRightNode node, final Object data);
+
+    protected abstract Object visit(ASTShiftRightUnsignedNode node, final Object data);
+
     protected abstract Object visit(ASTEQNode node, Object data);
 
     protected abstract Object visit(ASTNENode node, Object data);
@@ -180,6 +186,12 @@ public abstract class ParserVisitor {
 
     protected abstract Object visit(ASTSetXorNode node, Object data);
 
+    protected abstract Object visit(ASTSetShiftLeftNode node, final Object data);
+
+    protected abstract Object visit(ASTSetShiftRightNode node, final Object data);
+
+    protected abstract Object visit(ASTSetShiftRightUnsignedNode node, final Object data);
+
     protected abstract Object visit(ASTJxltLiteral node, Object data);
 
     protected abstract Object visit(ASTAnnotation node, Object data);
diff --git a/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java b/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
index 91f704c3..8b8cacc5 100644
--- a/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
+++ b/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
@@ -980,6 +980,18 @@ public class ArithmeticTest extends JexlTestCase {
             return new Var(lhs.value ^ rhs.value);
         }
 
+        public Var shiftRight(final Var lhs, final Var rhs) {
+            return new Var(lhs.value >> rhs.value);
+        }
+
+        public Var shiftRightUnsigned(final Var lhs, final Var rhs) {
+            return new Var(lhs.value >>> rhs.value);
+        }
+
+        public Var shiftLeft(final Var lhs, final Var rhs) {
+            return new Var(lhs.value << rhs.value);
+        }
+
         public Boolean contains(final Var lhs, final Var rhs) {
             return lhs.toString().contains(rhs.toString());
         }
@@ -1163,6 +1175,24 @@ public class ArithmeticTest extends JexlTestCase {
         result = script.execute(jc, new Var(35), new Var(7));
         Assert.assertEquals(36L, ((Var) result).value);
 
+        script = jexl.createScript("(x, y)->{ x << y }");
+        result = script.execute(jc, 35, 1);
+        Assert.assertEquals(70L, result);
+        result = script.execute(jc, new Var(35), new Var(1));
+        Assert.assertEquals(70L, ((Var) result).value);
+
+        script = jexl.createScript("(x, y)->{ x >> y }");
+        result = script.execute(jc, 42, 1);
+        Assert.assertEquals(21L, result);
+        result = script.execute(jc, new Var(42), new Var(1));
+        Assert.assertEquals(21, ((Var) result).value);
+
+        script = jexl.createScript("(x, y)->{ x >>> y }");
+        result = script.execute(jc, 84, 2);
+        Assert.assertEquals(21L, result);
+        result = script.execute(jc, new Var(84), new Var(2));
+        Assert.assertEquals(21, ((Var) result).value);
+
         script = jexl.createScript("(x, y)->{ x & y }");
         result = script.execute(jc, 35, 7);
         Assert.assertEquals(3L, result);


[commons-jexl] 04/13: JEXL-360: try a more refined arithmetic; - refactored tests;

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit deafd379683632976e5dc37a01114dc7d293795e
Author: henrib <he...@apache.org>
AuthorDate: Thu Feb 17 18:03:25 2022 +0100

    JEXL-360: try a more refined arithmetic;
    - refactored tests;
---
 .../org/apache/commons/jexl3/Arithmetic360.java    | 221 +++++++++++++++++++++
 .../apache/commons/jexl3/ShiftOperatorsTest.java   | 185 +++++++++++++++++
 .../org/apache/commons/jexl3/junit/Asserter.java   |   4 +-
 3 files changed, 408 insertions(+), 2 deletions(-)

diff --git a/src/test/java/org/apache/commons/jexl3/Arithmetic360.java b/src/test/java/org/apache/commons/jexl3/Arithmetic360.java
new file mode 100644
index 00000000..aacde4b1
--- /dev/null
+++ b/src/test/java/org/apache/commons/jexl3/Arithmetic360.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.jexl3;
+
+import java.math.BigInteger;
+import java.math.MathContext;
+
+/**
+ * An arithmetic that tries to keep argument types for bit-twiddling operators.
+ */
+public class Arithmetic360 extends JexlArithmetic {
+    public Arithmetic360(boolean astrict) {
+        super(astrict);
+    }
+
+    public Arithmetic360(boolean astrict, MathContext bigdContext, int bigdScale) {
+        super(astrict, bigdContext, bigdScale);
+    }
+
+    /**
+     * Given a long, attempt to narrow it to an int.
+     * <p>Narrowing will only occur if no operand is a Long.
+     * @param lhs  the left-hand side operand that lead to the long result
+     * @param rhs  the right-hand side operand that lead to the long result
+     * @param result the long to narrow
+     * @return an Integer if narrowing is possible, the original Long otherwise
+     */
+    protected Number narrowLong(final Object lhs, final Object rhs, final long result) {
+        if (!(lhs instanceof Long || rhs instanceof Long)) {
+            final int ir = (int) result;
+            if (result == (long) ir) {
+                return ir;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Given a long, attempt to narrow it to an int.
+     * <p>Narrowing will only occur if the initial operand is not a Long.
+     * @param operand  the operand that lead to the long result
+     * @param result the long result to narrow
+     * @return an Integer if narrowing is possible, the original Long otherwise
+     */
+    protected Number narrowLong(final Object operand, final long result) {
+        if (!(operand instanceof Long)) {
+            final int ir = (int) result;
+            if (result == (long) ir) {
+                return ir;
+            }
+        }
+        return result;
+    }
+    /**
+     * Checks if value class is a number that can be represented exactly in a long.
+     *
+     * @param value  argument
+     * @return true if argument can be represented by a long
+     */
+    protected Number asIntNumber(final Object value) {
+        return value instanceof Integer
+                || value instanceof Short
+                || value instanceof Byte
+                ? (Number) value
+                : null;
+    }
+
+    /**
+     * Casts to Long if possible.
+     * @param value the Long or else
+     * @return the Long or null
+     */
+    protected Long castLongNumber(final Object value) {
+        return value instanceof Long ? (Long) value : null;
+    }
+
+    /**
+     * Performs a bitwise and.
+     *
+     * @param left  the left operand
+     * @param right the right operator
+     * @return left &amp; right
+     */
+    public Object and(final Object left, final Object right) {
+        final Number l = asLongNumber(left);
+        final Number r = asLongNumber(right);
+        if (l != null && r != null) {
+            return narrowLong(left, right, l.longValue() & r.longValue());
+        }
+        return toBigInteger(left).and(toBigInteger(right));
+    }
+
+    /**
+     * Performs a bitwise or.
+     *
+     * @param left  the left operand
+     * @param right the right operator
+     * @return left | right
+     */
+    public Object or(final Object left, final Object right) {
+        final Number l = asLongNumber(left);
+        final Number r = asLongNumber(right);
+        if (l != null && r != null) {
+            return narrowLong(left, right, l.longValue() | r.longValue());
+        }
+        return toBigInteger(left).or(toBigInteger(right));
+    }
+
+    /**
+     * Performs a bitwise xor.
+     *
+     * @param left  the left operand
+     * @param right the right operator
+     * @return left ^ right
+     */
+    public Object xor(final Object left, final Object right) {
+        final Number l = asLongNumber(left);
+        final Number r = asLongNumber(right);
+        if (l != null && r != null) {
+            return narrowLong(left, right, l.longValue() ^ r.longValue());
+        }
+        return toBigInteger(left).xor(toBigInteger(right));
+    }
+
+    /**
+     * Performs a bitwise complement.
+     *
+     * @param val the operand
+     * @return ~val
+     */
+    public Object complement(final Object val) {
+        final long l = toLong(val);
+        return narrowLong(val, ~l);
+    }
+
+    /**
+     * Shifts a bit pattern to the right.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &lt;&lt; right.
+     */
+    public Object shiftLeft(Object left, Object right) {
+        if (left == null && right == null) {
+            return controlNullNullOperands();
+        }
+        final int r = toInteger(right);
+        Number l = asIntNumber(left);
+        if (l != null) {
+            return l.intValue() << r;
+        }
+        l = castLongNumber(left);
+        if (l != null) {
+            return l.longValue() << r;
+        }
+        return toBigInteger(left).shiftLeft(r);
+    }
+
+    /**
+     * Shifts a bit pattern to the right.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &gt;&gt; right.
+     */
+    public Object shiftRight(Object left, Object right) {
+        if (left == null && right == null) {
+            return controlNullNullOperands();
+        }
+        final int r = toInteger(right);
+        Number l = asIntNumber(left);
+        if (l != null) {
+            return l.intValue() >> r;
+        }
+        l = castLongNumber(left);
+        if (l != null) {
+            return l.longValue() >> r;
+        }
+        return toBigInteger(left).shiftRight(r);
+    }
+
+    /**
+     * Shifts a bit pattern to the right unsigned.
+     *
+     * @param left  left argument
+     * @param right  right argument
+     * @return left &gt;&gt;&gt; right.
+     */
+    public Object shiftRightUnsigned(Object left, Object right) {
+        if (left == null && right == null) {
+            return controlNullNullOperands();
+        }
+        final int r = toInteger(right);
+        Number l = asIntNumber(left);
+        if (l != null) {
+            return l.intValue() >>> r;
+        }
+        l = castLongNumber(left);
+        if (l != null) {
+            return l.longValue() >>> r;
+        }
+        BigInteger bl = toBigInteger(left);
+        return bl.signum() < 0? bl.negate().shiftRight(r) : bl.shiftRight(r);
+    }
+
+}
diff --git a/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java b/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java
new file mode 100644
index 00000000..2ee14b9c
--- /dev/null
+++ b/src/test/java/org/apache/commons/jexl3/ShiftOperatorsTest.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.jexl3;
+
+import java.math.BigInteger;
+
+import org.apache.commons.jexl3.junit.Asserter;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests shift operators.
+ */
+@SuppressWarnings({"UnnecessaryBoxing", "AssertEqualsBetweenInconvertibleTypes"})
+public class ShiftOperatorsTest extends JexlTestCase {
+    private Asserter asserter;
+
+    private Asserter a360;
+
+    public ShiftOperatorsTest() {
+        super("ShiftOperatorsTest");
+        asserter = new Asserter(JEXL);
+        asserter.setStrict(false, false);
+
+        JexlEngine j360 = new JexlBuilder().arithmetic(new Arithmetic360(true)).strict(true).create();
+        a360 = new Asserter(j360);
+        a360.setStrict(false, false);
+    }
+
+    @Test
+    public void testLeftShiftIntValue() throws Exception {
+        final String expr = "(x, y)->{ x << y }";
+        asserter.assertExpression(expr, 1L << 2, 1L, 2);
+        asserter.assertExpression(expr, 1L << -2, 1L, -2);
+        asserter.assertExpression(expr, -1L << 2, -1L, 2);
+        asserter.assertExpression(expr, -1L << -2, -1L, -2);
+
+        a360.assertExpression(expr, 1L << 2, 1L, 2);
+        a360.assertExpression(expr, 1L << -2, 1L, -2);
+        a360.assertExpression(expr, -1L << 2, -1L, 2);
+        a360.assertExpression(expr, -1L << -2, -1L, -2);
+
+        a360.assertExpression(expr, 1 << 2, 1, 2);
+        a360.assertExpression(expr, 1 << -2, 1, -2);
+        a360.assertExpression(expr, -1 << 2, -1, 2);
+        a360.assertExpression(expr, -1 << -2, -1, -2);
+    }
+
+    @Test
+    public void testRightShiftIntValue() throws Exception {
+        final String expr = "(x, y)->{ x >> y }";
+        asserter.assertExpression(expr, 42L >> 2, 42L, 2);
+        asserter.assertExpression(expr, 42L >> -2, 42L, -2);
+        asserter.assertExpression(expr, -42L >> 2, -42L, 2);
+        asserter.assertExpression(expr, -42L >> -2, -42L, -2);
+
+        a360.assertExpression(expr, 42L >> 2, 42L, 2);
+        a360.assertExpression(expr, 42L >> -2, 42L, -2);
+        a360.assertExpression(expr, -42L >> 2, -42L, 2);
+        a360.assertExpression(expr, -42L >> -2, -42L, -2);
+
+        a360.assertExpression(expr, 42 >> 2, 42, 2);
+        a360.assertExpression(expr, 42 >> -2, 42, -2);
+        a360.assertExpression(expr, -42 >> 2, -42, 2);
+        a360.assertExpression(expr, -42 >> -2, -42, -2);
+    }
+
+    @Test
+    public void testRightShiftUnsignedIntValue() throws Exception {
+        final String expr = "(x, y)->{ x >>> y }";
+        asserter.assertExpression(expr, 42L >>> 2, 42L, 2);
+        asserter.assertExpression(expr, 42L >>> -2, 42L, -2);
+        asserter.assertExpression(expr, -42L >>> 2, -42L, 2);
+        asserter.assertExpression(expr, -42L >>> -2, -42L, -2);
+    }
+
+    @Test
+    public void testLeftShiftLongValue() throws Exception {
+        a360.assertExpression("2147483648 << 2", 2147483648L << 2);
+        a360.assertExpression("2147483648 << -2", 2147483648L << -2);
+        a360.assertExpression("-2147483649 << 2", -2147483649L << 2);
+        a360.assertExpression("-2147483649 << -2", -2147483649L << -2);
+    }
+
+    @Test
+    public void testRightShiftLongValue() throws Exception {
+        a360.assertExpression("8589934592 >> 2", 8589934592L >> 2);
+        a360.assertExpression("8589934592 >> -2", 8589934592L >> -2);
+        a360.assertExpression("-8589934592 >> 2", -8589934592L >> 2);
+        a360.assertExpression("-8589934592 >> -2", -8589934592L >> -2);
+    }
+
+    @Test
+    public void testRightShiftBigValue() throws Exception {
+        a360.assertExpression( "9223372036854775808 >> 2", new BigInteger("9223372036854775808").shiftRight(2));
+        a360.assertExpression("9223372036854775808 >> -2", new BigInteger("9223372036854775808").shiftRight(-2));
+        a360.assertExpression("-9223372036854775809 >> 2", new BigInteger("-9223372036854775809").shiftRight(2));
+        a360.assertExpression("-9223372036854775809 >> -2", new BigInteger("-9223372036854775809").shiftRight(-2));
+    }
+
+    static BigInteger shiftRightUnsigned(String bl, int r) {
+        return shiftRightUnsigned(new BigInteger(bl), r);
+    }
+    static BigInteger shiftRightUnsigned(BigInteger bl, int r) {
+        return bl.signum() < 0 ? bl.negate().shiftRight(r) : bl.shiftRight(r);
+    }
+
+    @Test
+    public void testRightShiftUnsignedBigValue() throws Exception {
+        a360.assertExpression( "9223372036854775808 >>> 2", shiftRightUnsigned("9223372036854775808", 2));
+        a360.assertExpression("9223372036854775808 >>> -2", shiftRightUnsigned("9223372036854775808",-2));
+        a360.assertExpression("-9223372036854775809 >>> 2", shiftRightUnsigned("-9223372036854775809", 2));
+        a360.assertExpression("-9223372036854775809 >>> -2", shiftRightUnsigned("-9223372036854775809",-2));
+    }
+
+    public static class ShiftArithmetic extends JexlArithmetic {
+        ShiftArithmetic(boolean flag) {
+            super(flag);
+        }
+
+        public Object shiftLeft(StringBuilder c, String value) {
+            c.append(value);
+            return c;
+        }
+
+        public Object shiftRight(String value, StringBuilder c) {
+            c.append(value);
+            return c;
+        }
+
+        public Object shiftRightUnsigned(String value, StringBuilder c) {
+            c.append(value.toLowerCase());
+            return c;
+        }
+    }
+
+    @Test
+    public void testOverloadedShift() throws Exception {
+        JexlEngine jexl = new JexlBuilder().arithmetic(new ShiftArithmetic(true)).create();
+        JexlScript e = jexl.createScript("x << 'Left'", "x");
+        StringBuilder x = new StringBuilder("1");
+        Object o = e.execute(null, x);
+        Assert.assertEquals(e.getSourceText(), "1Left", x.toString());
+
+        e = jexl.createScript("'Right' >> x", "x");
+        x = new StringBuilder("1");
+        o = e.execute(null, x);
+        Assert.assertEquals(e.getSourceText(), "1Right", x.toString());
+
+        e = jexl.createScript("'Right' >>> x", "x");
+        x = new StringBuilder("1");
+        o = e.execute(null, x);
+        Assert.assertEquals(e.getSourceText(), "1right", x.toString());
+    }
+
+    @Test
+    public void testPrecedence() throws Exception {
+        a360.assertExpression("40 + 2 << 1 + 1", 40 + 2 << 1 + 1);
+        a360.assertExpression("40 + (2 << 1) + 1", 40 + (2 << 1) + 1);
+        a360.assertExpression("(40 + 2) << (1 + 1)", (40 + 2) << (1 + 1));
+
+        a360.assertExpression("40 + 2L << 1 + 1", 40 + 2L << 1 + 1);
+        a360.assertExpression("40 + (2L << 1) + 1", 40 + (2L << 1) + 1);
+        a360.assertExpression("(40 + 2L) << (1 + 1)", (40 + 2L) << (1 + 1));
+
+        a360.assertExpression("40L + 2 << 1 + 1", 40L + 2L << 1 + 1);
+        a360.assertExpression("40L + (2 << 1) + 1", 40L + (2L << 1) + 1);
+        a360.assertExpression("(40L + 2) << (1 + 1)", (40L + 2L) << (1 + 1));
+    }
+
+}
diff --git a/src/test/java/org/apache/commons/jexl3/junit/Asserter.java b/src/test/java/org/apache/commons/jexl3/junit/Asserter.java
index 7530ff48..2aaf29a9 100644
--- a/src/test/java/org/apache/commons/jexl3/junit/Asserter.java
+++ b/src/test/java/org/apache/commons/jexl3/junit/Asserter.java
@@ -92,9 +92,9 @@ public class Asserter extends Assert {
      * @throws Exception if the expression could not be evaluationed or an assertion
      * fails
      */
-    public void assertExpression(final String expression, final Object expected) throws Exception {
+    public void assertExpression(final String expression, final Object expected, Object... args) throws Exception {
         final JexlScript exp = engine.createScript(expression);
-        final Object value = exp.execute(context);
+        final Object value = exp.execute(context, args);
         if (expected instanceof BigDecimal) {
             final JexlArithmetic jexla = engine.getArithmetic();
             Assert.assertEquals("expression: " + expression, 0,


[commons-jexl] 10/13: JEXL-360: added operators, syntax, basic tests

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch JEXL-360
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit 5f041a3fae42e6337856e67b312a5c4b575e6f0c
Author: henrib <he...@apache.org>
AuthorDate: Tue Feb 15 16:20:42 2022 +0100

    JEXL-360: added operators, syntax, basic tests
---
 .../org/apache/commons/jexl3/JexlOperator.java     | 59 +++-------------------
 1 file changed, 7 insertions(+), 52 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlOperator.java b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
index 43fa03da..daa68f35 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOperator.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOperator.java
@@ -106,7 +106,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >> y</code>
      * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftRight(Object, Object)
      */
@@ -114,7 +114,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
      * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
      * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
      */
@@ -122,31 +122,7 @@ public enum JexlOperator {
 
     /**
      * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
-     * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
-     * @see JexlArithmetic#shiftLeft(Object, Object)
-     */
-    SHIFTLEFT("<<", "shiftLeft", 2),
-
-    /**
-     * Bit-pattern right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt; y</code>
-     * <br><strong>Method:</strong> <code>T rightShift(L x, R y);</code>.
-     * @see JexlArithmetic#shiftRight(Object, Object)
-     */
-    SHIFTRIGHT(">>", "shiftRight", 2),
-
-    /**
-     * Bit-pattern right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
-     * <br><strong>Method:</strong> <code>T rightShiftUnsigned(L x, R y);</code>.
-     * @see JexlArithmetic#shiftRightUnsigned(Object, Object)
-     */
-    SHIFTRIGHTU(">>>", "shiftRightUnsigned", 2),
-
-    /**
-     * Bit-pattern left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
+     * <br><strong>Syntax:</strong> <code>x << y</code>
      * <br><strong>Method:</strong> <code>T leftShift(L x, R y);</code>.
      * @see JexlArithmetic#shiftLeft(Object, Object)
      */
@@ -322,42 +298,21 @@ public enum JexlOperator {
 
     /**
      * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
-     * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
-     */
-    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
-
-    /**
-     * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
-     * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
-     */
-    SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
-
-    /**
-     * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
-     * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
-     */
-    SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),
-
-    /**
-     * Self-right-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;= y</code>
+     * <br><strong>Syntax:</strong> <code>x >>= y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRight(L x, R y);</code>.
      */
-    SELF_SHIFTRIGHT(">>=", "selfShiftRight", SHIFTRIGHT),
+    SELF_SHIFTRIGHT(">>", "selfShiftRight", SHIFTRIGHT),
 
     /**
      * Self-right-shift unsigned operator.
-     * <br><strong>Syntax:</strong> <code>x &gt;&gt;&gt; y</code>
+     * <br><strong>Syntax:</strong> <code>x >>> y</code>
      * <br><strong>Method:</strong> <code>T selfShiftRightUnsigned(L x, R y);</code>.
      */
     SELF_SHIFTRIGHTU(">>>=", "selfShiftRightUnsigned", SHIFTRIGHTU),
 
     /**
      * Self-left-shift operator.
-     * <br><strong>Syntax:</strong> <code>x &lt;&lt; y</code>
+     * <br><strong>Syntax:</strong> <code>x << y</code>
      * <br><strong>Method:</strong> <code>T selfShiftLeft(L x, R y);</code>.
      */
     SELF_SHIFTLEFT("<<=", "selfShiftLeft", SHIFTLEFT),