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/11/02 17:14:44 UTC

[groovy] branch master updated (1f1668c -> 1972cee)

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

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


    from 1f1668c  helper methods for map entry expressions
     new fb1cac6  GROOVY-10228: STC: diamond inference for method call's object expression
     new 1972cee  GROOVY-10310: STC: retain wildcard flag during diamond generics transfer

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../transform/stc/StaticTypeCheckingVisitor.java   | 38 +++++++++++++---------
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 37 +++++++++++++++++++--
 .../groovy/groovysh/util/PackageHelperImpl.groovy  |  2 +-
 3 files changed, 59 insertions(+), 18 deletions(-)

[groovy] 01/02: GROOVY-10228: STC: diamond inference for method call's object expression

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fb1cac6334a1d6f338b499bf21a541be20c36579
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 2 11:27:49 2021 -0500

    GROOVY-10228: STC: diamond inference for method call's object expression
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 37 +++++++++++++---------
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 20 ++++++++++--
 .../groovy/groovysh/util/PackageHelperImpl.groovy  |  2 +-
 3 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index e4b753d..e47de5d 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1106,22 +1106,26 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         }
     }
 
-    private void adjustGenerics(final ClassNode from, final ClassNode to) {
-        GenericsType[] genericsTypes = from.getGenericsTypes();
-        if (genericsTypes == null) {
-            // case of: def foo = new HashMap<>()
-            genericsTypes = to.redirect().getGenericsTypes();
-        }
-        GenericsType[] copy = new GenericsType[genericsTypes.length];
-        for (int i = 0; i < genericsTypes.length; i++) {
-            GenericsType genericsType = genericsTypes[i];
-            copy[i] = new GenericsType(
-                    wrapTypeIfNecessary(genericsType.getType()),
-                    genericsType.getUpperBounds(),
-                    genericsType.getLowerBound()
-            );
+    private void adjustGenerics(final ClassNode source, final ClassNode target) {
+        GenericsType[] genericsTypes = source.getGenericsTypes();
+        if (genericsTypes == null) { // Map foo = new HashMap<>()
+            genericsTypes = target.redirect().getGenericsTypes().clone();
+            for (int i = 0, n = genericsTypes.length; i < n; i += 1) {
+                GenericsType gt = genericsTypes[i];
+                // GROOVY-10055: handle diamond or raw
+                ClassNode cn = gt.getUpperBounds() != null
+                        ? gt.getUpperBounds()[0] : gt.getType().redirect();
+                genericsTypes[i] = cn.getPlainNodeReference().asGenericsType();
+            }
+        } else {
+            genericsTypes = genericsTypes.clone();
+            for (int i = 0, n = genericsTypes.length; i < n; i += 1) {
+                GenericsType gt = genericsTypes[i];
+                genericsTypes[i] = new GenericsType(gt.getType(),
+                        gt.getUpperBounds(), gt.getLowerBound());
+            }
         }
-        to.setGenericsTypes(copy);
+        target.setGenericsTypes(genericsTypes);
     }
 
     /**
@@ -3303,6 +3307,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         call.getMethod().visit(this);
 
         ClassNode receiver = getType(objectExpression);
+        if (objectExpression instanceof ConstructorCallExpression) { // GROOVY-10228
+            inferDiamondType((ConstructorCallExpression) objectExpression, receiver.getPlainNodeReference());
+        }
         if (call.isSpreadSafe()) { // make sure receiver is array or collection then check element type
             if (!receiver.isArray() && !implementsInterfaceOrIsSubclassOf(receiver, Collection_TYPE)) {
                 addStaticTypeError("Spread operator can only be used on collection types", objectExpression);
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 13b7d4c..c9d4477 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1000,9 +1000,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
-    // GROOVY-10323
+    // GROOVY-10228
     void testDiamondInferrenceFromConstructor18() {
         assertScript '''
+            @groovy.transform.TupleConstructor(defaults=false)
+            class C<T> {
+                T p
+            }
+            def m(Number n) {
+                'works'
+            }
+            def x = 12345
+            x = m(new C<>(x).getP()) // Cannot find matching method
+            assert x == 'works'
+        '''
+    }
+
+    // GROOVY-10323
+    void testDiamondInferrenceFromConstructor19() {
+        assertScript '''
             class C<T> {
             }
             def <T,T> T m(C<T> c) {
@@ -1012,7 +1028,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
     }
 
     // GROOVY-10324
-    void testDiamondInferrenceFromConstructor19() {
+    void testDiamondInferrenceFromConstructor20() {
         assertScript '''
             class C<T> {
             }
diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
index cd4e85b..490f5c7 100644
--- a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
+++ b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
@@ -246,7 +246,7 @@ Files.walkFileTree(fs.getPath('modules'),
         File urlFile = new File(URLDecoder.decode(url.file, 'UTF-8'))
 
         if (urlFile.isDirectory()) {
-            return new HashSet<>().tap {
+            return new HashSet<String>().tap {
                 collectPackageNamesFromFolderRecursive(urlFile, '', it)
             }
         }

[groovy] 02/02: GROOVY-10310: STC: retain wildcard flag during diamond generics transfer

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1972cee19fceae7ed0282b20d6cfcb0704da7542
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 2 12:01:32 2021 -0500

    GROOVY-10310: STC: retain wildcard flag during diamond generics transfer
---
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java |  1 +
 src/test/groovy/transform/stc/GenericsSTCTest.groovy    | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index e47de5d..4ab4407 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1123,6 +1123,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                 GenericsType gt = genericsTypes[i];
                 genericsTypes[i] = new GenericsType(gt.getType(),
                         gt.getUpperBounds(), gt.getLowerBound());
+                genericsTypes[i].setWildcard(gt.isWildcard()); // GROOVY-10310
             }
         }
         target.setGenericsTypes(genericsTypes);
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index c9d4477..937c21c 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1038,6 +1038,23 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10310
+    void testDiamondInferrenceFromConstructor21() {
+        assertScript '''
+            @groovy.transform.TupleConstructor
+            class A<T> {
+                T f
+            }
+            class B<T> {
+            }
+            def <T> A<T> m(T t, B<? extends T> b_of_t) {
+                new A<>(t)
+            }
+            def x = 'x'
+            m(x, new B<>()) // Cannot call m(T,B<? extends T>) with arguments...
+        '''
+    }
+
     // GROOVY-10280
     void testTypeArgumentPropagation() {
         assertScript '''