You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2022/09/17 16:34:33 UTC
[groovy] branch master updated: GROOVY-6668, GROOVY-8212: STC: distance of `GString` for `String` target
This is an automated email from the ASF dual-hosted git repository.
sunlan 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 5064b65afa GROOVY-6668, GROOVY-8212: STC: distance of `GString` for `String` target
5064b65afa is described below
commit 5064b65afa0f3acf5490f1ea458163411c0c6339
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Aug 18 12:10:41 2022 -0500
GROOVY-6668, GROOVY-8212: STC: distance of `GString` for `String` target
---
.../transform/stc/StaticTypeCheckingSupport.java | 3 ++
.../transform/stc/StaticTypeCheckingVisitor.java | 2 +-
.../stc/DefaultGroovyMethodsSTCTest.groovy | 42 ++++++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 3543c4a731..3ed435e7dd 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -923,6 +923,9 @@ public abstract class StaticTypeCheckingSupport {
if (receiver.isArray() && compare.isArray()) {
return getDistance(receiver.getComponentType(), compare.getComponentType());
}
+ if (isGStringOrGStringStringLUB(receiver) && isStringType(compare)) {
+ return 3; // GROOVY-6668, GROOVY-8212: closer than Object and GroovyObjectSupport
+ }
int dist = 0;
ClassNode unwrapReceiver = getUnwrapper(receiver);
ClassNode unwrapCompare = getUnwrapper(compare);
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 464c41043c..1ea4432ed8 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -4545,7 +4545,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
if (isArrayOp(op)) {
- if (isOrImplements(left, MAP_TYPE) && isStringType(right)) { // GROOVY-5700, GROOVY-8788
+ if (isOrImplements(left, MAP_TYPE) && (isStringType(right) || isGStringOrGStringStringLUB(right))) { // GROOVY-5700, GROOVY-6668, GROOVY-8212, GROOVY-8788
PropertyExpression prop = propX(leftExpression, rightExpression); // m['xx'] -> m.xx
return existsProperty(prop, !typeCheckingContext.isTargetOfEnclosingAssignment(expr))
? getType(prop) : getTypeForMapPropertyExpression(left, prop);
diff --git a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
index 9aeb54e547..68eb4fb838 100644
--- a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
@@ -367,4 +367,46 @@ class DefaultGroovyMethodsSTCTest extends StaticTypeCheckingTestCase {
test()
'''
}
+
+ // GROOVY-6668, GROOVY-8212
+ void testMapGetAtVsObjectGetAt2() {
+ assertScript '''
+ Map<String, String> map = [key:'val']
+
+ // no value type inference
+ assert map.getAt('key') == 'val'
+ assert map.getAt("${'key'}") == 'val'
+
+ // yes value type inference
+ assert map['key'].toUpperCase() == 'VAL'
+ assert map["${'key'}"].toUpperCase() == 'VAL'
+
+ assert map.get('key').toUpperCase() == 'VAL'
+ assert map.get("${'key'}")?.toUpperCase() == null // get(Object); no coerce
+ '''
+ }
+
+ // GROOVY-6668, GROOVY-8212
+ void testMapPutAtVsObjectPutAt() {
+ assertScript '''
+ Map<String, String> map = [:]
+
+ map['key'] = 'val'
+ assert map.remove('key') == 'val'
+
+ map["${'key'}"] = 'val'
+ assert map.remove('key') == 'val'
+
+ map.putAt('key','val')
+ assert map.remove('key') == 'val'
+
+ map.putAt("${'key'}",'val')
+ assert map.remove('key') == 'val'
+ '''
+ shouldFailWithMessages '''
+ Map<String, String> map = [:]
+ map.put("${'key'}",'val')
+ ''',
+ 'Cannot call java.util.LinkedHashMap#put(java.lang.String, java.lang.String) with arguments [groovy.lang.GString, java.lang.String]'
+ }
}