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/05/16 17:17:11 UTC
[groovy] branch GROOVY_4_0_X updated: GROOVY-10343: STC: resolve type parameter bounded by a type parameter
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 a53da1457d GROOVY-10343: STC: resolve type parameter bounded by a type parameter
a53da1457d is described below
commit a53da1457d16563752d6a11bc2563cc64f05c635
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon May 16 11:58:56 2022 -0500
GROOVY-10343: STC: resolve type parameter bounded by a type parameter
---
.../transform/stc/StaticTypeCheckingSupport.java | 28 ++++++++++++----------
.../groovy/transform/stc/GenericsSTCTest.groovy | 17 +++++++++++++
2 files changed, 32 insertions(+), 13 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 e8ebb62fc5..6738bfcf37 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1638,22 +1638,24 @@ public abstract class StaticTypeCheckingSupport {
}
}
- private static ClassNode extractType(final GenericsType gt) {
+ private static ClassNode extractType(GenericsType gt) {
+ ClassNode cn;
if (!gt.isPlaceholder()) {
- return getCombinedBoundType(gt);
- }
- // For a placeholder, a type based on the generics type is used for the compatibility check, to match on
- // the actual bounds and not the name of the placeholder.
- ClassNode replacementType = gt.getType().redirect();
- if (gt.getType().getGenericsTypes() != null) {
- GenericsType realGt = gt.getType().getGenericsTypes()[0];
- if (realGt.getLowerBound() != null) {
- replacementType = realGt.getLowerBound();
- } else if (asBoolean(realGt.getUpperBounds())) {
- replacementType = realGt.getUpperBounds()[0];
+ cn = getCombinedBoundType(gt);
+ } else {
+ // discard the placeholder
+ cn = gt.getType().redirect();
+
+ if (gt.getType().getGenericsTypes() != null)
+ gt = gt.getType().getGenericsTypes()[0];
+
+ if (gt.getLowerBound() != null) {
+ cn = gt.getLowerBound();
+ } else if (asBoolean(gt.getUpperBounds())) {
+ cn = gt.getUpperBounds()[0];
}
}
- return replacementType;
+ return cn;
}
private static boolean equalIncludingGenerics(final GenericsType one, final GenericsType two) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index ad6a5cc2ea..64b4374078 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1272,6 +1272,23 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10343
+ void testDiamondInferrenceFromConstructor27() {
+ assertScript '''
+ class C<T1, T2 extends T1> {
+ T1 p
+ C(T1 p) { this.p = p }
+ T2 m() { return null }
+ }
+ void test(Integer x) {
+ def c = new C<>(x) // type witness for T1 can also help bound T2
+ def y = c.m()
+ Integer z = y // Cannot assign value of type Object to variable of type Integer
+ }
+ test(1234)
+ '''
+ }
+
// GROOVY-10280
void testTypeArgumentPropagation() {
assertScript '''