From 8275bccd1b24420f52314b931f940ee9d13295cd Mon Sep 17 00:00:00 2001 From: Bo Zhang Date: Sat, 1 Feb 2020 12:20:55 +0800 Subject: [PATCH] Fix GROOVY-9204 --- .../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 a38495b83d4..c979287d0c2 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.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 void visitVariableExpression(final VariableExpression vexp) { 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 d6fc95f14d9..abc64e37f06 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 { + class One { protected T field; } - abstract class Two extends One { + class Two extends One { } - abstract class Three extends Two { + class Three extends Two { } + + class Four extends Two { + } + ''' 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()