summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/GuiController.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/GuiController.java')
-rw-r--r--src/main/java/cuchaz/enigma/gui/GuiController.java81
1 files changed, 63 insertions, 18 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java
index 6e15bb0..e2f332d 100644
--- a/src/main/java/cuchaz/enigma/gui/GuiController.java
+++ b/src/main/java/cuchaz/enigma/gui/GuiController.java
@@ -11,13 +11,14 @@
11 11
12package cuchaz.enigma.gui; 12package cuchaz.enigma.gui;
13 13
14import com.google.common.collect.ImmutableMap;
14import com.google.common.collect.Lists; 15import com.google.common.collect.Lists;
15import com.google.common.collect.Queues; 16import com.google.common.collect.Queues;
16import com.strobel.decompiler.languages.java.ast.CompilationUnit; 17import com.strobel.decompiler.languages.java.ast.CompilationUnit;
17import cuchaz.enigma.Deobfuscator; 18import cuchaz.enigma.Deobfuscator;
18import cuchaz.enigma.analysis.*; 19import cuchaz.enigma.analysis.*;
20import cuchaz.enigma.api.EnigmaPlugin;
19import cuchaz.enigma.config.Config; 21import cuchaz.enigma.config.Config;
20import cuchaz.enigma.config.Themes;
21import cuchaz.enigma.gui.dialog.ProgressDialog; 22import cuchaz.enigma.gui.dialog.ProgressDialog;
22import cuchaz.enigma.mapping.*; 23import cuchaz.enigma.mapping.*;
23import cuchaz.enigma.mapping.entry.ClassEntry; 24import cuchaz.enigma.mapping.entry.ClassEntry;
@@ -30,9 +31,7 @@ import cuchaz.enigma.utils.ReadableToken;
30import java.awt.event.ItemEvent; 31import java.awt.event.ItemEvent;
31import java.io.File; 32import java.io.File;
32import java.io.IOException; 33import java.io.IOException;
33import java.util.Collection; 34import java.util.*;
34import java.util.Deque;
35import java.util.List;
36import java.util.jar.JarFile; 35import java.util.jar.JarFile;
37 36
38public class GuiController { 37public class GuiController {
@@ -58,8 +57,10 @@ public class GuiController {
58 } 57 }
59 58
60 public void openJar(final JarFile jar) throws IOException { 59 public void openJar(final JarFile jar) throws IOException {
61 this.gui.onStartOpenJar(); 60 this.gui.onStartOpenJar("Loading JAR...");
62 this.deobfuscator = new Deobfuscator(jar); 61 this.deobfuscator = new Deobfuscator(jar, (msg) -> {
62 this.gui.onStartOpenJar(msg);
63 });
63 this.gui.onFinishOpenJar(jar.getName()); 64 this.gui.onFinishOpenJar(jar.getName());
64 refreshClasses(); 65 refreshClasses();
65 } 66 }
@@ -162,7 +163,7 @@ public class GuiController {
162 } 163 }
163 164
164 public boolean referenceIsRenameable(EntryReference<Entry, Entry> deobfReference) { 165 public boolean referenceIsRenameable(EntryReference<Entry, Entry> deobfReference) {
165 return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference), true); 166 return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference));
166 } 167 }
167 168
168 public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) { 169 public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) {
@@ -334,29 +335,73 @@ public class GuiController {
334 } 335 }
335 String source = deobfuscator.getSource(sourceTree); 336 String source = deobfuscator.getSource(sourceTree);
336 index = deobfuscator.getSourceIndex(sourceTree, source); 337 index = deobfuscator.getSourceIndex(sourceTree, source);
337 gui.setSource(index.getSource()); 338
338 if (obfReference != null) { 339 String sourceString = index.getSource();
339 showReference(obfReference);
340 }
341 340
342 // set the highlighted tokens 341 // set the highlighted tokens
343 List<Token> obfuscatedTokens = Lists.newArrayList(); 342 List<Token> obfuscatedTokens = Lists.newArrayList();
343 List<Token> proposedTokens = Lists.newArrayList();
344 List<Token> deobfuscatedTokens = Lists.newArrayList(); 344 List<Token> deobfuscatedTokens = Lists.newArrayList();
345 List<Token> otherTokens = Lists.newArrayList(); 345 List<Token> otherTokens = Lists.newArrayList();
346 for (Token token : index.referenceTokens()) { 346
347 EntryReference<Entry, Entry> reference = index.getDeobfReference(token); 347 int offset = 0;
348 Map<Token, Token> tokenRemap = new IdentityHashMap<>();
349 boolean remapped = false;
350
351 for (Token inToken : index.referenceTokens()) {
352 EntryReference<Entry, Entry> reference = index.getDeobfReference(inToken);
353 Token token = inToken.move(offset);
354
348 if (referenceIsRenameable(reference)) { 355 if (referenceIsRenameable(reference)) {
349 if (entryHasDeobfuscatedName(reference.getNameableEntry())) { 356 boolean renamed = false;
350 deobfuscatedTokens.add(token); 357
351 } else { 358 if (!entryHasDeobfuscatedName(reference.getNameableEntry())) {
352 obfuscatedTokens.add(token); 359 Entry obfEntry = deobfuscator.obfuscateEntry(reference.getNameableEntry());
360 if (obfEntry instanceof FieldEntry) {
361 for (EnigmaPlugin plugin : deobfuscator.getPlugins()) {
362 String proposal = plugin.proposeFieldName(obfEntry.getClassName(), obfEntry.getName(), ((FieldEntry) obfEntry).getDesc().toString());
363 if (proposal != null) {
364 proposedTokens.add(token);
365 offset += token.getRenameOffset(proposal);
366 sourceString = token.rename(sourceString, proposal);
367 renamed = true;
368 remapped = true;
369 break;
370 }
371 }
372 }
373 }
374
375 if (!renamed) {
376 if (entryHasDeobfuscatedName(reference.getNameableEntry())) {
377 deobfuscatedTokens.add(token);
378 } else {
379 obfuscatedTokens.add(token);
380 }
353 } 381 }
354 } else { 382 } else {
355 otherTokens.add(token); 383 otherTokens.add(token);
356 } 384 }
385
386 tokenRemap.put(inToken, token);
387 }
388
389 if (remapped) {
390 index.remap(sourceString, tokenRemap);
391 }
392
393 gui.setSource(sourceString);
394 if (obfReference != null) {
395 showReference(obfReference);
357 } 396 }
397
358 gui.setEditorTheme(Config.getInstance().lookAndFeel); 398 gui.setEditorTheme(Config.getInstance().lookAndFeel);
359 gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); 399 gui.setHighlightedTokens(ImmutableMap.of(
400 "obfuscated", obfuscatedTokens,
401 "proposed", proposedTokens,
402 "deobfuscated", deobfuscatedTokens,
403 "other", otherTokens
404 ));
360 }).start(); 405 }).start();
361 } 406 }
362 407