]> source.dussan.org Git - javassist.git/commitdiff
Fix #152 inner class modifiers. 167/head
authornickl- <github@jigsoft.co.za>
Sat, 11 Nov 2017 20:34:34 +0000 (22:34 +0200)
committernickl- <github@jigsoft.co.za>
Sun, 12 Nov 2017 21:55:35 +0000 (23:55 +0200)
Applied fix for #152 "Wrong modifiers returned for nested classes" as suggested by @pietrobraione.
Includes unit tests for all access modifiers and static.

src/main/javassist/CtClassType.java
src/test/javassist/JvstTest5.java
src/test/test5/InnerModifier2.java [new file with mode: 0644]

index 0c2f775e734575d264183d706dd8808fad021cb9..3791b5fb42e0f9fa59d33186b7f5a94e1a59e772 100644 (file)
@@ -446,9 +446,19 @@ class CtClassType extends CtClass {
         int acc = cf.getAccessFlags();
         acc = AccessFlag.clear(acc, AccessFlag.SUPER);
         int inner = cf.getInnerAccessFlags();
-        if (inner != -1 && (inner & AccessFlag.STATIC) != 0)
-            acc |= AccessFlag.STATIC;
-
+        if (inner != -1) {
+            if ((inner & AccessFlag.STATIC) != 0)
+                acc |= AccessFlag.STATIC;
+            if ((inner & AccessFlag.PUBLIC) != 0)
+                acc |= AccessFlag.PUBLIC;
+            else {
+                acc &= ~AccessFlag.PUBLIC; //clear PUBLIC
+                if ((inner & AccessFlag.PROTECTED) != 0)
+                    acc |= AccessFlag.PROTECTED;
+                else if ((inner & AccessFlag.PRIVATE) != 0)
+                    acc |= AccessFlag.PRIVATE;
+            }
+        }
         return AccessFlag.toModifier(acc);
     }
 
index 578abfb24ad1d743b2d9a4ce962548c4ca66fc39..346263cb6df8a37873ecfa2d1338b77db2ca7a98 100644 (file)
@@ -344,6 +344,52 @@ public class JvstTest5 extends JvstTestRoot {
         assertEquals(Modifier.PUBLIC, ica4.accessFlags(i5));
     }
 
+    public void testInnerClassModifiers2() throws Exception {
+        CtClass cc = sloader.get("test5.InnerModifier2$Protected");
+        Class<?> ccc = Class.forName("test5.InnerModifier2$Protected");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isProtected(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$Public");
+        ccc = Class.forName("test5.InnerModifier2$Public");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPublic(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$Private");
+        ccc = Class.forName("test5.InnerModifier2$Private");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPrivate(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$Package");
+        ccc = Class.forName("test5.InnerModifier2$Package");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPackage(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$ProtectedStatic");
+        ccc = Class.forName("test5.InnerModifier2$ProtectedStatic");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isProtected(cc.getModifiers()));
+        assertTrue(Modifier.isStatic(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$PublicStatic");
+        ccc = Class.forName("test5.InnerModifier2$PublicStatic");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPublic(cc.getModifiers()));
+        assertTrue(Modifier.isStatic(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$PrivateStatic");
+        ccc = Class.forName("test5.InnerModifier2$PrivateStatic");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPrivate(cc.getModifiers()));
+        assertTrue(Modifier.isStatic(cc.getModifiers()));
+
+        cc = sloader.get("test5.InnerModifier2$PackageStatic");
+        ccc = Class.forName("test5.InnerModifier2$PackageStatic");
+        assertEquals(cc.getModifiers(), ccc.getModifiers());
+        assertTrue(Modifier.isPackage(cc.getModifiers()));
+        assertTrue(Modifier.isStatic(cc.getModifiers()));
+    }
+
     private InnerClassesAttribute getInnerClassAttr(CtClass cc) {
         return (InnerClassesAttribute)cc.getClassFile2().getAttribute(InnerClassesAttribute.tag);
     }
diff --git a/src/test/test5/InnerModifier2.java b/src/test/test5/InnerModifier2.java
new file mode 100644 (file)
index 0000000..009a032
--- /dev/null
@@ -0,0 +1,13 @@
+package test5;
+
+@SuppressWarnings("unused")
+public class InnerModifier2 {
+    public class Public {}
+    protected class Protected {}
+    private class Private {}
+    class Package {}
+    public static class PublicStatic {}
+    protected static class ProtectedStatic {}
+    private static class PrivateStatic {}
+    static class PackageStatic {}
+}