Skip to content

Commit 9725c41

Browse files
committed
Update decompiler Settings to use Decompilers.getAllDecompilers
1 parent 14d89de commit 9725c41

File tree

9 files changed

+78
-96
lines changed

9 files changed

+78
-96
lines changed

src/main/java/the/bytecode/club/jda/decompilers/CFRDecompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public static void doJar(DCCommonState dcCommonState, Path input, Path output) t
191191
}
192192
}
193193

194-
public enum Settings implements DecompilerSettings.Setting {
194+
public enum Settings implements DecompilerSettings.SettingsEntry {
195195
DECODE_ENUM_SWITCH("decodeenumswitch", "Decode Enum Switch", true),
196196
SUGAR_ENUMS("sugarenums", "SugarEnums", true),
197197
DECODE_STRING_SWITCH("decodestringswitch", "Decode String Switch", true),

src/main/java/the/bytecode/club/jda/decompilers/FernflowerDecompiler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ public String decompileClassNode(String containerName, final ClassNode cn) {
4848
result.set(null);
4949

5050
BaseDecompiler baseDecompiler = new BaseDecompiler((externalPath, internalPath) -> {
51-
System.out.println(externalPath + " " + internalPath);
52-
System.out.println(new File(externalPath).getName());
5351
ClassNode requestedCn = JDA.getClassNode(containerName, JDA.extractClassName(new File(externalPath).getName()));
5452
byte[] bytes = JDA.getClassBytes(containerName, requestedCn);
5553
byte[] clone = new byte[bytes.length];
@@ -162,7 +160,7 @@ private String[] generateMainMethod() {
162160
return result;
163161
}
164162

165-
public enum Settings implements DecompilerSettings.Setting {
163+
public enum Settings implements DecompilerSettings.SettingsEntry {
166164
HIDE_BRIDGE_METHODS("rbr", "Hide Bridge Methods", true),
167165
HIDE_SYNTHETIC_CLASS_MEMBERS("rsy", "Hide Synthetic Class Members"),
168166
DECOMPILE_INNER_CLASSES("din", "Decompile Inner Classes", true),

src/main/java/the/bytecode/club/jda/decompilers/ProcyonDecompiler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ public DecompilerSettings getDecompilerSettings() {
4343
CommandLineOptions options = new CommandLineOptions();
4444
JCommander jCommander = new JCommander(options);
4545
List<String> args = new ArrayList<>();
46-
for (the.bytecode.club.jda.settings.DecompilerSettings.Setting setting : Settings.values())
47-
if (getSettings().isSelected(setting))
48-
args.add("--" + setting.getParam());
46+
for (the.bytecode.club.jda.settings.DecompilerSettings.SettingsEntry entry : Settings.values())
47+
if (getSettings().isSelected(entry))
48+
args.add("--" + entry.getParam());
4949
String[] argsArr = new String[args.size()];
5050
args.toArray(argsArr);
5151
jCommander.parse(argsArr);
@@ -195,7 +195,7 @@ private void doSaveJarDecompiled(File inFile, File outFile) throws Exception {
195195
}
196196
}
197197

198-
public enum Settings implements the.bytecode.club.jda.settings.DecompilerSettings.Setting {
198+
public enum Settings implements the.bytecode.club.jda.settings.DecompilerSettings.SettingsEntry {
199199
SHOW_DEBUG_LINE_NUMBERS("debug-line-numbers", "Show Debug Line Numbers"),
200200
SIMPLIFY_MEMBER_REFERENCES("simplify-member-references", "Simplify Member References"),
201201
MERGE_VARIABLES("merge-variables", "Merge Variables"),

src/main/java/the/bytecode/club/jda/decompilers/bytecode/ClassNodeDecompiler.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,23 @@ protected PrefixedStringBuilder decompile(PrefixedStringBuilder sb, ArrayList<St
7575
sb.append(JDA.nl);
7676
}
7777

78-
for (InnerClassNode innerClassNode : cn.innerClasses) {
79-
String innerClassName = innerClassNode.name;
80-
if ((innerClassName != null) && !decompiledClasses.contains(innerClassName)) {
81-
decompiledClasses.add(innerClassName);
82-
ClassNode cn1 = JDA.getClassNode(containerName, innerClassName);
83-
if (cn1 != null) {
84-
sb.appendPrefix(" ");
85-
sb.append(JDA.nl + JDA.nl);
86-
sb = decompile(sb, decompiledClasses, containerName, cn1);
87-
sb.trimPrefix(5);
88-
sb.append(JDA.nl);
89-
} else {
90-
unableToDecompile.add(innerClassName);
78+
if (getSettings().isSelected(Settings.DECOMPILE_INNER_CLASSES))
79+
for (InnerClassNode innerClassNode : cn.innerClasses) {
80+
String innerClassName = innerClassNode.name;
81+
if ((innerClassName != null) && !decompiledClasses.contains(innerClassName)) {
82+
decompiledClasses.add(innerClassName);
83+
ClassNode cn1 = JDA.getClassNode(containerName, innerClassName);
84+
if (cn1 != null) {
85+
sb.appendPrefix(" ");
86+
sb.append(JDA.nl + JDA.nl);
87+
sb = decompile(sb, decompiledClasses, containerName, cn1);
88+
sb.trimPrefix(5);
89+
sb.append(JDA.nl);
90+
} else {
91+
unableToDecompile.add(innerClassName);
92+
}
9193
}
9294
}
93-
}
9495

9596
if (!unableToDecompile.isEmpty()) {
9697
sb.append("// The following inner classes couldn't be decompiled: ");
@@ -112,7 +113,7 @@ protected FieldNodeDecompiler getFieldNodeDecompiler(PrefixedStringBuilder sb, I
112113
}
113114

114115
protected MethodNodeDecompiler getMethodNodeDecompiler(PrefixedStringBuilder sb, ClassNode cn, Iterator<MethodNode> it) {
115-
return new MethodNodeDecompiler(sb, it.next(), cn);
116+
return new MethodNodeDecompiler(this, sb, it.next(), cn);
116117
}
117118

118119
public static String getAccessString(int access) {
@@ -155,10 +156,11 @@ public static String getAccessString(int access) {
155156
public void decompileToZip(String zipName) {
156157
}
157158

158-
public enum Settings implements DecompilerSettings.Setting {
159+
public enum Settings implements DecompilerSettings.SettingsEntry {
159160
DEBUG_HELPERS("debug-helpers", "Debug Helpers", true),
160161
APPEND_BRACKETS_TO_LABELS("append-brackets-to-labels", "Append Brackets to Labels", true),
161-
SHOW_METHOD_DESCRIPTORS("show-method-descriptors", "Show Method Descriptors", true);
162+
SHOW_METHOD_DESCRIPTORS("show-method-descriptors", "Show Method Descriptors", true),
163+
DECOMPILE_INNER_CLASSES("decompile-inner-classes", "Decompile Inner Classes", true);
162164

163165
private String name;
164166
private String param;

src/main/java/the/bytecode/club/jda/decompilers/bytecode/InstructionPrinter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
import java.lang.reflect.Modifier;
1414
import java.util.*;
1515

16-
import static the.bytecode.club.jda.decompilers.bytecode.MethodNodeDecompiler.createComments;
17-
import static the.bytecode.club.jda.decompilers.bytecode.MethodNodeDecompiler.createLabelBrackets;
18-
1916
/**
2017
* @author Konloch
2118
* @author Bibl
2219
*/
2320
public class InstructionPrinter {
21+
private final MethodNodeDecompiler parent;
2422

2523
/**
2624
* The MethodNode to print
@@ -35,7 +33,8 @@ public class InstructionPrinter {
3533
protected List<AbstractInsnNode> matchedInsns;
3634
protected Map<LabelNode, Integer> labels;
3735

38-
public InstructionPrinter(MethodNode m, TypeAndName[] args) {
36+
public InstructionPrinter(MethodNodeDecompiler parent, MethodNode m, TypeAndName[] args) {
37+
this.parent = parent;
3938
this.args = args;
4039
mNode = m;
4140
labels = new HashMap<>();
@@ -44,7 +43,8 @@ public InstructionPrinter(MethodNode m, TypeAndName[] args) {
4443
match = false;
4544
}
4645

47-
public InstructionPrinter(MethodNode m, InstructionPattern pattern, TypeAndName[] args) {
46+
public InstructionPrinter(MethodNodeDecompiler parent, MethodNode m, InstructionPattern pattern, TypeAndName[] args) {
47+
this.parent = parent;
4848
this.args = args;
4949
mNode = m;
5050
labels = new HashMap<>();
@@ -86,12 +86,12 @@ public ArrayList<String> createPrint() {
8686
} else if (ain instanceof LineNumberNode) {
8787
line = printLineNumberNode((LineNumberNode) ain, it);
8888
} else if (ain instanceof LabelNode) {
89-
if (firstLabel && createLabelBrackets())
89+
if (firstLabel && parent.createLabelBrackets())
9090
info.add("}");
9191

9292
line = printLabelnode((LabelNode) ain);
9393

94-
if (createLabelBrackets()) {
94+
if (parent.createLabelBrackets()) {
9595
if (!firstLabel)
9696
firstLabel = true;
9797
line += " {";
@@ -121,7 +121,7 @@ public ArrayList<String> createPrint() {
121121
info.add(line);
122122
}
123123
}
124-
if (firstLabel && createLabelBrackets())
124+
if (firstLabel && parent.createLabelBrackets())
125125
info.add("}");
126126
return info;
127127
}
@@ -130,7 +130,7 @@ protected String printVarInsnNode(VarInsnNode vin, ListIterator<?> it) {
130130
StringBuilder sb = new StringBuilder();
131131
sb.append(nameOpcode(vin.opcode()));
132132
sb.append(vin.var);
133-
if (createComments()) {
133+
if (parent.createComments()) {
134134
if (vin.var == 0 && !Modifier.isStatic(mNode.access)) {
135135
sb.append(" // Reference to self");
136136
} else {

src/main/java/the/bytecode/club/jda/decompilers/bytecode/MethodNodeDecompiler.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.objectweb.asm.Type;
55
import org.objectweb.asm.tree.*;
66
import the.bytecode.club.jda.JDA;
7-
import the.bytecode.club.jda.decompilers.Decompilers;
87

98
import java.util.ArrayList;
109
import java.util.Arrays;
@@ -16,11 +15,13 @@
1615
*/
1716

1817
public class MethodNodeDecompiler {
18+
private final ClassNodeDecompiler parent;
1919
protected final PrefixedStringBuilder sb;
2020
protected final MethodNode mn;
2121
protected final ClassNode cn;
2222

23-
public MethodNodeDecompiler(PrefixedStringBuilder sb, MethodNode mn, ClassNode cn) {
23+
public MethodNodeDecompiler(ClassNodeDecompiler parent, PrefixedStringBuilder sb, MethodNode mn, ClassNode cn) {
24+
this.parent = parent;
2425
this.sb = sb;
2526
this.mn = mn;
2627
this.cn = cn;
@@ -175,7 +176,7 @@ else if (mn.name.equals("<init>"))
175176
}
176177

177178
protected InstructionPrinter getInstructionPrinter(MethodNode m, TypeAndName[] args) {
178-
return new InstructionPrinter(m, args);
179+
return new InstructionPrinter(this, m, args);
179180
}
180181

181182
protected static void addAttrList(List<?> list, String name, PrefixedStringBuilder sb, InstructionPrinter insnPrinter) {
@@ -253,15 +254,15 @@ protected static String getAccessString(int access) {
253254
return sb.toString();
254255
}
255256

256-
static boolean createComments() {
257-
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.DEBUG_HELPERS);
257+
boolean createComments() {
258+
return parent.getSettings().isSelected(ClassNodeDecompiler.Settings.DEBUG_HELPERS);
258259
}
259260

260-
static boolean createLabelBrackets() {
261-
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.APPEND_BRACKETS_TO_LABELS);
261+
boolean createLabelBrackets() {
262+
return parent.getSettings().isSelected(ClassNodeDecompiler.Settings.APPEND_BRACKETS_TO_LABELS);
262263
}
263264

264-
static boolean createDescriptors() {
265-
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.SHOW_METHOD_DESCRIPTORS);
265+
boolean createDescriptors() {
266+
return parent.getSettings().isSelected(ClassNodeDecompiler.Settings.SHOW_METHOD_DESCRIPTORS);
266267
}
267268
}

src/main/java/the/bytecode/club/jda/gui/MainViewerGUI.java

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import org.objectweb.asm.tree.ClassNode;
55
import the.bytecode.club.jda.*;
66
import the.bytecode.club.jda.api.ExceptionUI;
7-
import the.bytecode.club.jda.decompilers.*;
8-
import the.bytecode.club.jda.decompilers.bytecode.ClassNodeDecompiler;
7+
import the.bytecode.club.jda.decompilers.Decompiler;
8+
import the.bytecode.club.jda.decompilers.Decompilers;
99
import the.bytecode.club.jda.settings.DecompilerSettings;
1010
import the.bytecode.club.jda.settings.IPersistentWindow;
1111
import the.bytecode.club.jda.settings.Settings;
@@ -246,33 +246,14 @@ private void initializeMenubar() {
246246

247247
settingsMenu.add(new JSeparator());
248248

249-
JMenu cfrSettingsMenu = new JMenu("CFR");
250-
DecompilerSettings cfrSettings = Decompilers.CFR.getSettings();
251-
for (CFRDecompiler.Settings setting : CFRDecompiler.Settings.values()) {
252-
cfrSettingsMenu.add(cfrSettings.getMenuItem(setting));
253-
}
254-
settingsMenu.add(cfrSettingsMenu);
255-
256-
JMenu fernflowerSettingMenu = new JMenu("FernFlower");
257-
DecompilerSettings fernflowerSettings = Decompilers.FERNFLOWER.getSettings();
258-
for (FernflowerDecompiler.Settings setting : FernflowerDecompiler.Settings.values()) {
259-
fernflowerSettingMenu.add(fernflowerSettings.getMenuItem(setting));
260-
}
261-
settingsMenu.add(fernflowerSettingMenu);
262-
263-
JMenu procyonSettingsMenu = new JMenu("Procyon");
264-
DecompilerSettings procyonSettings = Decompilers.PROCYON.getSettings();
265-
for (ProcyonDecompiler.Settings setting : ProcyonDecompiler.Settings.values()) {
266-
procyonSettingsMenu.add(procyonSettings.getMenuItem(setting));
267-
}
268-
settingsMenu.add(procyonSettingsMenu);
269-
270-
JMenu bytecodeSettingsMenu = new JMenu("Bytecode Decompiler");
271-
DecompilerSettings bytecodeSettings = Decompilers.BYTECODE.getSettings();
272-
for (ClassNodeDecompiler.Settings setting : ClassNodeDecompiler.Settings.values()) {
273-
bytecodeSettingsMenu.add(bytecodeSettings.getMenuItem(setting));
249+
for (Decompiler decompiler : Decompilers.getAllDecompilers()) {
250+
JMenu decompilerSettingsMenu = new JMenu(decompiler.getName());
251+
DecompilerSettings decompilerSettings = decompiler.getSettings();
252+
for (DecompilerSettings.SettingsEntry entry : decompilerSettings.getEntries()) {
253+
decompilerSettingsMenu.add(decompilerSettings.getMenuItem(entry));
254+
}
255+
settingsMenu.add(decompilerSettingsMenu);
274256
}
275-
settingsMenu.add(bytecodeSettingsMenu);
276257

277258
menuBar.add(settingsMenu);
278259

src/main/java/the/bytecode/club/jda/settings/DecompilerSettings.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,42 @@ public DecompilerSettings(Decompiler decompiler) {
1616
this.decompiler = decompiler;
1717
}
1818

19-
private Map<Setting, JCheckBoxMenuItem> menuItems = new HashMap<>();
20-
private List<Setting> registrationOrder = new ArrayList<>();
19+
private Map<SettingsEntry, JCheckBoxMenuItem> menuItems = new HashMap<>();
20+
private List<SettingsEntry> settingsEntries = new ArrayList<>();
2121

22-
public void registerSetting(Setting setting) {
23-
if (!menuItems.containsKey(setting)) {
24-
registrationOrder.add(setting);
25-
JCheckBoxMenuItem item = new JCheckBoxMenuItem(setting.getText());
26-
if (setting.isDefaultOn()) {
22+
public void registerSetting(SettingsEntry entry) {
23+
if (!menuItems.containsKey(entry)) {
24+
settingsEntries.add(entry);
25+
JCheckBoxMenuItem item = new JCheckBoxMenuItem(entry.getText());
26+
if (entry.isDefaultOn()) {
2727
item.setSelected(true);
2828
}
29-
menuItems.put(setting, item);
29+
menuItems.put(entry, item);
3030
}
3131
}
3232

33-
public boolean isSelected(Setting setting) {
34-
return menuItems.get(setting).isSelected();
33+
public boolean isSelected(SettingsEntry entry) {
34+
return menuItems.get(entry).isSelected();
3535
}
3636

37-
public JCheckBoxMenuItem getMenuItem(Setting setting) {
38-
return menuItems.get(setting);
37+
public JCheckBoxMenuItem getMenuItem(SettingsEntry entry) {
38+
return menuItems.get(entry);
3939
}
4040

4141
public int size() {
42-
return registrationOrder.size();
42+
return settingsEntries.size();
43+
}
44+
45+
public List<SettingsEntry> getEntries() {
46+
return settingsEntries;
4347
}
4448

4549
public void loadFrom(JsonObject rootSettings) {
4650
if (rootSettings.get("decompilers") != null) {
4751
JsonObject decompilerSection = rootSettings.get("decompilers").asObject();
4852
if (decompilerSection.get(decompiler.getName()) != null) {
4953
JsonObject thisDecompiler = decompilerSection.get(decompiler.getName()).asObject();
50-
for (Map.Entry<Setting, JCheckBoxMenuItem> entry : menuItems.entrySet()) {
54+
for (Map.Entry<SettingsEntry, JCheckBoxMenuItem> entry : menuItems.entrySet()) {
5155
if (thisDecompiler.get(entry.getKey().getParam()) != null) {
5256
entry.getValue().setSelected(thisDecompiler.get(entry.getKey().getParam()).asBoolean());
5357
}
@@ -65,12 +69,12 @@ public void saveTo(JsonObject rootSettings) {
6569
decompilerSection.add(decompiler.getName(), new JsonObject());
6670
}
6771
JsonObject thisDecompiler = decompilerSection.get(decompiler.getName()).asObject();
68-
for (Map.Entry<Setting, JCheckBoxMenuItem> entry : menuItems.entrySet()) {
72+
for (Map.Entry<SettingsEntry, JCheckBoxMenuItem> entry : menuItems.entrySet()) {
6973
thisDecompiler.add(entry.getKey().getParam(), entry.getValue().isSelected());
7074
}
7175
}
7276

73-
public interface Setting {
77+
public interface SettingsEntry {
7478
String getText();
7579

7680
String getParam();

src/main/java/the/bytecode/club/jda/settings/Settings.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.eclipsesource.json.JsonObject;
44
import com.eclipsesource.json.JsonValue;
55
import the.bytecode.club.jda.JDA;
6+
import the.bytecode.club.jda.decompilers.Decompiler;
67
import the.bytecode.club.jda.decompilers.Decompilers;
78
import the.bytecode.club.jda.gui.JDAWindow;
89
import the.bytecode.club.jda.gui.MainViewerGUI;
@@ -35,11 +36,8 @@ public class Settings {
3536
public static void saveGUI() {
3637
try {
3738
JsonObject settings = new JsonObject();
38-
Decompilers.CFR.getSettings().saveTo(settings);
39-
Decompilers.FERNFLOWER.getSettings().saveTo(settings);
40-
Decompilers.PROCYON.getSettings().saveTo(settings);
41-
Decompilers.BYTECODE.getSettings().saveTo(settings);
42-
39+
for (Decompiler decompiler : Decompilers.getAllDecompilers())
40+
decompiler.getSettings().saveTo(settings);
4341

4442
for (Setting setting : Settings.ALL_SETTINGS) {
4543
String nodeId = setting.node;
@@ -88,10 +86,8 @@ public static void saveFrame(JsonObject windowsSection, IPersistentWindow f) {
8886
public static void loadGUI() {
8987
try {
9088
JsonObject settings = JsonObject.readFrom(new FileReader(JDA.settingsFile));
91-
Decompilers.CFR.getSettings().loadFrom(settings);
92-
Decompilers.FERNFLOWER.getSettings().loadFrom(settings);
93-
Decompilers.PROCYON.getSettings().loadFrom(settings);
94-
Decompilers.BYTECODE.getSettings().loadFrom(settings);
89+
for (Decompiler decompiler : Decompilers.getAllDecompilers())
90+
decompiler.getSettings().loadFrom(settings);
9591
for (Setting setting : Settings.ALL_SETTINGS) {
9692
String nodeId = setting.node;
9793
JsonValue nodeValue = settings.get(nodeId);

0 commit comments

Comments
 (0)