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 2022/03/11 17:21:34 UTC
[groovy] branch GROOVY_3_0_X updated: GROOVY-10280: STC: do not mix type param contexts when resolving
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
new f9dc615 GROOVY-10280: STC: do not mix type param contexts when resolving
f9dc615 is described below
commit f9dc615df8b076b37cf40d640f3bcc66a25ddb2c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Mar 11 11:07:57 2022 -0600
GROOVY-10280: STC: do not mix type param contexts when resolving
---
.../transform/stc/StaticTypeCheckingSupport.java | 14 ++---
.../groovy/transform/stc/GenericsSTCTest.groovy | 61 ++++++++++++++++++++++
2 files changed, 66 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 f2ec272..c83f128 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1563,15 +1563,11 @@ public abstract class StaticTypeCheckingSupport {
}
}
- public static ClassNode resolveClassNodeGenerics(Map<GenericsTypeName, GenericsType> resolvedPlaceholders, final Map<GenericsTypeName, GenericsType> placeholdersFromContext, final ClassNode currentType) {
- ClassNode target = currentType.redirect();
- resolvedPlaceholders = new HashMap<>(resolvedPlaceholders);
- applyContextGenerics(resolvedPlaceholders, placeholdersFromContext);
-
- Map<GenericsTypeName, GenericsType> connections = new HashMap<>();
- extractGenericsConnections(connections, currentType, target);
- applyGenericsConnections(connections, resolvedPlaceholders);
- return applyGenericsContext(resolvedPlaceholders, currentType);
+ public static ClassNode resolveClassNodeGenerics(final Map<GenericsTypeName, GenericsType> resolvedPlaceholders, final Map<GenericsTypeName, GenericsType> placeholdersFromContext, final ClassNode currentType) {
+ ClassNode type = currentType; // GROOVY-10280, et al.
+ type = applyGenericsContext(resolvedPlaceholders, type);
+ type = applyGenericsContext(placeholdersFromContext, type);
+ return type;
}
static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> connections, final Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 06b1918..ae365ab 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -373,6 +373,67 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10283
+ void testDiamondInferrenceFromConstructor9() {
+ assertScript '''
+ class A<T1, T2> {
+ }
+ class B<T1 extends Number, T2 extends A<C, ? extends T1>> {
+ T2 t
+ B(T2 t) {
+ this.t = t
+ }
+ }
+ class C {
+ }
+
+ new B<Integer,A<C,Integer>>(new A<>())
+ '''
+ }
+
+ // GROOVY-10280
+ void testTypeArgumentPropagation() {
+ assertScript '''
+ class Test<T> {
+ T test() {
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def type = node.getNodeMetaData(INFERRED_TYPE)
+ assert type.toString(false) == 'T'
+ })
+ def t = new Foo<T>().x.y.z
+ }
+ }
+ class Foo<X> {
+ Bar<X> x = new Bar<>()
+ }
+ class Bar<T> {
+ Baz<T> y = new Baz<>()
+ }
+ class Baz<Z> {
+ Z z
+ }
+
+ new Test<String>().test()
+ '''
+ }
+
+ void testTypeArgumentPropagation2() {
+ assertScript '''
+ class Foo<T extends Bar> {
+ public List<T> bars
+ void test() {
+ bars[0].baz()
+ }
+ }
+ class Bar {
+ def baz() {}
+ }
+
+ def obj = new Foo(bars: [new Bar()])
+ obj.test()
+ '''
+ }
+
void testLinkedListWithListArgument() {
assertScript '''
List<String> list = new LinkedList<String>(['1','2','3'])