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 770f255  GROOVY-9652: after "x" to "delegate.x", don't make 
"delegate.delegate.x"
770f255 is described below

commit 770f2555903b59f31927429413b9b936583fa5b2
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"
---
 .../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()
+            """
+        }
+    }
 }

Reply via email to