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()
+            """
+        }
+    }
 }