1919package the .bytecode .club .bytecodeviewer .decompilers .impl ;
2020
2121import com .konloch .disklib .DiskReader ;
22+ import org .apache .commons .io .FilenameUtils ;
2223import org .jd .core .v1 .ClassFileToJavaSourceDecompiler ;
2324import org .objectweb .asm .tree .ClassNode ;
25+ import org .objectweb .asm .tree .InnerClassNode ;
26+ import the .bytecode .club .bytecodeviewer .BytecodeViewer ;
2427import the .bytecode .club .bytecodeviewer .Constants ;
28+ import the .bytecode .club .bytecodeviewer .api .ASMUtil ;
2529import the .bytecode .club .bytecodeviewer .api .ExceptionUI ;
2630import the .bytecode .club .bytecodeviewer .decompilers .AbstractDecompiler ;
2731import the .bytecode .club .bytecodeviewer .decompilers .jdgui .CommonPreferences ;
2832import the .bytecode .club .bytecodeviewer .decompilers .jdgui .DirectoryLoader ;
2933import the .bytecode .club .bytecodeviewer .decompilers .jdgui .JDGUIClassFileUtil ;
3034import the .bytecode .club .bytecodeviewer .decompilers .jdgui .PlainTextPrinter ;
35+ import the .bytecode .club .bytecodeviewer .resources .ResourceContainer ;
3136import the .bytecode .club .bytecodeviewer .translation .TranslatedStrings ;
3237import the .bytecode .club .bytecodeviewer .util .ExceptionUtils ;
3338import the .bytecode .club .bytecodeviewer .util .TempFile ;
3439
3540import java .io .*;
41+ import java .util .List ;
3642
3743import static the .bytecode .club .bytecodeviewer .Constants .FS ;
3844import static the .bytecode .club .bytecodeviewer .Constants .NL ;
@@ -53,12 +59,32 @@ public JDGUIDecompiler()
5359 super ("JD-GUI Decompiler" , "jdgui" );
5460 }
5561
62+ private String [] inners ;
5663 @ Override
5764 public String decompileClassNode (ClassNode cn , byte [] bytes )
5865 {
5966 TempFile tempFile = null ;
6067 String exception ;
6168
69+ List <InnerClassNode > innerClasses = cn .innerClasses ;
70+ inners = new String [innerClasses .size ()];
71+ for (int i = 0 ; i < innerClasses .size (); i ++)
72+ {
73+ if (innerClasses .get (i ).outerName != null && innerClasses .get (i ).outerName .equals (cn .name ))
74+ {
75+ inners [i ] = innerClasses .get (i ).name ;
76+ }
77+ else if (innerClasses .get (i ).outerName == null )
78+ {
79+ String name = innerClasses .get (i ).name ;
80+ name = name .substring (name .lastIndexOf ('/' ) + 1 );
81+ if (name .contains (cn .name .substring (cn .name .lastIndexOf ('/' ) + 1 )))
82+ {
83+ inners [i ] = innerClasses .get (i ).name ;
84+ }
85+ }
86+ }
87+
6288 try
6389 {
6490 //create the temporary files
@@ -75,9 +101,33 @@ public String decompileClassNode(ClassNode cn, byte[] bytes)
75101 fos .write (bytes );
76102 }
77103
104+ // create the inner class temp files
105+ File innerTempFile ;
106+ for (ResourceContainer container : BytecodeViewer .resourceContainers .values ())
107+ {
108+ for (String s : container .resourceClasses .keySet ())
109+ {
110+ for (String innerClassName : inners )
111+ {
112+ if (s .equals (innerClassName ))
113+ {
114+ ClassNode cn2 = container .resourceClasses .get (innerClassName );
115+ tempFile .setUniqueName (cn2 .name );
116+ innerTempFile = tempFile .createFileFromExtension (false , false , ".class" );
117+ try (FileOutputStream fos = new FileOutputStream (innerTempFile ))
118+ {
119+ fos .write (ASMUtil .nodeToBytes (cn2 ));
120+ }
121+ }
122+ }
123+ }
124+ }
125+
78126 String pathToClass = tempClassFile .getAbsolutePath ().replace ('/' , File .separatorChar ).replace ('\\' , File .separatorChar );
79127 String directoryPath = JDGUIClassFileUtil .ExtractDirectoryPath (pathToClass );
80- String internalPath = JDGUIClassFileUtil .ExtractInternalPath (directoryPath , pathToClass );
128+ String internalPath = FilenameUtils .removeExtension (JDGUIClassFileUtil .ExtractInternalPath (directoryPath ,
129+ pathToClass ));
130+
81131
82132 CommonPreferences preferences = new CommonPreferences ()
83133 {
0 commit comments