From d23e4d934c9b020adcbde411a64bbef7549f3020 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Tue, 19 Feb 2019 19:16:55 +0200 Subject: Write stacktrace to editor when decompilation throws an exception --- .../cuchaz/enigma/gui/DecompiledClassSource.java | 18 ++++++----- src/main/java/cuchaz/enigma/gui/GuiController.java | 35 ++++++++++++++-------- 2 files changed, 32 insertions(+), 21 deletions(-) (limited to 'src/main/java/cuchaz/enigma') diff --git a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java index 0ac41b3..93643ab 100644 --- a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java +++ b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java @@ -19,30 +19,32 @@ import java.util.*; public class DecompiledClassSource { private final ClassEntry classEntry; - private final Deobfuscator deobfuscator; private final SourceIndex obfuscatedIndex; private SourceIndex remappedIndex; private final Map> highlightedTokens = new EnumMap<>(TokenHighlightType.class); - public DecompiledClassSource(ClassEntry classEntry, Deobfuscator deobfuscator, SourceIndex index) { + public DecompiledClassSource(ClassEntry classEntry, SourceIndex index) { this.classEntry = classEntry; - this.deobfuscator = deobfuscator; this.obfuscatedIndex = index; this.remappedIndex = index; } - public void remapSource(Translator translator) { + public static DecompiledClassSource text(ClassEntry classEntry, String text) { + return new DecompiledClassSource(classEntry, new SourceIndex(text)); + } + + public void remapSource(Deobfuscator deobfuscator, Translator translator) { highlightedTokens.clear(); SourceRemapper remapper = new SourceRemapper(obfuscatedIndex.getSource(), obfuscatedIndex.referenceTokens()); - SourceRemapper.Result remapResult = remapper.remap((token, movedToken) -> remapToken(token, movedToken, translator)); + SourceRemapper.Result remapResult = remapper.remap((token, movedToken) -> remapToken(deobfuscator, token, movedToken, translator)); remappedIndex = obfuscatedIndex.remapTo(remapResult); } - private String remapToken(Token token, Token movedToken, Translator translator) { + private String remapToken(Deobfuscator deobfuscator, Token token, Token movedToken, Translator translator) { EntryReference, Entry> reference = obfuscatedIndex.getReference(token); Entry entry = reference.getNameableEntry(); @@ -53,7 +55,7 @@ public class DecompiledClassSource { highlightToken(movedToken, TokenHighlightType.DEOBFUSCATED); return translatedEntry.getSourceRemapName(); } else { - String proposedName = proposeName(entry); + String proposedName = proposeName(deobfuscator, entry); if (proposedName != null) { highlightToken(movedToken, TokenHighlightType.PROPOSED); return proposedName; @@ -72,7 +74,7 @@ public class DecompiledClassSource { } @Nullable - private String proposeName(Entry entry) { + private String proposeName(Deobfuscator deobfuscator, Entry entry) { if (entry instanceof FieldEntry) { for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { String owner = entry.getContainingClass().getFullName(); diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 357d812..a8ff0d0 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -35,6 +35,8 @@ import javax.annotation.Nullable; import java.awt.event.ItemEvent; import java.io.File; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.nio.file.Path; import java.util.Collection; import java.util.Deque; @@ -320,7 +322,7 @@ public class GuiController { DECOMPILER_SERVICE.submit(() -> { try { if (requiresDecompile) { - decompileSource(targetClass, deobfuscator.getObfSourceProvider()); + currentSource = decompileSource(targetClass, deobfuscator.getObfSourceProvider()); } remapSource(deobfuscator.getMapper().getDeobfuscator()); @@ -332,21 +334,28 @@ public class GuiController { }); } - private void decompileSource(ClassEntry targetClass, SourceProvider sourceProvider) { - CompilationUnit sourceTree = sourceProvider.getSources(targetClass.getFullName()); - if (sourceTree == null) { - gui.setEditorText("Unable to find class: " + targetClass); - return; - } + private DecompiledClassSource decompileSource(ClassEntry targetClass, SourceProvider sourceProvider) { + try { + CompilationUnit sourceTree = sourceProvider.getSources(targetClass.getFullName()); + if (sourceTree == null) { + gui.setEditorText("Unable to find class: " + targetClass); + return DecompiledClassSource.text(targetClass, "Unable to find class"); + } - DropImportAstTransform.INSTANCE.run(sourceTree); + DropImportAstTransform.INSTANCE.run(sourceTree); - String sourceString = sourceProvider.writeSourceToString(sourceTree); + String sourceString = sourceProvider.writeSourceToString(sourceTree); - SourceIndex index = SourceIndex.buildIndex(sourceString, sourceTree, true); - index.resolveReferences(deobfuscator.getMapper().getObfResolver()); + SourceIndex index = SourceIndex.buildIndex(sourceString, sourceTree, true); + index.resolveReferences(deobfuscator.getMapper().getObfResolver()); - currentSource = new DecompiledClassSource(targetClass, deobfuscator, index); + return new DecompiledClassSource(targetClass, index); + } catch (Exception e) { + StringWriter traceWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(traceWriter)); + + return DecompiledClassSource.text(targetClass, traceWriter.toString()); + } } private void remapSource(Translator translator) { @@ -354,7 +363,7 @@ public class GuiController { return; } - currentSource.remapSource(translator); + currentSource.remapSource(deobfuscator, translator); gui.setEditorTheme(Config.getInstance().lookAndFeel); gui.setSource(currentSource); -- cgit v1.2.3