This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 5374e521b1 GROOVY-11616: STC: combine multiple type witnesses for type
parameter
5374e521b1 is described below
commit 5374e521b1f38d1472292310fdb8023d02c24e4c
Author: Eric Milles <[email protected]>
AuthorDate: Thu May 8 11:21:34 2025 -0500
GROOVY-11616: STC: combine multiple type witnesses for type parameter
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 9 ++++++++-
.../groovy/transform/stc/StaticTypeCheckingVisitor.java | 2 +-
src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy | 13 +++++++++++++
3 files changed, 22 insertions(+), 2 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 e075f7eb0a..2a57b95f6e 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1951,7 +1951,14 @@ public abstract class StaticTypeCheckingSupport {
// GROOVY-11028, et al.: empty list / map for gt1 or gt2?
if (gt2.isPlaceholder() && gt2.getName().startsWith("#")) return gt1;
if (gt1.isPlaceholder() && gt1.getName().startsWith("#")) return gt2;
- // GROOVY-10315, GROOVY-10317, GROOVY-10339, ...
+ // GROOVY-10315, GROOVY-10317, GROOVY-10339, GROOVY-11616
+ if (!gt1.isPlaceholder() && !gt1.isWildcard()
+ && !gt2.isPlaceholder() && !gt2.isWildcard()) {
+ ClassNode lub = lowestUpperBound(gt1.getType(), gt2.getType());
+ if (!(lub instanceof
WideningCategories.LowestUpperBoundClassNode)) {
+ return new GenericsType(lub);
+ }
+ }
ClassNode cn1 = GenericsUtils.makeClassSafe0(CLASS_Type, gt1);
ClassNode cn2 = GenericsUtils.makeClassSafe0(CLASS_Type, gt2);
ClassNode lub = lowestUpperBound(cn1, cn2);
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 2d72a17e0f..f375a1ea7d 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5620,7 +5620,7 @@ trying: for (ClassNode[] signature : signatures) {
}
connections.forEach((gtn, gt) ->
resolvedPlaceholders.merge(gtn, gt, (gt1, gt2) -> {
- // GROOVY-10339: incorporate another witness
+ // GROOVY-10339, GROOVY-11616: incorporate another
type witness
return getCombinedGenericsType(gt1, gt2);
}));
}
diff --git a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
index 6f75b44d11..332490a0cb 100644
--- a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
@@ -250,6 +250,19 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
def list = Arrays.asList()
assert list.size() == 0
'''
+
+ // GROOVY-11616:
+ assertScript '''
+ class A {}
+ class B extends A {}
+ class C extends B {}
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def type = node.getNodeMetaData(INFERRED_TYPE)
+ assert type.toString(false) == 'java.util.List<A>'
+ })
+ def list = Arrays.asList(new A(), new B(), new C())
+ assert list.size() == 3
+ '''
}
// GROOVY-10062