This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_4_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit a38856efa3f67d674e10aa278b83bb921ffe055d 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 0ac085a786..473a1ccb55 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -2275,9 +2275,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { && parameters.length == argumentTypes.length - 1) { ctor = typeCheckMapConstructor(call, receiver, arguments); } else { - 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); @@ -5362,7 +5363,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 ee17a5d5f3..843abf5947 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 '''
