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 2021/08/17 17:36:44 UTC

[groovy] 04/04: GROOVY-10087: STC: char can be implicitly boxed to Character at return

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

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

commit ba00810ed70cef52448bf742e62bcc32447ef6b1
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat May 15 18:55:11 2021 -0500

    GROOVY-10087: STC: char can be implicitly boxed to Character at return
    
    Conflicts:
    	src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
---
 .../transform/stc/StaticTypeCheckingSupport.java   | 19 ++++-----------
 .../groovy/transform/stc/ReturnsSTCTest.groovy     | 27 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 14 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 a934833..2692f16 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -666,27 +666,18 @@ public abstract class StaticTypeCheckingSupport {
             }
         }
 
-        // if rightExpression is null and leftExpression is not a primitive type, it's ok
         boolean rightExpressionIsNull = isNullConstant(rightExpression);
         if (rightExpressionIsNull && !isPrimitiveType(left)) {
             return true;
         }
 
-        // on an assignment everything that can be done by a GroovyCast is allowed
-
-        // anything can be assigned to an Object, String, Boolean or Class typed variable
+        // anything can be assigned to an Object, String, [Bb]oolean or Class receiver; except null to boolean
         if (isWildcardLeftHandSide(leftRedirect) && !(boolean_TYPE.equals(left) && rightExpressionIsNull)) return true;
 
-        // char as left expression
-        if (leftRedirect == char_TYPE) {
-            if (rightRedirect == Character_TYPE) return true;
-            if (rightRedirect == STRING_TYPE && rightExpression instanceof ConstantExpression) {
-                String value = rightExpression.getText();
-                return value.length() == 1;
-            }
-        }
-        if (leftRedirect == Character_TYPE && (rightRedirect == STRING_TYPE || rightExpressionIsNull)) {
-            return rightExpressionIsNull || (rightExpression instanceof ConstantExpression && rightExpression.getText().length() == 1);
+        if (leftRedirect == char_TYPE && rightRedirect == Character_TYPE) return true;
+        if (leftRedirect == Character_TYPE && rightRedirect == char_TYPE) return true;
+        if ((leftRedirect == char_TYPE || leftRedirect == Character_TYPE) && rightRedirect == STRING_TYPE) {
+            return rightExpression instanceof ConstantExpression && rightExpression.getText().length() == 1;
         }
 
         // if left is Enum and right is String or GString we do valueOf
diff --git a/src/test/groovy/transform/stc/ReturnsSTCTest.groovy b/src/test/groovy/transform/stc/ReturnsSTCTest.groovy
index f4cd334..e5e3a24 100644
--- a/src/test/groovy/transform/stc/ReturnsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ReturnsSTCTest.groovy
@@ -223,6 +223,33 @@ class ReturnsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10087
+    void testImplicitReturnToWrapper() {
+        assertScript '''
+            Integer foo() {
+                int x = 42
+                return x
+            }
+            assert foo().intValue() == 42
+        '''
+
+        assertScript '''
+            Long foo() {
+                long x = 42L
+                return x
+            }
+            assert foo().longValue() == 42L
+        '''
+
+        assertScript '''
+            Character foo() {
+                char x = 'x'
+                return x
+            }
+            assert foo().charValue() == 'x'
+        '''
+    }
+
     // GROOVY-5835
     void testReturnInClosureShouldNotBeConsideredAsReturnOfEnclosingMethod() {
         assertScript '''