You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2022/07/10 10:58:29 UTC

[groovy] branch GROOVY_4_0_X updated: GROOVY-9205: annotation: init `long`, `float`, and `double` from integer

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

sunlan pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 288f8de3fb GROOVY-9205: annotation: init `long`, `float`, and `double` from integer
288f8de3fb is described below

commit 288f8de3fb16631bc91db0dd80a7e6dca993a3a0
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Jul 6 17:38:24 2022 -0500

    GROOVY-9205: annotation: init `long`, `float`, and `double` from integer
    
    (cherry picked from commit 1e2a72051eb3862dbcc9da06c8c2422f9355e45a)
---
 .../apache/groovy/ast/tools/ExpressionUtils.java   | 89 +++++++++++++---------
 src/test/gls/annotations/AnnotationTest.groovy     | 38 +++++++++
 .../groovy/tools/stubgenerator/Groovy10611.groovy  |  2 +-
 3 files changed, 91 insertions(+), 38 deletions(-)

diff --git a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
index f43646e485..73fa948f96 100644
--- a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
@@ -133,48 +133,54 @@ public final class ExpressionUtils {
         } else if (isNumberOrArrayOfNumber(wrapperType, false)) {
             int type = be.getOperation().getType();
             if (Arrays.binarySearch(HANDLED_TYPES, type) >= 0) {
-                boolean isShift = (type >= LEFT_SHIFT && type <= RIGHT_SHIFT_UNSIGNED);
-                Expression leftX = transformInlineConstants(be.getLeftExpression(), targetType);
-                Expression rightX = transformInlineConstants(be.getRightExpression(), isShift ? ClassHelper.int_TYPE : targetType);
+                Expression leftX = be.getLeftExpression();
+                if (!(leftX instanceof ConstantExpression)) {
+                    leftX = transformInlineConstants(leftX, targetType);
+                }
+                Expression rightX = be.getRightExpression();
+                if (!(rightX instanceof ConstantExpression)) {
+                    boolean isShift = (type >= LEFT_SHIFT && type <= RIGHT_SHIFT_UNSIGNED); // GROOVY-9336
+                    rightX = transformInlineConstants(rightX, isShift ? ClassHelper.int_TYPE : targetType);
+                }
                 if (leftX instanceof ConstantExpression && rightX instanceof ConstantExpression) {
                     Number left  = safeNumber((ConstantExpression) leftX);
                     Number right = safeNumber((ConstantExpression) rightX);
                     if (left == null || right == null) return null;
                     Number result = null;
-                    switch(type) {
-                        case PLUS:
-                            result = NumberMath.add(left, right);
-                            break;
-                        case MINUS:
-                            result = NumberMath.subtract(left, right);
-                            break;
-                        case MULTIPLY:
-                            result = NumberMath.multiply(left, right);
-                            break;
-                        case DIVIDE:
-                            result = NumberMath.divide(left, right);
-                            break;
-                        case LEFT_SHIFT:
-                            result = NumberMath.leftShift(left, right);
-                            break;
-                        case RIGHT_SHIFT:
-                            result = NumberMath.rightShift(left, right);
-                            break;
-                        case RIGHT_SHIFT_UNSIGNED:
-                            result = NumberMath.rightShiftUnsigned(left, right);
-                            break;
-                        case BITWISE_AND:
-                            result = NumberMath.and(left, right);
-                            break;
-                        case BITWISE_OR:
-                            result = NumberMath.or(left, right);
-                            break;
-                        case BITWISE_XOR:
-                            result = NumberMath.xor(left, right);
-                            break;
-                        case POWER:
-                            result = DefaultGroovyMethods.power(left, right);
-                            break;
+                    switch (type) {
+                      case PLUS:
+                        result = NumberMath.add(left, right);
+                        break;
+                      case MINUS:
+                        result = NumberMath.subtract(left, right);
+                        break;
+                      case MULTIPLY:
+                        result = NumberMath.multiply(left, right);
+                        break;
+                      case DIVIDE:
+                        result = NumberMath.divide(left, right);
+                        break;
+                      case LEFT_SHIFT:
+                        result = NumberMath.leftShift(left, right);
+                        break;
+                      case RIGHT_SHIFT:
+                        result = NumberMath.rightShift(left, right);
+                        break;
+                      case RIGHT_SHIFT_UNSIGNED:
+                        result = NumberMath.rightShiftUnsigned(left, right);
+                        break;
+                      case BITWISE_AND:
+                        result = NumberMath.and(left, right);
+                        break;
+                      case BITWISE_OR:
+                        result = NumberMath.or(left, right);
+                        break;
+                      case BITWISE_XOR:
+                        result = NumberMath.xor(left, right);
+                        break;
+                      case POWER:
+                        result = DefaultGroovyMethods.power(left, right);
+                        break;
                     }
                     if (result != null) {
                         if (ClassHelper.isWrapperInteger(wrapperType)) {
@@ -319,9 +325,18 @@ public final class ExpressionUtils {
                 if (ClassHelper.isWrapperByte(targetType)) {
                     return configure(exp, new ConstantExpression(integer.byteValue(), true));
                 }
+                if (ClassHelper.isWrapperLong(targetType)) {
+                    return configure(exp, new ConstantExpression(integer.longValue(), true));
+                }
                 if (ClassHelper.isWrapperShort(targetType)) {
                     return configure(exp, new ConstantExpression(integer.shortValue(), true));
                 }
+                if (ClassHelper.isWrapperFloat(targetType)) {
+                    return configure(exp, new ConstantExpression(integer.floatValue(), true));
+                }
+                if (ClassHelper.isWrapperDouble(targetType)) {
+                    return configure(exp, new ConstantExpression(integer.doubleValue(), true));
+                }
                 if (ClassHelper.isWrapperCharacter(targetType)) {
                     return configure(exp, new ConstantExpression((char) integer.intValue(), true));
                 }
diff --git a/src/test/gls/annotations/AnnotationTest.groovy b/src/test/gls/annotations/AnnotationTest.groovy
index c59279a46c..e10abf4f3b 100644
--- a/src/test/gls/annotations/AnnotationTest.groovy
+++ b/src/test/gls/annotations/AnnotationTest.groovy
@@ -828,6 +828,44 @@ final class AnnotationTest {
         '''
     }
 
+    @Test // GROOVY-9205
+    void testAnnotationDefinitionDefaultValues3() {
+        assertScript shell, '''
+            @interface A {
+                int i1() default (int) 42
+                int i2() default 42 as int
+                byte b1() default (byte) 42
+                byte b2() default 42 as byte
+                char c1() default (char) 42
+                char c2() default 42 as char
+                long l1() default (long) 42
+                long l2() default 42 as long
+                short s1() default (short) 42
+                short s2() default 42 as short
+            }
+
+            ['i1', 'i2', 'b1', 'b2', 'c1', 'c2', 'l1', 'l2', 's1', 's2'].each { name ->
+                assert A.getMethod(name).defaultValue == 42
+            }
+        '''
+    }
+
+    @Test // GROOVY-9205
+    void testAnnotationDefinitionDefaultValues4() {
+        assertScript shell, '''
+            @interface A {
+                float f1() default (float) 42
+                float f2() default 42 as float
+                double d1() default (double) 42
+                double d2() default 42 as double
+            }
+
+            ['f1', 'f2', 'd1', 'd2'].each { name ->
+                assert A.getMethod(name).defaultValue == 42.0
+            }
+        '''
+    }
+
     @Test // GROOVY-6093
     void testAnnotationOnEnumConstant() {
         assertScript shell, '''
diff --git a/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy10611.groovy b/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy10611.groovy
index 824f338751..7920c33f46 100644
--- a/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy10611.groovy
+++ b/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy10611.groovy
@@ -43,7 +43,7 @@ final class Groovy10611 extends StringSourcesStubTestCase {
     @Override
     void verifyStubs() {
         String stub = stubJavaSourceFor('C')
-        assert stub.contains('final long LONG = 123456;');
+        assert stub.contains('final long LONG = 123456L;');
         assert stub.contains('final float FLOAT = 78.9f;');
         assert stub.contains('final java.lang.String STRING = "xy";');
     }