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 2021/04/22 19:46:07 UTC
[groovy] branch master updated: GROOVY-10051: STC: fully resolve "T
extends Number" to Number not Object
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 94fa63e GROOVY-10051: STC: fully resolve "T extends Number" to Number not Object
94fa63e is described below
commit 94fa63e8b11557478808a54b4c66ab2333ab9136
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Apr 22 14:44:48 2021 -0500
GROOVY-10051: STC: fully resolve "T extends Number" to Number not Object
---
.../transform/stc/StaticTypeCheckingSupport.java | 2 +-
.../groovy/transform/stc/GenericsSTCTest.groovy | 37 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 1 deletion(-)
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 9b47aaa..c30d3e2 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1646,7 +1646,7 @@ public abstract class StaticTypeCheckingSupport {
}
// 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 = OBJECT_TYPE;
+ ClassNode replacementType = gt.getType().redirect();
if (gt.getType().getGenericsTypes() != null) {
GenericsType realGt = gt.getType().getGenericsTypes()[0];
if (realGt.getLowerBound() != null) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 9abd9cc..885c00b 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -270,6 +270,43 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10051
+ void testReturnTypeInferenceWithMethodGenerics10() {
+ assertScript '''
+ abstract class State<H extends Handle> {
+ // Why not return HandleContainer<H>? I can't really say.
+ def <T extends Handle> HandleContainer<T> getHandleContainer(key) {
+ }
+ }
+ class HandleContainer<H extends Handle> {
+ H handle
+ }
+ interface Handle {
+ Result getResult()
+ }
+ class Result {
+ int itemCount
+ String[] items
+ }
+
+ List<String> getStrings(State state, List keys) {
+ keys.collectMany { key ->
+ List<String> strings = Collections.emptyList()
+ def container = state.getHandleContainer(key) // returns HandleContainer<Object> not HandleContainer<SearchHandle>
+ if (container != null) {
+ def result = container.handle.result
+ if (result != null && result.itemCount > 0) {
+ strings = Arrays.asList(result.items)
+ }
+ }
+ strings
+ }
+ }
+
+ assert getStrings(null,[]).isEmpty()
+ '''
+ }
+
void testDiamondInferrenceFromConstructor1() {
assertScript '''
class Foo<U> {