This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
new f262356 GROOVY-9652: after "x" to "delegate.x", don't make
"delegate.delegate.x"
f262356 is described below
commit f262356ba772fd6a2b724166e98f9193dc7a15d3
Author: Eric Milles <[email protected]>
AuthorDate: Mon Jul 27 10:49:41 2020 -0500
GROOVY-9652: after "x" to "delegate.x", don't make "delegate.delegate.x"
(cherry picked from commit 770f2555903b59f31927429413b9b936583fa5b2)
---
.../transformers/BinaryExpressionTransformer.java | 3 +-
.../VariableExpressionTransformer.java | 2 +-
.../groovy/transform/stc/ClosuresSTCTest.groovy | 32 ++++++++++++++++++++++
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
index 2955577..8941398 100644
---
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
+++
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
@@ -166,7 +166,8 @@ public class BinaryExpressionTransformer {
BinaryExpression optimized = tryOptimizeCharComparison(left,
right, bin);
if (optimized != null) {
optimized.removeNodeMetaData(StaticCompilationMetadataKeys.BINARY_EXP_TARGET);
- return transformBinaryExpression(optimized);
+
optimized.removeNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
+ return optimized;
}
String name = (String) list[1];
diff --git
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
index 7a75dd1..b37d898 100644
---
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
+++
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
@@ -49,7 +49,7 @@ public class VariableExpressionTransformer {
// to a property expression, as ACG would lose the information in
// processClassVariable before it reaches any makeCall, that could
handle it
Object val = expr.getNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER);
- if (val == null) return null;
+ if (val == null || val.equals(expr.getName())) return null;
// TODO: handle the owner and delegate cases better for nested
scenarios and potentially remove the need for the implicit this case
Expression receiver = varX("owner".equals(val) ? (String) val :
"delegate".equals(val) ? (String) val : "this");
diff --git a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
index 3eb1502..56ab82e 100644
--- a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
@@ -592,4 +592,36 @@ class ClosuresSTCTest extends StaticTypeCheckingTestCase {
}
'''
}
+
+ // GROOVY-9652
+ void testDelegatePropertyAndCharCompareOptimization() {
+ ['String', 'Character', 'char'].each { type ->
+ assertScript """
+ class Node {
+ String name
+ ${type} text
+ }
+ class Root implements Iterable<Node> {
+ @Override
+ Iterator<Node> iterator() {
+ return [
+ new Node(name: 'term', text: (${type}) 'a'),
+ new Node(name: 'dash', text: (${type}) '-'),
+ new Node(name: 'term', text: (${type}) 'b')
+ ].iterator()
+ }
+ }
+
+ void test() {
+ Root root = new Root()
+ root[0].with {
+ assert name == 'term'
+ assert text == 'a' // GroovyCastException: Cannot cast
object 'script@b91d8c4' with class 'script' to class 'bugs.Node'
+ }
+ }
+
+ test()
+ """
+ }
+ }
}