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/10/07 01:49:16 UTC

[groovy] 01/01: GROOVY-9771: visit receiver for private field access

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-9771
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit fbe5a4c44df1d070ac50326967791d35d86e71ed
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Oct 6 20:48:58 2020 -0500

    GROOVY-9771: visit receiver for private field access
---
 .../StaticTypesBinaryExpressionMultiTypeDispatcher.java  |  3 +++
 .../groovy/classgen/asm/sc/bugs/Groovy7361Bug.groovy     | 16 ++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
index 6df100c..9ad87e9 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
@@ -44,6 +44,7 @@ import org.codehaus.groovy.classgen.asm.VariableSlotLoader;
 import org.codehaus.groovy.classgen.asm.WriterController;
 import org.codehaus.groovy.syntax.Token;
 import org.codehaus.groovy.syntax.TokenUtil;
+import org.codehaus.groovy.transform.sc.StaticCompilationVisitor;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 
@@ -401,6 +402,8 @@ public class StaticTypesBinaryExpressionMultiTypeDispatcher extends BinaryExpres
             if (rhsValueLoader instanceof VariableSlotLoader && enclosing instanceof BinaryExpression) {
                 rhsValueLoader.putNodeMetaData(INFERRED_TYPE, controller.getTypeChooser().resolveType(enclosing, controller.getClassNode()));
             }
+            // GROOVY-9771
+            receiver.visit(new StaticCompilationVisitor(controller.getSourceUnit(), controller.getClassNode()));
 
             // replace assignment to a subscript operator with a method call
             // e.g. x[5] = 10 -> methodCall(x, "putAt", [5, 10])
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7361Bug.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7361Bug.groovy
index 9878851..1a26703 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7361Bug.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7361Bug.groovy
@@ -87,4 +87,20 @@ final class Groovy7361Bug extends StaticTypeCheckingTestCase implements StaticCo
             new B().checkMap()
         '''
     }
+
+    // GROOVY-9771
+    void testShouldNotThrowClassCastExceptionForSubscriptPrivateAccess() {
+        assertScript '''
+            class C {
+                private final Map<String, Boolean> map = [:]
+                void checkMap() {
+                    { ->
+                        map['key'] = true
+                    }.call()
+                    assert map == [key: true]
+                }
+            }
+            new C().checkMap()
+        '''
+    }
 }