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 '''

Reply via email to