This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new 62f666b80d GROOVY-9074, GROOVY-10651: STC: propagate generics to super
class
62f666b80d is described below
commit 62f666b80d8adc2b96211f923a66d15961893c11
Author: Eric Milles <[email protected]>
AuthorDate: Mon Nov 18 12:23:32 2024 -0600
GROOVY-9074, GROOVY-10651: STC: propagate generics to super class
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 17 +++++++++++++++--
.../java/org/codehaus/groovy/vmplugin/v8/Java8.java | 8 ++++++++
.../transform/stc/ArraysAndCollectionsSTCTest.groovy | 12 ++++++------
.../stc/ClosureParamTypeInferenceSTCTest.groovy | 2 +-
4 files changed, 30 insertions(+), 9 deletions(-)
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 fe4d75df84..c699a32c12 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -101,6 +101,7 @@ import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.findSAM;
import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.getNextSuperClass;
import static org.codehaus.groovy.ast.ClassHelper.getUnwrapper;
import static org.codehaus.groovy.ast.ClassHelper.getWrapper;
import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
@@ -1759,8 +1760,20 @@ public abstract class StaticTypeCheckingSupport {
extractGenericsConnections(connections,
type.getNodeMetaData("outer.class"), target.getOuterClass()); //GROOVY-10646
} else if (implementsInterfaceOrIsSubclassOf(type, target)) {
- ClassNode goal = GenericsUtils.parameterizeType(type, target);
- extractGenericsConnections(connections, goal.getGenericsTypes(),
target.getGenericsTypes());
+ ClassNode superClass = getNextSuperClass(type, target);
+ if (GenericsUtils.hasUnresolvedGenerics(superClass)) {
+ // propagate type arguments to the super class or interface
+ Map<GenericsTypeName, GenericsType> spec = new HashMap<>();
+ if (type.getGenericsTypes() != null) {
+ extractGenericsConnections(spec, type, type.redirect());
+ } else if (type.redirect().getGenericsTypes() != null) {
+ for (GenericsType tp : type.redirect().getGenericsTypes())
{
+ spec.put(new GenericsTypeName(tp.getName()), new
GenericsType(getCombinedBoundType(tp))); //GROOVY-10651
+ }
+ }
+ superClass = applyGenericsContext(spec, superClass);
+ }
+ extractGenericsConnections(connections, superClass, target);
}
}
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
index 63e462da4a..6e7f8ca320 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
@@ -254,6 +254,14 @@ public class Java8 implements VMPlugin {
private ClassNode configureParameterizedType(final ParameterizedType
parameterizedType) {
ClassNode base = configureType(parameterizedType.getRawType());
GenericsType[] gts =
configureTypeArguments(parameterizedType.getActualTypeArguments());
+ // fix erasure : ResolveVisitor#resolveWildcardBounding
+ final int n; if (gts != null && (n = gts.length) > 0) {
+ for (int i = 0; i < n; i += 1) { GenericsType gt = gts[i];
+ if (!gt.isWildcard() || gt.getUpperBounds() != null) continue;
+ ClassNode[] ubs =
base.redirect().getGenericsTypes()[i].getUpperBounds();
+ if (ubs != null && !ClassHelper.OBJECT_TYPE.equals(ubs[0]))
gt.getType().setRedirect(ubs[0]);
+ }
+ }
base.setGenericsTypes(gts);
return base;
}
diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index 297ae34a62..0864efda0e 100644
--- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -804,12 +804,12 @@ class ArraysAndCollectionsSTCTest extends
StaticTypeCheckingTestCase {
}
// GROOVY-6266
- void testMapKeyGenerics() {
- assertScript """
- HashMap<String,List<List>> AR=new HashMap<String,List<List>>()
- AR.get('key',[['val1'],['val2']])
- assert AR.'key'[0] == ['val1']
- """
+ void testMapGenerics() {
+ assertScript '''
+ Map<String, List<List>> map = new HashMap<>()
+ map.get('key', [(List)['val1'],['val2']])
+ assert map.key[0] == ['val1']
+ '''
}
// GROOVY-6311
diff --git
a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
index 49f381a3af..2586e62c35 100644
--- a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
@@ -1269,7 +1269,7 @@ class ClosureParamTypeInferenceSTCTest extends
StaticTypeCheckingTestCase {
'''
}
void testDGM_eachWithIndexOnRecursiveIterable() { // GROOVY-10651
- ['', '<?>'].each { args ->
+ for (args in ['','<?>']) {
assertScript """
void proc(groovy.transform.stc.TreeNode$args node) {
node.eachWithIndex { child, index ->