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 2017/09/15 16:27:02 UTC

groovy git commit: GROOVY-8319: Improve smart type on list expressions (closes #602)

Repository: groovy
Updated Branches:
  refs/heads/master 10cba2aff -> 70ce561c1


GROOVY-8319: Improve smart type on list expressions (closes #602)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/70ce561c
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/70ce561c
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/70ce561c

Branch: refs/heads/master
Commit: 70ce561c1d797bd19f0bcbef79dd2f45867b2441
Parents: 10cba2a
Author: alexey.afanasiev <Al...@jetbrains.com>
Authored: Fri Sep 15 17:16:11 2017 +0300
Committer: sunlan <su...@apache.org>
Committed: Sat Sep 16 00:25:00 2017 +0800

----------------------------------------------------------------------
 .../stc/StaticTypeCheckingVisitor.java          |  4 ++-
 .../transform/stc/STCAssignmentTest.groovy      | 28 ++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/70ce561c/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index a257aa0..28c6368 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -873,6 +873,8 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             if (!isAssignableTo(elemType, tupleType)) {
                 addStaticTypeError("Cannot assign value of type " + elemType.toString(false) + " to variable of type " + tupleType.toString(false), rightExpression);
                 return false; // avoids too many errors
+            } else {
+                storeType(tupleExpression, elemType);
             }
         }
 
@@ -923,7 +925,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             }
         } else if (rightExpression instanceof ListExpression) {
             for (Expression element : ((ListExpression) rightExpression).getExpressions()) {
-                ClassNode rightComponentType = element.getType().redirect();
+                ClassNode rightComponentType = this.getType(element);
                 if (!checkCompatibleAssignmentTypes(leftComponentType, rightComponentType)
                         && !(isNullConstant(element) && !isPrimitiveType(leftComponentType))) {
                     addStaticTypeError("Cannot assign value of type " + rightComponentType.toString(false) + " into array of type " + lhsType.toString(false), rightExpression);

http://git-wip-us.apache.org/repos/asf/groovy/blob/70ce561c/src/test/groovy/transform/stc/STCAssignmentTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/STCAssignmentTest.groovy b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
index 7b40304..3c00185 100644
--- a/src/test/groovy/transform/stc/STCAssignmentTest.groovy
+++ b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
@@ -844,5 +844,33 @@ class STCAssignmentTest extends StaticTypeCheckingTestCase {
             assert fooParameterAssignment(null) == 42            
         '''
     }
+
+    void testIntegerArraySmartType() {
+        assertScript '''
+        def m() {
+            def a  = 1
+            Integer[] b = [a]
+        }            
+        '''
+    }
+
+    void testIntegerSecondDimArraySmartType() {
+        assertScript '''
+        def m() {
+            def a = new int[5]
+            int[][] b = [a]
+        }            
+        '''
+    }
+
+    void testMultiAssign() {
+        assertScript '''
+        def m() {
+            def row = ["", "", ""]
+            def (left, right) = [row[0], row[1]]
+            left.toUpperCase()
+        }            
+        '''
+    }
 }