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 2021/05/13 19:55:53 UTC

[groovy] branch master updated: GROOVY-10088: STC: apply receiver generics to setter parameter

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


The following commit(s) were added to refs/heads/master by this push:
     new dc88d94  GROOVY-10088: STC: apply receiver generics to setter parameter
dc88d94 is described below

commit dc88d94b1b742551c1b47f5dd5fd1cbefdf406b8
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu May 13 14:40:17 2021 -0500

    GROOVY-10088: STC: apply receiver generics to setter parameter
---
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java | 17 +++++++++++++----
 src/test/groovy/transform/stc/GenericsSTCTest.groovy    | 14 ++++++++++++++
 2 files changed, 27 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 588532e..30a32be 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -976,11 +976,20 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             return call.getNodeMetaData(DIRECT_METHOD_CALL_TARGET);
         };
 
+        Function<MethodNode, ClassNode> setterType = setter -> {
+            ClassNode type = setter.getParameters()[0].getOriginType();
+            if (!setter.isStatic() && GenericsUtils.hasUnresolvedGenerics(type)) {
+                Map<GenericsTypeName, GenericsType> spec = extractPlaceHolders(null, setterInfo.receiverType, setter.getDeclaringClass());
+                type = applyGenericsContext(spec, type);
+            }
+            return type;
+        };
+
         MethodNode methodTarget = setterCall.apply(newRightExpression);
         if (methodTarget == null && !isCompoundAssignment(expression)) {
             // if no direct match, try implicit conversion
             for (MethodNode setter : setterInfo.setters) {
-                ClassNode lType = setter.getParameters()[0].getOriginType();
+                ClassNode lType = setterType.apply(setter);
                 ClassNode rType = getDeclaredOrInferredType(newRightExpression);
                 if (checkCompatibleAssignmentTypes(lType, rType, newRightExpression, false)) {
                     methodTarget = setterCall.apply(castX(lType, newRightExpression));
@@ -995,14 +1004,14 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             for (MethodNode setter : setterInfo.setters) {
                 if (setter == methodTarget) {
                     leftExpression.putNodeMetaData(DIRECT_METHOD_CALL_TARGET, methodTarget);
-                    leftExpression.removeNodeMetaData(INFERRED_TYPE); // clear the assumption
-                    storeType(leftExpression, methodTarget.getParameters()[0].getOriginType());
+                    leftExpression.removeNodeMetaData(INFERRED_TYPE); // clear assumption
+                    storeType(leftExpression, setterType.apply(methodTarget));
                     break;
                 }
             }
             return false;
         } else {
-            ClassNode firstSetterType = setterInfo.setters.get(0).getParameters()[0].getOriginType();
+            ClassNode firstSetterType = setterType.apply(setterInfo.setters.get(0));
             addAssignmentError(firstSetterType, getType(newRightExpression), expression);
             return true;
         }
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index d65b991..0ed76ea 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1566,6 +1566,20 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         }
     }
 
+    // GROOVY-10088
+    void testShouldUseMethodGenericType12() {
+        shouldFailWithMessages '''
+            class C<T> {
+                void setP(T t) { }
+            }
+            class D<X> extends C<X> {
+            }
+
+            new D<Number>().p = 'x'
+        ''',
+        'Cannot assign value of type java.lang.String to variable of type java.lang.Number'
+    }
+
     // GROOVY-5516
     void testAddAllWithCollectionShouldBeAllowed() {
         assertScript '''import org.codehaus.groovy.transform.stc.ExtensionMethodNode