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/07/24 16:54:19 UTC
[groovy] 01/02: GROOVY-10698: STC: apply explicit/implicit type arguments to parameters
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
commit 3befc55cf560b5406bf9a98f366196b101ff8402
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Jul 24 11:52:36 2022 -0500
GROOVY-10698: STC: apply explicit/implicit type arguments to parameters
---
.../transform/stc/StaticTypeCheckingVisitor.java | 9 +++++----
src/test/groovy/transform/stc/GenericsSTCTest.groovy | 18 ++++++++++++++++++
2 files changed, 23 insertions(+), 4 deletions(-)
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 c5d306b819..5bba1ed565 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2295,9 +2295,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
ctor = findMethodOrFail(call, receiver, "<init>", argumentTypes);
if (ctor != null) {
Parameter[] parameters = ctor.getParameters();
- if (asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624
- Map<GenericsTypeName, GenericsType> context = extractPlaceHolders(receiver, ctor.getDeclaringClass());
- parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
+ GenericsType[] typeParameters = ctor.getDeclaringClass().getGenericsTypes();
+ if (typeParameters != null) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, GROOVY-10698
+ Map<GenericsTypeName, GenericsType> context = extractGenericsConnectionsFromArguments(typeParameters, parameters, argumentList, receiver.getGenericsTypes());
+ if (!context.isEmpty()) parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
}
resolvePlaceholdersFromImplicitTypeHints(argumentTypes, argumentList, parameters);
typeCheckMethodsWithGenericsOrFail(receiver, argumentTypes, ctor, call);
@@ -5389,7 +5390,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
private Map<GenericsTypeName, GenericsType> extractGenericsConnectionsFromArguments(final GenericsType[] methodGenericTypes, final Parameter[] parameters, final Expression arguments, final GenericsType[] explicitTypeHints) {
Map<GenericsTypeName, GenericsType> resolvedPlaceholders = new HashMap<>();
- if (explicitTypeHints != null) { // resolve type parameters from type arguments
+ if (asBoolean(explicitTypeHints)) { // resolve type parameters from type arguments
int n = methodGenericTypes.length;
if (n == explicitTypeHints.length) {
for (int i = 0; i < n; i += 1) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 0dc1f6995f..603dd1107b 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1470,6 +1470,24 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10698
+ void testDiamondInferrenceFromConstructor34() {
+ assertScript '''
+ class A<T> {
+ A(T t, B<T> b_of_t) {
+ }
+ }
+ class B<U> {
+ }
+
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ def type = node.getNodeMetaData(INFERRED_TYPE)
+ assert type.toString(false) == 'A<java.lang.String>'
+ })
+ def x = new A<>('witness', new B<>()) // Cannot call A#<init>(Object,B<Object>) with arguments [String, B<T>]
+ '''
+ }
+
// GROOVY-10280
void testTypeArgumentPropagation() {
assertScript '''