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 <[email protected]> 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 '''
