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 2020/07/27 15:52:19 UTC
[groovy] 01/01: GROOVY-9652: after "x" to "delegate.x",
don't make "delegate.delegate.x"
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-9652
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 870dc40d47533bf4a1bbf5ed04cc15d2fc6c6753
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Jul 27 10:49:41 2020 -0500
GROOVY-9652: after "x" to "delegate.x", don't make "delegate.delegate.x"
---
.../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 8523424..0bdd270 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
@@ -164,7 +164,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()
+ """
+ }
+ }
}