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 2022/03/01 21:25:20 UTC
[groovy] 01/02: GROOVY-9885: STC: use checkCompatibleAssignmentTypes for map constructor
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 2aee4021546fd8b89870e03a1cb7f7f5debf4b00
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Jan 16 11:41:30 2021 -0600
GROOVY-9885: STC: use checkCompatibleAssignmentTypes for map constructor
Conflicts:
src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
---
.../transform/stc/StaticTypeCheckingVisitor.java | 37 +++++++++++-----------
.../transform/stc/ConstructorsSTCTest.groovy | 16 ++++++++++
2 files changed, 34 insertions(+), 19 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 9d21672..19b0ff6 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1257,10 +1257,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
ClassNode wrappedRHS = adjustTypeForSpreading(inferredRightExpressionType, leftExpression);
// check types are compatible for assignment
- boolean compatible = checkCompatibleAssignmentTypes(leftRedirect, wrappedRHS, rightExpression);
-
-
- if (!compatible) {
+ if (!checkCompatibleAssignmentTypes(leftRedirect, wrappedRHS, rightExpression)) {
if (!extension.handleIncompatibleAssignment(leftExpressionType, inferredRightExpressionType, assignmentExpression)) {
addAssignmentError(leftExpressionType, inferredRightExpressionType, assignmentExpression.getRightExpression());
}
@@ -1277,23 +1274,25 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
// workaround for map-style checks putting setter info on wrong AST nodes
typeCheckingContext.pushEnclosingBinaryExpression(null);
for (MapEntryExpression entryExpression : mapExpression.getMapEntryExpressions()) {
- Expression keyExpr = entryExpression.getKeyExpression();
- if (!(keyExpr instanceof ConstantExpression)) {
- addStaticTypeError("Dynamic keys in map-style constructors are unsupported in static type checking", keyExpr);
+ Expression keyExpression = entryExpression.getKeyExpression();
+ if (!(keyExpression instanceof ConstantExpression)) {
+ addStaticTypeError("Dynamic keys in map-style constructors are unsupported in static type checking", keyExpression);
} else {
- AtomicReference<ClassNode> lookup = new AtomicReference<ClassNode>();
- PropertyExpression pexp = new PropertyExpression(varX("_", receiverType), keyExpr.getText());
- boolean hasProperty = existsProperty(pexp, false, new PropertyLookupVisitor(lookup));
- if (!hasProperty) {
- addStaticTypeError("No such property: " + keyExpr.getText() +
- " for class: " + receiverType.getName(), receiver);
+ String pName = keyExpression.getText();
+ AtomicReference<ClassNode> pType = new AtomicReference<>();
+ if (!existsProperty(new PropertyExpression(varX("_", receiverType), pName), false, new PropertyLookupVisitor(pType))) {
+ addStaticTypeError("No such property: " + pName + " for class: " + receiverType.getText(), receiver);
} else {
- ClassNode valueType = getType(entryExpression.getValueExpression());
- MethodNode setter = receiverType.getSetterMethod("set" + MetaClassHelper.capitalize(pexp.getPropertyAsString()), false);
- ClassNode toBeAssignedTo = setter == null ? lookup.get() : setter.getParameters()[0].getType();
- if (!isAssignableTo(valueType, toBeAssignedTo)
- && !extension.handleIncompatibleAssignment(toBeAssignedTo, valueType, entryExpression)) {
- addAssignmentError(toBeAssignedTo, valueType, entryExpression);
+ MethodNode setter = receiverType.getSetterMethod("set" + MetaClassHelper.capitalize(pName), false);
+ ClassNode targetType = setter != null ? setter.getParameters()[0].getType() : pType.get();
+ Expression valueExpression = entryExpression.getValueExpression();
+ ClassNode valueType = getType(valueExpression);
+
+ ClassNode resultType = getResultType(targetType, ASSIGN, valueType,
+ assignX(keyExpression, valueExpression, entryExpression));
+ if (!checkCompatibleAssignmentTypes(targetType, resultType, valueExpression)
+ && !extension.handleIncompatibleAssignment(targetType, valueType, entryExpression)) {
+ addAssignmentError(targetType, valueType, entryExpression);
}
}
}
diff --git a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
index f4d98ef..734fd48 100644
--- a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
@@ -318,6 +318,22 @@ class ConstructorsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-9885
+ void testUseGStringTernaryInNamedParameter() {
+ assertScript '''
+ @groovy.transform.ToString
+ class Pogo {
+ String value
+ }
+ def make(String string, whatever) {
+ new Pogo(value: string.trim() ?: "$whatever")
+ }
+ assert make('x','y').toString() == 'Pogo(x)'
+ assert make(' ','y').toString() == 'Pogo(y)'
+ assert make(' ',123).toString() == 'Pogo(123)'
+ '''
+ }
+
// GROOVY-5578
void testConstructJavaBeanFromMap() {
assertScript '''import groovy.transform.stc.MyBean