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/05/16 17:17:11 UTC

[groovy] branch GROOVY_4_0_X updated: GROOVY-10343: STC: resolve type parameter bounded by a type parameter

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

emilles 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 a53da1457d GROOVY-10343: STC: resolve type parameter bounded by a type parameter
a53da1457d is described below

commit a53da1457d16563752d6a11bc2563cc64f05c635
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon May 16 11:58:56 2022 -0500

    GROOVY-10343: STC: resolve type parameter bounded by a type parameter
---
 .../transform/stc/StaticTypeCheckingSupport.java   | 28 ++++++++++++----------
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 17 +++++++++++++
 2 files changed, 32 insertions(+), 13 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 e8ebb62fc5..6738bfcf37 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1638,22 +1638,24 @@ public abstract class StaticTypeCheckingSupport {
         }
     }
 
-    private static ClassNode extractType(final GenericsType gt) {
+    private static ClassNode extractType(GenericsType gt) {
+        ClassNode cn;
         if (!gt.isPlaceholder()) {
-            return getCombinedBoundType(gt);
-        }
-        // For a placeholder, a type based on the generics type is used for the compatibility check, to match on
-        // the actual bounds and not the name of the placeholder.
-        ClassNode replacementType = gt.getType().redirect();
-        if (gt.getType().getGenericsTypes() != null) {
-            GenericsType realGt = gt.getType().getGenericsTypes()[0];
-            if (realGt.getLowerBound() != null) {
-                replacementType = realGt.getLowerBound();
-            } else if (asBoolean(realGt.getUpperBounds())) {
-                replacementType = realGt.getUpperBounds()[0];
+            cn = getCombinedBoundType(gt);
+        } else {
+            // discard the placeholder
+            cn = gt.getType().redirect();
+
+            if (gt.getType().getGenericsTypes() != null)
+                gt = gt.getType().getGenericsTypes()[0];
+
+            if (gt.getLowerBound() != null) {
+                cn = gt.getLowerBound();
+            } else if (asBoolean(gt.getUpperBounds())) {
+                cn = gt.getUpperBounds()[0];
             }
         }
-        return replacementType;
+        return cn;
     }
 
     private static boolean equalIncludingGenerics(final GenericsType one, final GenericsType two) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index ad6a5cc2ea..64b4374078 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1272,6 +1272,23 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10343
+    void testDiamondInferrenceFromConstructor27() {
+        assertScript '''
+            class C<T1, T2 extends T1> {
+                T1 p
+                C(T1 p) { this.p = p }
+                T2 m() { return null }
+            }
+            void test(Integer x) {
+                def c = new C<>(x) // type witness for T1 can also help bound T2
+                def y = c.m()
+                Integer z = y // Cannot assign value of type Object to variable of type Integer
+            }
+            test(1234)
+        '''
+    }
+
     // GROOVY-10280
     void testTypeArgumentPropagation() {
         assertScript '''