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 2020/09/10 22:15:27 UTC
[groovy] 01/01: GROOVY-9735: connect placeholder from context with
method generic params
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-9735
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit e8882afd09b8863c1c1aae197205348aafcf64fa
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Sep 10 17:15:08 2020 -0500
GROOVY-9735: connect placeholder from context with method generic params
@groovy.transform.TypeChecked
class C<T extends Number> {
List<T> list
def test() {
m(list) { /*...*/ } // "it" should infer as T/Number
}
def <U> void m(Iterable<U> items,
@ClosureParams(FirstParam.FirstGenericType) Closure block) {
}
}
---
.../transform/stc/StaticTypeCheckingSupport.java | 7 +++--
.../transform/stc/StaticTypeCheckingVisitor.java | 2 ++
.../stc/ClosureParamTypeInferenceSTCTest.groovy | 33 ++++++++++++++++++++--
3 files changed, 37 insertions(+), 5 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 b569fc9..eaead92 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -105,7 +105,6 @@ import static org.codehaus.groovy.ast.ClassHelper.make;
import static org.codehaus.groovy.ast.ClassHelper.makeWithoutCaching;
import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.void_WRAPPER_TYPE;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.getSuperClass;
import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean;
import static org.codehaus.groovy.syntax.Types.BITWISE_AND;
import static org.codehaus.groovy.syntax.Types.BITWISE_AND_EQUAL;
@@ -1744,7 +1743,7 @@ public abstract class StaticTypeCheckingSupport {
} else {
// first find matching super class or interface
- ClassNode superClass = getSuperClass(type, target);
+ ClassNode superClass = GenericsUtils.getSuperClass(type, target);
if (superClass != null) {
extractGenericsConnections(connections, getCorrectedClassNode(type, superClass, true), target);
} else {
@@ -2141,7 +2140,9 @@ public abstract class StaticTypeCheckingSupport {
if (rnTypes != null && cnTypes == null) return true;
if (cnTypes != null) {
for (GenericsType genericsType : cnTypes) {
- if (genericsType.isPlaceholder()) return true;
+ if (genericsType.isPlaceholder()) {
+ return genericsType.getType().equals(OBJECT_TYPE);
+ }
if (genericsType.isWildcard()) {
ClassNode lowerBound = genericsType.getLowerBound();
ClassNode[] upperBounds = genericsType.getUpperBounds();
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 f977ce1..06bec52 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5134,7 +5134,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
Map<GenericsTypeName, GenericsType> connections = new HashMap<>();
extractGenericsConnections(connections, argumentType, paramType);
extractGenericsConnectionsForSuperClassAndInterfaces(resolvedPlaceholders, connections);
+
applyGenericsConnections(connections, resolvedPlaceholders);
+ applyGenericsConnections(placeholdersFromContext, resolvedPlaceholders);
}
}
}
diff --git a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
index d991a6f..87416a2 100644
--- a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy
@@ -1378,8 +1378,6 @@ method()
void testGroovy9570() {
assertScript '''
- interface Item {}
-
class C<I extends Item> {
Queue<I> queue
@@ -1396,6 +1394,37 @@ method()
}
}
+ interface Item {}
+
+ new C()
+ '''
+ }
+
+ void testGroovy9735() {
+ assertScript '''
+ import groovy.transform.stc.*
+
+ class C<I extends Item> {
+ Queue<I> queue
+
+ def c = { ->
+ x(queue) { I item ->
+ println item
+ }
+ }
+
+ def m() {
+ x(queue) { I item ->
+ println item
+ }
+ }
+
+ def <T> T x(Collection<T> y, @ClosureParams(FirstParam.FirstGenericType) Closure z) {
+ }
+ }
+
+ interface Item {}
+
new C()
'''
}