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/04/26 16:35:29 UTC

[groovy] 01/01: GROOVY-9501: enable access to static, non-final, subclassed-outer fields

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

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

commit 3f5456138f15a46c53c7e8b0a1a613cc27d6ab23
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Apr 26 11:25:46 2020 -0500

    GROOVY-9501: enable access to static, non-final, subclassed-outer fields
---
 .../groovy/classgen/AsmClassGenerator.java         |  2 +-
 src/test/gls/innerClass/InnerClassTest.groovy      | 72 ++++++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index b6225a0..d62c732 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -1039,7 +1039,7 @@ public class AsmClassGenerator extends ClassGenerator {
                     if (field == null && outer != null) {
                         do {
                             FieldNode outerClassField = outer.getDeclaredField(name);
-                            if (outerClassField != null && outerClassField.isStatic() && outerClassField.isFinal()) {
+                            if (outerClassField != null && outerClassField.isStatic()) {
                                 if (outerClassField.isPrivate() && classNode.getOuterClass() != outer) {
                                     throw new GroovyBugError("Trying to access private field [" + outerClassField.getDeclaringClass() + "#" + outerClassField.getName() + "] from inner class");
                                 }
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 6dc5e50..0044a40 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -395,6 +395,78 @@ final class InnerClassTest {
         '''
     }
 
+    @Test // GROOVY-9501
+    void testUsageOfOuterField7() {
+        assertScript '''
+            class Main extends Outer {
+                static main(args) {
+                    newInstance().newThread()
+                    assert Outer.Inner.error == null
+                }
+            }
+
+            abstract class Outer {
+                private static volatile boolean flag
+
+                void newThread() {
+                    Thread thread = new Inner()
+                    thread.start()
+                    thread.join()
+                }
+
+                private final class Inner extends Thread {
+                    @Override
+                    void run() {
+                        try {
+                            if (!flag) {
+                                // do work
+                            }
+                        } catch (e) {
+                            error = e
+                        }
+                    }
+                    public static error
+                }
+            }
+        '''
+    }
+
+    @Test  // inner class is static instead of final
+    void testUsageOfOuterField8() {
+        assertScript '''
+            class Main extends Outer {
+                static main(args) {
+                    newInstance().newThread()
+                    assert Outer.Inner.error == null
+                }
+            }
+
+            abstract class Outer {
+                private static volatile boolean flag
+
+                void newThread() {
+                    Thread thread = new Inner()
+                    thread.start()
+                    thread.join()
+                }
+
+                private static class Inner extends Thread {
+                    @Override
+                    void run() {
+                        try {
+                            if (!flag) {
+                                // do work
+                            }
+                        } catch (e) {
+                            error = e
+                        }
+                    }
+                    public static error
+                }
+            }
+        '''
+    }
+
     @Test
     void testUsageOfOuterFieldOverridden() {
         assertScript '''