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/05/08 23:47:37 UTC

[groovy] branch master updated: GROOVY-8409, GROOVY-9915: compare generics of same type only

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


The following commit(s) were added to refs/heads/master by this push:
     new e2b7ba1  GROOVY-8409, GROOVY-9915: compare generics of same type only
e2b7ba1 is described below

commit e2b7ba15fdf1390a580d433cca6b8b43897d924d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat May 8 18:30:50 2021 -0500

    GROOVY-8409, GROOVY-9915: compare generics of same type only
    
      def m(Iterable<String> strings) { /*...*/ }
      m(Collections.emptyList())
      // List<#> --> Iterable<#>
      // versus Iterable<String>
---
 .../codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java  | 6 ++++++
 src/test/groovy/transform/stc/GenericsSTCTest.groovy              | 8 ++++++++
 2 files changed, 14 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 4d4447e..3e910c2 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5342,6 +5342,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             Parameter p = inferredMethod.getParameters()[Math.min(i, np - 1)];
 
             ClassNode at = actuals[i], pt = p.getOriginType();
+            if (!isUsingGenericsOrIsArrayUsingGenerics(pt)) continue;
             if (i >= (np - 1) && pt.isArray() && !at.isArray()) pt = pt.getComponentType();
 
             if (a instanceof ListExpression) {
@@ -5359,6 +5360,11 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             // and unknown generics
             if (!GenericsUtils.hasUnresolvedGenerics(at)) continue;
 
+            while (!at.equals(pt) && !at.equals(OBJECT_TYPE)) {
+                ClassNode sc = GenericsUtils.getSuperClass(at, pt);
+                at = applyGenericsContext(GenericsUtils.extractPlaceholders(at), sc);
+            }
+
             // try to resolve placeholder(s) in argument type using parameter type
 
             Map<GenericsTypeName, GenericsType> linked = new HashMap<>();
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 395a5f3..3bc13a7 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1367,6 +1367,14 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
                 }
                 test()
             """
+            assertScript """
+                $mods void m(Iterable<String> strings) {
+                }
+                void test() {
+                    m(Collections.emptyList())
+                }
+                test()
+            """
         }
     }