You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/11/17 08:54:01 UTC

[groovy] 06/18: GROOVY-8423: Do not adjust access modifiers for inner class table

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

sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 7b749c28b2817d72e4a2f31239e8e0dbdb5d3b6c
Author: Shil Sinha <sh...@apache.org>
AuthorDate: Thu Nov 14 17:24:00 2019 -0600

    GROOVY-8423: Do not adjust access modifiers for inner class table
    
    This closes #648
    
    (cherry picked from commit 10cebe871a574808f1edb87c73f0c17f73a24e10)
---
 .../groovy/classgen/AsmClassGenerator.java         | 14 +-----
 src/test/gls/innerClass/InnerClassTest.groovy      | 54 +++++++++++++++++++---
 2 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index a528d3b..bcc140f 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -309,20 +309,11 @@ public class AsmClassGenerator extends ClassGenerator {
             outerClassName = null;
             if (innerClass.isAnonymous()) innerClassName = null;
         }
-        int mods = adjustedClassModifiersForInnerClassTable(cn);
-        if ((mods & ACC_PRIVATE) != 0) {
-            mods ^= ACC_PRIVATE;
-            innerClass.setModifiers(mods);
-        }
-        classVisitor.visitInnerClass(
-                innerClassInternalName,
-                outerClassName,
-                innerClassName,
-                mods);
+        int modifiers = adjustedClassModifiersForInnerClassTable(cn);
+        classVisitor.visitInnerClass(innerClassInternalName, outerClassName, innerClassName, modifiers);
     }
 
     /*
-     * Classes but not interfaces should have ACC_SUPER set
      * See http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.6-300-D.2-5
      * for what flags are allowed depending on the fact we are writing the inner class table
      * or the class itself
@@ -331,7 +322,6 @@ public class AsmClassGenerator extends ClassGenerator {
         int modifiers = classNode.getModifiers();
         modifiers = modifiers & ~ACC_SUPER;
         modifiers = fixInterfaceModifiers(classNode, modifiers);
-        modifiers = fixInnerClassModifiers(classNode, modifiers);
         return modifiers;
     }
 
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 7bfd0ab..9f20b7e 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -122,19 +122,61 @@ final class InnerClassTest {
         '''
     }
 
+    @Test // GROOVY-8423
+    void testPrivateInnerClassHasPrivateModifier() {
+        assertScript '''
+            import static java.lang.reflect.Modifier.*
+
+            class A {
+                private class B {}
+            }
+
+            int modifiers = A.B.modifiers
+            assert isPrivate(modifiers)
+        '''
+    }
+
+    @Test // GROOVY-8423
+    void testProtectedInnerClassHasProtectedModifier() {
+        assertScript '''
+            import static java.lang.reflect.Modifier.*
+
+            class A {
+                protected class B {}
+            }
+
+            int modifiers = A.B.modifiers
+            assert isProtected(modifiers)
+        '''
+    }
+
+    @Test // GROOVY-8423
+    void testPackagePrivateInnerClassHasProtectedModifier() {
+        assertScript '''
+            import static java.lang.reflect.Modifier.*
+
+            class A {
+                @groovy.transform.PackageScope class B {}
+            }
+
+            int modifiers = A.B.modifiers
+            assert !isPrivate(modifiers) && !isProtected(modifiers) && !isPublic(modifiers)
+        '''
+    }
+
     @Test
     void testStaticInnerClass() {
         assertScript '''
-            import java.lang.reflect.Modifier
+            import static java.lang.reflect.Modifier.*
 
             class A {
-                static class B{}
+                static class B {}
             }
-            def x = new A.B()
-            assert x != null
+            def b = new A.B()
+            assert b != null
 
-            def mods = A.B.modifiers
-            assert Modifier.isPublic(mods)
+            int modifiers = A.B.modifiers
+            assert isPublic(modifiers)
         '''
     }