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