22
22
import org .apache .commons .lang3 .ArrayUtils ;
23
23
import org .jetbrains .java .decompiler .main .decompiler .ConsoleDecompiler ;
24
24
import org .objectweb .asm .tree .ClassNode ;
25
+ import org .objectweb .asm .tree .InnerClassNode ;
25
26
import the .bytecode .club .bytecodeviewer .BytecodeViewer ;
26
27
import the .bytecode .club .bytecodeviewer .Constants ;
28
+ import the .bytecode .club .bytecodeviewer .api .ASMUtil ;
27
29
import the .bytecode .club .bytecodeviewer .api .ExceptionUI ;
28
30
import the .bytecode .club .bytecodeviewer .decompilers .AbstractDecompiler ;
29
31
import the .bytecode .club .bytecodeviewer .resources .ExternalResources ;
32
+ import the .bytecode .club .bytecodeviewer .resources .ResourceContainer ;
30
33
import the .bytecode .club .bytecodeviewer .translation .TranslatedStrings ;
31
34
import the .bytecode .club .bytecodeviewer .util .ExceptionUtils ;
32
35
import the .bytecode .club .bytecodeviewer .util .ProcessUtils ;
33
36
import the .bytecode .club .bytecodeviewer .util .TempFile ;
34
37
35
38
import java .io .*;
39
+ import java .util .ArrayList ;
40
+ import java .util .List ;
41
+ import java .util .concurrent .atomic .AtomicReference ;
36
42
37
43
import static the .bytecode .club .bytecodeviewer .Constants .*;
38
44
import static the .bytecode .club .bytecodeviewer .translation .TranslatedStrings .*;
@@ -51,12 +57,67 @@ public FernFlowerDecompiler()
51
57
super ("FernFlower Decompiler" , "fernflower" );
52
58
}
53
59
60
+ private String [] inners ;
61
+ private final List <File > innerFiles = new ArrayList <>();
62
+
54
63
@ Override
55
64
public String decompileClassNode (ClassNode cn , byte [] bytes )
56
65
{
57
66
TempFile tempFile = null ;
58
67
String exception ;
59
68
69
+ List <InnerClassNode > innerClasses = cn .innerClasses ;
70
+ List <TempFile > innerTempFiles = new ArrayList <>();
71
+ AtomicReference <TempFile > innerTempFile = new AtomicReference <>();
72
+ if (BytecodeViewer .viewer .din .isSelected ())
73
+ {
74
+ inners = new String [innerClasses .size ()];
75
+ for (int i = 0 ; i < innerClasses .size (); i ++)
76
+ {
77
+ if (innerClasses .get (i ).outerName != null && innerClasses .get (i ).outerName .equals (cn .name ))
78
+ {
79
+ inners [i ] = innerClasses .get (i ).name ;
80
+ }
81
+ else if (innerClasses .get (i ).outerName == null )
82
+ {
83
+ String name = innerClasses .get (i ).name ;
84
+ name = name .substring (name .lastIndexOf ('/' ) + 1 );
85
+ if (name .contains (cn .name .substring (cn .name .lastIndexOf ('/' ) + 1 )))
86
+ {
87
+ inners [i ] = innerClasses .get (i ).name ;
88
+ }
89
+ }
90
+ }
91
+
92
+ for (ResourceContainer container : BytecodeViewer .resourceContainers .values ())
93
+ {
94
+ container .resourceClasses .forEach ((s , classNode ) -> {
95
+ for (String innerClassName : inners )
96
+ {
97
+ if (s .equals (innerClassName ))
98
+ {
99
+ innerTempFile .set (TempFile .createTemporaryFile (true , ".class" ));
100
+ File tempInputClassFile2 = innerTempFile .get ().getFile ();
101
+ try (FileOutputStream fos = new FileOutputStream (tempInputClassFile2 ))
102
+ {
103
+ fos .write (ASMUtil .nodeToBytes (classNode ));
104
+ }
105
+ catch (IOException e )
106
+ {
107
+ throw new RuntimeException (e );
108
+ }
109
+ finally
110
+ {
111
+ innerFiles .add (tempInputClassFile2 );
112
+ innerTempFile .get ().markAsCreatedFile (tempInputClassFile2 );
113
+ innerTempFiles .add (innerTempFile .get ());
114
+ }
115
+ }
116
+ }
117
+ });
118
+ }
119
+ }
120
+
60
121
try
61
122
{
62
123
//create the temporary files
@@ -85,7 +146,12 @@ public String decompileClassNode(ClassNode cn, byte[] bytes)
85
146
}
86
147
else
87
148
{
88
- org .jetbrains .java .decompiler .main .decompiler .ConsoleDecompiler .main (generateMainMethod (tempInputClassFile .getAbsolutePath (), new File (TEMP_DIRECTORY ).getAbsolutePath ()));
149
+ List <String > strings = generate (tempInputClassFile .getAbsolutePath (),
150
+ new File (TEMP_DIRECTORY ).getAbsolutePath ());
151
+
152
+ String [] args = strings .toArray (new String [0 ]);
153
+
154
+ org .jetbrains .java .decompiler .main .decompiler .ConsoleDecompiler .main (args );
89
155
}
90
156
91
157
//if rename is enabled the file name will be the actual class name
@@ -110,8 +176,23 @@ public String decompileClassNode(ClassNode cn, byte[] bytes)
110
176
finally
111
177
{
112
178
//cleanup temp files
113
- if (tempFile != null )
179
+ if (tempFile != null )
114
180
tempFile .cleanup ();
181
+
182
+ if (innerTempFile .get () != null )
183
+ innerTempFile .get ().cleanup ();
184
+
185
+ for (TempFile file : innerTempFiles )
186
+ {
187
+ file .cleanup ();
188
+ File file1 = new File (TEMP_DIRECTORY + file .getUniqueName () + ".java" );
189
+ if (file1 .exists ())
190
+ {
191
+ file1 .delete ();
192
+ }
193
+ }
194
+
195
+ innerFiles .clear ();
115
196
}
116
197
117
198
return FERNFLOWER + " " + ERROR + "! " + ExceptionUI .SEND_STACKTRACE_TO + NL + NL
@@ -140,31 +221,64 @@ public void decompileToZip(String sourceJar, String zipName)
140
221
141
222
}
142
223
224
+ private List <String > generate (String className , String folder )
225
+ {
226
+ List <String > strings = new ArrayList <>();
227
+ strings .add ("-rbr=" + ffOnValue (BytecodeViewer .viewer .rbr .isSelected ()));
228
+ strings .add ("-rsy=" + ffOnValue (BytecodeViewer .viewer .rsy .isSelected ()));
229
+ strings .add ("-din=" + ffOnValue (BytecodeViewer .viewer .din .isSelected ()));
230
+ strings .add ("-dc4=" + ffOnValue (BytecodeViewer .viewer .dc4 .isSelected ()));
231
+ strings .add ("-das=" + ffOnValue (BytecodeViewer .viewer .das .isSelected ()));
232
+ strings .add ("-hes=" + ffOnValue (BytecodeViewer .viewer .hes .isSelected ()));
233
+ strings .add ("-hdc=" + ffOnValue (BytecodeViewer .viewer .hdc .isSelected ()));
234
+ strings .add ("-dgs=" + ffOnValue (BytecodeViewer .viewer .dgs .isSelected ()));
235
+ strings .add ("-ner=" + ffOnValue (BytecodeViewer .viewer .ner .isSelected ()));
236
+ strings .add ("-den=" + ffOnValue (BytecodeViewer .viewer .den .isSelected ()));
237
+ strings .add ("-rgn=" + ffOnValue (BytecodeViewer .viewer .rgn .isSelected ()));
238
+ strings .add ("-bto=" + ffOnValue (BytecodeViewer .viewer .bto .isSelected ()));
239
+ strings .add ("-nns=" + ffOnValue (BytecodeViewer .viewer .nns .isSelected ()));
240
+ strings .add ("-uto=" + ffOnValue (BytecodeViewer .viewer .uto .isSelected ()));
241
+ strings .add ("-udv=" + ffOnValue (BytecodeViewer .viewer .udv .isSelected ()));
242
+ strings .add ("-rer=" + ffOnValue (BytecodeViewer .viewer .rer .isSelected ()));
243
+ strings .add ("-fdi=" + ffOnValue (BytecodeViewer .viewer .fdi .isSelected ()));
244
+ strings .add ("-asc=" + ffOnValue (BytecodeViewer .viewer .asc .isSelected ()));
245
+ strings .add ("-ren=" + ffOnValue (BytecodeViewer .viewer .ren .isSelected ()));
246
+ strings .add (className );
247
+ if (BytecodeViewer .viewer .din .isSelected ())
248
+ {
249
+ for (File file : innerFiles )
250
+ strings .add (file .getAbsolutePath ());
251
+ }
252
+
253
+ strings .add (folder );
254
+ return strings ;
255
+ }
256
+
143
257
private String [] generateMainMethod (String className , String folder )
144
258
{
145
259
return new String []
146
- {
147
- "-rbr=" + ffOnValue (BytecodeViewer .viewer .rbr .isSelected ()),
148
- "-rsy=" + ffOnValue (BytecodeViewer .viewer .rsy .isSelected ()),
149
- "-din=" + ffOnValue (BytecodeViewer .viewer .din .isSelected ()),
150
- "-dc4=" + ffOnValue (BytecodeViewer .viewer .dc4 .isSelected ()),
151
- "-das=" + ffOnValue (BytecodeViewer .viewer .das .isSelected ()),
152
- "-hes=" + ffOnValue (BytecodeViewer .viewer .hes .isSelected ()),
153
- "-hdc=" + ffOnValue (BytecodeViewer .viewer .hdc .isSelected ()),
154
- "-dgs=" + ffOnValue (BytecodeViewer .viewer .dgs .isSelected ()),
155
- "-ner=" + ffOnValue (BytecodeViewer .viewer .ner .isSelected ()),
156
- "-den=" + ffOnValue (BytecodeViewer .viewer .den .isSelected ()),
157
- "-rgn=" + ffOnValue (BytecodeViewer .viewer .rgn .isSelected ()),
158
- "-bto=" + ffOnValue (BytecodeViewer .viewer .bto .isSelected ()),
159
- "-nns=" + ffOnValue (BytecodeViewer .viewer .nns .isSelected ()),
160
- "-uto=" + ffOnValue (BytecodeViewer .viewer .uto .isSelected ()),
161
- "-udv=" + ffOnValue (BytecodeViewer .viewer .udv .isSelected ()),
162
- "-rer=" + ffOnValue (BytecodeViewer .viewer .rer .isSelected ()),
163
- "-fdi=" + ffOnValue (BytecodeViewer .viewer .fdi .isSelected ()),
164
- "-asc=" + ffOnValue (BytecodeViewer .viewer .asc .isSelected ()),
165
- "-ren=" + ffOnValue (BytecodeViewer .viewer .ren .isSelected ()),
166
- className , folder
167
- };
260
+ {
261
+ "-rbr=" + ffOnValue (BytecodeViewer .viewer .rbr .isSelected ()),
262
+ "-rsy=" + ffOnValue (BytecodeViewer .viewer .rsy .isSelected ()),
263
+ "-din=" + ffOnValue (BytecodeViewer .viewer .din .isSelected ()),
264
+ "-dc4=" + ffOnValue (BytecodeViewer .viewer .dc4 .isSelected ()),
265
+ "-das=" + ffOnValue (BytecodeViewer .viewer .das .isSelected ()),
266
+ "-hes=" + ffOnValue (BytecodeViewer .viewer .hes .isSelected ()),
267
+ "-hdc=" + ffOnValue (BytecodeViewer .viewer .hdc .isSelected ()),
268
+ "-dgs=" + ffOnValue (BytecodeViewer .viewer .dgs .isSelected ()),
269
+ "-ner=" + ffOnValue (BytecodeViewer .viewer .ner .isSelected ()),
270
+ "-den=" + ffOnValue (BytecodeViewer .viewer .den .isSelected ()),
271
+ "-rgn=" + ffOnValue (BytecodeViewer .viewer .rgn .isSelected ()),
272
+ "-bto=" + ffOnValue (BytecodeViewer .viewer .bto .isSelected ()),
273
+ "-nns=" + ffOnValue (BytecodeViewer .viewer .nns .isSelected ()),
274
+ "-uto=" + ffOnValue (BytecodeViewer .viewer .uto .isSelected ()),
275
+ "-udv=" + ffOnValue (BytecodeViewer .viewer .udv .isSelected ()),
276
+ "-rer=" + ffOnValue (BytecodeViewer .viewer .rer .isSelected ()),
277
+ "-fdi=" + ffOnValue (BytecodeViewer .viewer .fdi .isSelected ()),
278
+ "-asc=" + ffOnValue (BytecodeViewer .viewer .asc .isSelected ()),
279
+ "-ren=" + ffOnValue (BytecodeViewer .viewer .ren .isSelected ()),
280
+ className , folder
281
+ };
168
282
}
169
283
170
284
private String ffOnValue (boolean b )
0 commit comments