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 2020/12/24 06:06:48 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-9860: makeRawType should reduce generic placeholder to bound type

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 8d27bf2  GROOVY-9860: makeRawType should reduce generic placeholder to bound type
8d27bf2 is described below

commit 8d27bf2ffb884f1d56a4729200ecc08021485ace
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Dec 20 22:16:04 2020 -0600

    GROOVY-9860: makeRawType should reduce generic placeholder to bound type
    
    Tuple2 constructor parameters are placeholders and should reduce to
    Object for argument matching
---
 .../groovy/transform/stc/StaticTypeCheckingSupport.java     |  2 +-
 src/test/groovy/transform/stc/GenericsSTCTest.groovy        | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

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 4e3dedf..583fda6 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1130,7 +1130,7 @@ public abstract class StaticTypeCheckingSupport {
             String name = param.getType().getUnresolvedName();
             Optional<GenericsType> value = genericsPlaceholderAndTypeMap.entrySet().stream()
                 .filter(e -> e.getKey().getName().equals(name)).findFirst().map(Map.Entry::getValue);
-            ClassNode type = value.map(GenericsType::getType).orElseGet(() -> makeRawType(param.getType()));
+            ClassNode type = value.map(gt -> !gt.isPlaceholder() ? gt.getType() : makeRawType(gt.getType())).orElseGet(() -> makeRawType(param.getType()));
 
             return new Parameter(type, param.getName());
         }).toArray(Parameter[]::new);
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 68f6b78..504e9d6 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -325,6 +325,19 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-9860
+    void testGenericTypeArgumentInCtorCall() {
+        assertScript '''
+            def <T> void test() {
+                def bind = { T a, T b ->
+                    new Tuple2<T, T>(a, b)
+                }
+                assert bind('foo', 'bar').toString() == '[foo, bar]'
+            }
+            test()
+        '''
+    }
+
     void testReturnAnntationClass() {
         assertScript '''
             import java.lang.annotation.Documented