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()