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/03/11 17:21:34 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-10280: STC: do not mix type param contexts when resolving

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new f9dc615  GROOVY-10280: STC: do not mix type param contexts when resolving
f9dc615 is described below

commit f9dc615df8b076b37cf40d640f3bcc66a25ddb2c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Mar 11 11:07:57 2022 -0600

    GROOVY-10280: STC: do not mix type param contexts when resolving
---
 .../transform/stc/StaticTypeCheckingSupport.java   | 14 ++---
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 61 ++++++++++++++++++++++
 2 files changed, 66 insertions(+), 9 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 f2ec272..c83f128 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1563,15 +1563,11 @@ public abstract class StaticTypeCheckingSupport {
         }
     }
 
-    public static ClassNode resolveClassNodeGenerics(Map<GenericsTypeName, GenericsType> resolvedPlaceholders, final Map<GenericsTypeName, GenericsType> placeholdersFromContext, final ClassNode currentType) {
-        ClassNode target = currentType.redirect();
-        resolvedPlaceholders = new HashMap<>(resolvedPlaceholders);
-        applyContextGenerics(resolvedPlaceholders, placeholdersFromContext);
-
-        Map<GenericsTypeName, GenericsType> connections = new HashMap<>();
-        extractGenericsConnections(connections, currentType, target);
-        applyGenericsConnections(connections, resolvedPlaceholders);
-        return applyGenericsContext(resolvedPlaceholders, currentType);
+    public static ClassNode resolveClassNodeGenerics(final Map<GenericsTypeName, GenericsType> resolvedPlaceholders, final Map<GenericsTypeName, GenericsType> placeholdersFromContext, final ClassNode currentType) {
+        ClassNode type = currentType; // GROOVY-10280, et al.
+        type = applyGenericsContext(resolvedPlaceholders, type);
+        type = applyGenericsContext(placeholdersFromContext, type);
+        return type;
     }
 
     static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> connections, final Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 06b1918..ae365ab 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -373,6 +373,67 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10283
+    void testDiamondInferrenceFromConstructor9() {
+        assertScript '''
+            class A<T1, T2> {
+            }
+            class B<T1 extends Number, T2 extends A<C, ? extends T1>> {
+                T2 t
+                B(T2 t) {
+                    this.t  = t
+                }
+            }
+            class C {
+            }
+
+            new B<Integer,A<C,Integer>>(new A<>())
+        '''
+    }
+
+    // GROOVY-10280
+    void testTypeArgumentPropagation() {
+        assertScript '''
+            class Test<T> {
+                T test() {
+                    @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                        def type = node.getNodeMetaData(INFERRED_TYPE)
+                        assert type.toString(false) == 'T'
+                    })
+                    def t = new Foo<T>().x.y.z
+                }
+            }
+            class Foo<X> {
+                Bar<X> x = new Bar<>()
+            }
+            class Bar<T> {
+                Baz<T> y = new Baz<>()
+            }
+            class Baz<Z> {
+                Z z
+            }
+
+            new Test<String>().test()
+        '''
+    }
+
+    void testTypeArgumentPropagation2() {
+        assertScript '''
+            class Foo<T extends Bar> {
+                public List<T> bars
+                void test() {
+                    bars[0].baz()
+                }
+            }
+            class Bar {
+                def baz() {}
+            }
+
+            def obj = new Foo(bars: [new Bar()])
+            obj.test()
+        '''
+    }
+
     void testLinkedListWithListArgument() {
         assertScript '''
             List<String> list = new LinkedList<String>(['1','2','3'])