You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/02/01 23:05:56 UTC

[groovy] 01/04: Fix GROOVY-9204

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

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

commit 57f4a58888a13b80fa4477ad5c4a9f121fb61216
Author: Bo Zhang <zh...@gmail.com>
AuthorDate: Sat Feb 1 12:20:55 2020 +0800

    Fix GROOVY-9204
    
    (cherry picked from commit 0cb6d88b96871320ec5ece8609cd9437766b71e5)
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  4 +--
 src/test/groovy/bugs/Groovy9204.groovy             | 39 +++++++++++++---------
 2 files changed, 25 insertions(+), 18 deletions(-)

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 a38495b..c979287 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -193,7 +193,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.thisPropX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.findActualTypeByGenericsPlaceholderName;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.makeDeclaringAndActualGenericsTypeMap;
+import static org.codehaus.groovy.ast.tools.GenericsUtils.makeDeclaringAndActualGenericsTypeMapOfExactType;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.toGenericTypesString;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isBigDecCategory;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isBigIntCategory;
@@ -608,7 +608,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                 FieldNode fieldNode = (FieldNode) accessedVariable;
                 ClassNode actualType = findActualTypeByGenericsPlaceholderName(
                         fieldNode.getOriginType().getUnresolvedName(),
-                        makeDeclaringAndActualGenericsTypeMap(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode())
+                        makeDeclaringAndActualGenericsTypeMapOfExactType(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode())
                 );
                 if (actualType != null) {
                     storeType(vexp, actualType);
diff --git a/src/test/groovy/bugs/Groovy9204.groovy b/src/test/groovy/bugs/Groovy9204.groovy
index d6fc95f..abc64e3 100644
--- a/src/test/groovy/bugs/Groovy9204.groovy
+++ b/src/test/groovy/bugs/Groovy9204.groovy
@@ -18,14 +18,13 @@
  */
 package groovy.bugs
 
-import groovy.test.NotYetImplemented
 import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
 import org.junit.Test
 
 final class Groovy9204 {
 
-    @Test @NotYetImplemented
+    @Test
     void testGenerics() {
         def config = new CompilerConfiguration(
             targetDirectory: File.createTempDir(),
@@ -36,29 +35,37 @@ final class Groovy9204 {
         try {
             def a = new File(parentDir, 'A.java')
             a.write '''
-                public class A {
-                    public String meth() {
-                        return "hello";
-                    }
-                }
-
-                abstract class One<T extends A> {
+                class One<T extends java.util.List> {
                     protected T field;
                 }
 
-                abstract class Two<T extends A> extends One<T> {
+                class Two<T extends java.util.List> extends One<T> {
                 }
 
-                abstract class Three extends Two<A> {
+                class Three extends Two<java.util.List> {
                 }
+                
+                class Four extends Two<java.util.LinkedList> {
+                }
+                
             '''
             def b = new File(parentDir, 'B.groovy')
             b.write '''
                 @groovy.transform.CompileStatic
-                class B extends Three {
+                class ArrayListTest extends Three {
+                    def test() {
+                        field = new ArrayList()
+                        field.add("hello")
+                        field[0]
+                    }
+                }
+
+                @groovy.transform.CompileStatic
+                class LinkedListTest extends Four {
                     def test() {
-                        field.meth() // typeof(field) should be A
-                        //    ^^^^ Cannot find matching method java.lang.Object#meth()
+                        field = new LinkedList()
+                        field.addFirst("hello")
+                        field[0]
                     }
                 }
             '''
@@ -68,8 +75,8 @@ final class Groovy9204 {
             cu.addSources(a, b)
             cu.compile()
 
-            Class clazz = loader.loadClass('B')
-            assert clazz.newInstance().test() == 'hello'
+            assert loader.loadClass('LinkedListTest').getConstructor().newInstance().test() == 'hello'
+            assert loader.loadClass('ArrayListTest').getConstructor().newInstance().test() == 'hello'
         } finally {
             parentDir.deleteDir()
             config.targetDirectory.deleteDir()