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";');
}