You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/01/31 21:08:02 UTC
[groovy] 04/06: GROOVY-9935: `java.lang.Number` can accommodate any number type
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit f30231cf78a1e10c8a16f9fcf7735b87da64a798
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Feb 10 13:50:02 2021 -0600
GROOVY-9935: `java.lang.Number` can accommodate any number type
Conflicts:
src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 10 ++++++----
src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy | 13 +++++++++++++
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index b19931b..dcdbd15 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -76,6 +76,7 @@ import java.util.regex.Matcher;
import static java.lang.Math.min;
import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.BigInteger_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.Boolean_TYPE;
@@ -90,6 +91,7 @@ import static org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.GSTRING_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.Integer_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.Long_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.Number_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.Short_TYPE;
@@ -685,9 +687,9 @@ public abstract class StaticTypeCheckingSupport {
return left == VOID_TYPE || left == void_WRAPPER_TYPE;
}
- if ((isNumberType(rightRedirect) || WideningCategories.isNumberCategory(rightRedirect))) {
- if (BigDecimal_TYPE == leftRedirect) {
- // any number can be assigned to a big decimal
+ if (isNumberType(rightRedirect) || WideningCategories.isNumberCategory(rightRedirect)) {
+ if (BigDecimal_TYPE == leftRedirect || Number_TYPE == leftRedirect) {
+ // any number can be assigned to BigDecimal or Number
return true;
}
if (BigInteger_TYPE == leftRedirect) {
@@ -697,7 +699,7 @@ public abstract class StaticTypeCheckingSupport {
}
// if rightExpression is null and leftExpression is not a primitive type, it's ok
- boolean rightExpressionIsNull = rightExpression instanceof ConstantExpression && ((ConstantExpression) rightExpression).getValue() == null;
+ boolean rightExpressionIsNull = isNullConstant(rightExpression);
if (rightExpressionIsNull && !isPrimitiveType(left)) {
return true;
}
diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
index 6e8128a..8fe23b8 100644
--- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
@@ -41,6 +41,19 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
"""
}
+ // GROOVY-9935
+ void testIntegerToNumber() {
+ ['def', 'int', 'Integer', 'BigInteger'].each { type ->
+ assertScript """
+ Number f() {
+ $type n = 10
+ return n
+ }
+ assert f() == 10
+ """
+ }
+ }
+
void testGStringMethods() {
assertScript '''
def myname = 'Cedric'