Skip to content

Commit 50d035a

Browse files
committed
GROOVY-11616: STC: combine multiple type witnesses for type parameter
1 parent 14fcb08 commit 50d035a

3 files changed

Lines changed: 22 additions & 2 deletions

File tree

src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1951,7 +1951,14 @@ static GenericsType getCombinedGenericsType(final GenericsType gt1, final Generi
19511951
// GROOVY-11028, et al.: empty list / map for gt1 or gt2?
19521952
if (gt2.isPlaceholder() && gt2.getName().startsWith("#")) return gt1;
19531953
if (gt1.isPlaceholder() && gt1.getName().startsWith("#")) return gt2;
1954-
// GROOVY-10315, GROOVY-10317, GROOVY-10339, ...
1954+
// GROOVY-10315, GROOVY-10317, GROOVY-10339, GROOVY-11616
1955+
if (!gt1.isPlaceholder() && !gt1.isWildcard()
1956+
&& !gt2.isPlaceholder() && !gt2.isWildcard()) {
1957+
ClassNode lub = lowestUpperBound(gt1.getType(), gt2.getType());
1958+
if (!(lub instanceof WideningCategories.LowestUpperBoundClassNode)) {
1959+
return new GenericsType(lub);
1960+
}
1961+
}
19551962
ClassNode cn1 = GenericsUtils.makeClassSafe0(CLASS_Type, gt1);
19561963
ClassNode cn2 = GenericsUtils.makeClassSafe0(CLASS_Type, gt2);
19571964
ClassNode lub = lowestUpperBound(cn1, cn2);

src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5620,7 +5620,7 @@ private Map<GenericsTypeName, GenericsType> extractGenericsConnectionsFromArgume
56205620
}
56215621

56225622
connections.forEach((gtn, gt) -> resolvedPlaceholders.merge(gtn, gt, (gt1, gt2) -> {
5623-
// GROOVY-10339: incorporate another witness
5623+
// GROOVY-10339, GROOVY-11616: incorporate another type witness
56245624
return getCombinedGenericsType(gt1, gt2);
56255625
}));
56265626
}

src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,19 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
250250
def list = Arrays.asList()
251251
assert list.size() == 0
252252
'''
253+
254+
// GROOVY-11616:
255+
assertScript '''
256+
class A {}
257+
class B extends A {}
258+
class C extends B {}
259+
@ASTTest(phase=INSTRUCTION_SELECTION, value={
260+
def type = node.getNodeMetaData(INFERRED_TYPE)
261+
assert type.toString(false) == 'java.util.List<A>'
262+
})
263+
def list = Arrays.asList(new A(), new B(), new C())
264+
assert list.size() == 3
265+
'''
253266
}
254267

255268
// GROOVY-10062

0 commit comments

Comments
 (0)