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 4919914 GROOVY-10330: STC: given type parameter `T`, LUB(`T`,`T`) is
`T`
4919914 is described below
commit 49199147eedf9c459c358ae354c771c7df0af5f7
Author: Eric Milles <[email protected]>
AuthorDate: Sat Oct 30 10:51:57 2021 -0500
GROOVY-10330: STC: given type parameter `T`, LUB(`T`,`T`) is `T`
---
.../groovy/ast/tools/WideningCategories.java | 8 ++-
.../groovy/transform/stc/GenericsSTCTest.groovy | 70 +++++++++++-----------
.../transform/stc/TernaryOperatorSTCTest.groovy | 22 +++++++
3 files changed, 62 insertions(+), 38 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
index bdd232f..dfb4f99 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
@@ -213,10 +213,12 @@ public class WideningCategories {
*/
public static ClassNode lowestUpperBound(final ClassNode a, final
ClassNode b) {
ClassNode lub = lowestUpperBound(a, b, null, null);
- if (lub==null || !lub.isUsingGenerics()) return lub;
- // types may be parameterized. If so, we must ensure that generic type
arguments
+ if (lub == null || !lub.isUsingGenerics()
+ || lub.isGenericsPlaceHolder()) { // GROOVY-10330
+ return lub;
+ }
+ // types may be parameterized; if so, ensure that generic type
arguments
// are made compatible
-
if (lub instanceof LowestUpperBoundClassNode) {
// no parent super class representing both types could be found
// or both class nodes implement common interfaces which may have
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 6146b98..e20c656 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1866,49 +1866,49 @@ class GenericsSTCTest extends
StaticTypeCheckingTestCase {
// GROOVY-5594
void testMapEntryUsingPropertyNotation() {
assertScript '''
- Map.Entry<Date, Integer> entry = null
+ Map.Entry<Date, Integer> entry = null
- @ASTTest(phase=INSTRUCTION_SELECTION, value={
- assert node.getNodeMetaData(INFERRED_TYPE) == make(Date)
- })
- def k = entry?.key
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ assert node.getNodeMetaData(INFERRED_TYPE) == make(Date)
+ })
+ def k = entry?.key
- @ASTTest(phase=INSTRUCTION_SELECTION, value={
- assert node.getNodeMetaData(INFERRED_TYPE) == Integer_TYPE
- })
- def v = entry?.value
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ assert node.getNodeMetaData(INFERRED_TYPE) == Integer_TYPE
+ })
+ def v = entry?.value
'''
}
void testInferenceFromMap() {
assertScript '''
- Map<Date, Integer> map = [:]
+ Map<Date, Integer> map = [:]
- @ASTTest(phase=INSTRUCTION_SELECTION, value={
- def infType = node.getNodeMetaData(INFERRED_TYPE)
- assert infType == make(Set)
- def entryInfType = infType.genericsTypes[0].type
- assert entryInfType == make(Map.Entry)
- assert entryInfType.genericsTypes[0].type == make(Date)
- assert entryInfType.genericsTypes[1].type == Integer_TYPE
- })
- def entries = map?.entrySet()
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def infType = node.getNodeMetaData(INFERRED_TYPE)
+ assert infType == make(Set)
+ def entryInfType = infType.genericsTypes[0].type
+ assert entryInfType == make(Map.Entry)
+ assert entryInfType.genericsTypes[0].type == make(Date)
+ assert entryInfType.genericsTypes[1].type == Integer_TYPE
+ })
+ def entries = map?.entrySet()
'''
}
void testInferenceFromListOfMaps() {
assertScript '''
- List<Map<Date, Integer>> maps = []
+ List<Map<Date, Integer>> maps = []
- @ASTTest(phase=INSTRUCTION_SELECTION, value={
- def listType = node.getNodeMetaData(INFERRED_TYPE)
- assert listType == Iterator_TYPE
- def infType = listType.genericsTypes[0].type
- assert infType == make(Map)
- assert infType.genericsTypes[0].type == make(Date)
- assert infType.genericsTypes[1].type == Integer_TYPE
- })
- def iter = maps?.iterator()
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def listType = node.getNodeMetaData(INFERRED_TYPE)
+ assert listType == Iterator_TYPE
+ def infType = listType.genericsTypes[0].type
+ assert infType == make(Map)
+ assert infType.genericsTypes[0].type == make(Date)
+ assert infType.genericsTypes[1].type == Integer_TYPE
+ })
+ def iter = maps?.iterator()
'''
}
@@ -3215,7 +3215,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
}
void testHiddenGenerics() {
- // Groovy-6237
+ // GROOVY-6237
assertScript '''
class MyList extends LinkedList<Object> {}
List<Object> o = new MyList()
@@ -3227,18 +3227,18 @@ class GenericsSTCTest extends
StaticTypeCheckingTestCase {
List<Blah> o = new MyList()
''','Incompatible generic argument types. Cannot assign MyList to:
java.util.List<Blah>'
- // Groovy-5873
- assertScript """
+ // GROOVY-5873
+ assertScript '''
abstract class Parent<T> {
public T value
}
class Impl extends Parent<Integer> {}
Impl impl = new Impl()
Integer i = impl.value
- """
+ '''
// GROOVY-5920
- assertScript """
+ assertScript '''
class Data<T> {
T value
}
@@ -3258,7 +3258,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
}
}
Runner.main(null);
- """
+ '''
}
void testReturnTypeInferenceRemovalWithGenerics() {
diff --git a/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
b/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
index a55f158..1b009d5 100644
--- a/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
@@ -131,6 +131,28 @@ class TernaryOperatorSTCTest extends
StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10330
+ void testTypeParameterTypeParameter() {
+ assertScript '''
+ class C<T> {
+ T y
+ void m(T x, java.util.function.Function<T, T> f) {
+ assert f.apply(x) == 'foo'
+ }
+ void test(T x, java.util.function.Function<T, T> f) {
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def type = node.getNodeMetaData(INFERRED_TYPE)
+ assert type.isGenericsPlaceHolder()
+ assert type.unresolvedName == 'T'
+ })
+ def z = true ? x : y
+ m(z, f)
+ }
+ }
+ new C<String>().test('FOO', { it.toLowerCase() })
+ '''
+ }
+
// GROOVY-5523
void testNull1() {
assertScript '''