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/17 20:23:26 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-10624: STC: don't apply context generics for diamond ctor call

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

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


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 5f871dae36 GROOVY-10624: STC: don't apply context generics for diamond ctor call
5f871dae36 is described below

commit 5f871dae36289b50ef80d6bf83eb6827e73db3bd
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue May 17 15:07:23 2022 -0500

    GROOVY-10624: STC: don't apply context generics for diamond ctor call
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  2 +-
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 45 ++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)

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 7d92957b55..753d0e1521 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2323,7 +2323,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                             && parameters.length == argumentTypes.length - 1) {
                         ctor = typeCheckMapConstructor(call, receiver, arguments);
                     } else {
-                        if (parameters.length > 0 && receiver.getGenericsTypes() != null) { // GROOVY-8961, GROOVY-9734, GROOVY-9915, GROOVY-10482, et al.
+                        if (parameters.length > 0 && asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al.
                             Map<GenericsTypeName, GenericsType> context = extractPlaceHolders(null, receiver, ctor.getDeclaringClass());
                             parameters = parameters.clone(); for (int i = 0; i < parameters.length; i += 1)
                                 parameters[i] = new Parameter(applyGenericsContext(context, parameters[i].getType()), parameters[i].getName());
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index a84fd304e7..c0039a0469 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -328,6 +328,51 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    @NotYetImplemented // 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-10316
+    void testDiamondInferrenceFromConstructor28() {
+        assertScript '''
+            class A<T> {
+                A(T t) {
+                }
+            }
+            @groovy.transform.TupleConstructor(defaults=false)
+            class B<T> {
+                A<T> p
+            }
+            def b = new B<>(new A<>(1L))
+            A<Long> x = b.p // Cannot assign A<Object> to A<Long>
+        '''
+    }
+
+    // GROOVY-10624
+    void testDiamondInferrenceFromConstructor29() {
+        assertScript '''
+            class A<T> {
+            }
+            class B<T> {
+                B(A<T> a) { }
+            }
+            B<Float> x = new B<>(new A<>()) // Cannot assign B<Object> to B<Float>
+        '''
+    }
+
     // GROOVY-10280
     void testTypeArgumentPropagation() {
         assertScript '''