From 50d4fc8430573757c5fe4f4a1d3b1c4871dbfb46 Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Sun, 7 Jun 2020 17:26:41 +0200 Subject: Add remap crash handler --- .../main/java/cuchaz/enigma/gui/panels/PanelEditor.java | 14 +++++++++++++- .../java/cuchaz/enigma/classhandle/ClassHandleError.java | 5 +++++ .../cuchaz/enigma/classhandle/ClassHandleProvider.java | 13 +++++++++---- enigma/src/main/resources/lang/de_de.json | 1 + enigma/src/main/resources/lang/en_us.json | 1 + 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/PanelEditor.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/PanelEditor.java index a45ecc9..bf1d5fb 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/PanelEditor.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/PanelEditor.java @@ -57,7 +57,7 @@ public class PanelEditor { private final JProgressBar decompilingProgressBar = new JProgressBar(0, 100); // error display UI - private final JLabel errorLabel = new JLabel(I18n.translate("editor.decompile_error")); + private final JLabel errorLabel = new JLabel(); private final JTextArea errorTextArea = new JTextArea(); private final JScrollPane errorScrollPane = new JScrollPane(this.errorTextArea); private final JButton retryButton = new JButton(I18n.translate("general.retry")); @@ -336,6 +336,18 @@ public class PanelEditor { public void displayError(ClassHandleError t) { this.setDisplayMode(DisplayMode.ERRORED); + String str; + switch(t.type) { + case DECOMPILE: + str = "editor.decompile_error"; + break; + case REMAP: + str = "editor.remap_error"; + break; + default: + throw new IllegalStateException("unreachable"); + } + this.errorLabel.setText(I18n.translate(str)); this.errorTextArea.setText(t.getStackTrace()); this.errorTextArea.setCaretPosition(0); } diff --git a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java index a11b9dc..20f847a 100644 --- a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java +++ b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java @@ -28,8 +28,13 @@ public final class ClassHandleError { return new ClassHandleError(Type.DECOMPILE, cause); } + public static ClassHandleError remap(Throwable cause) { + return new ClassHandleError(Type.REMAP, cause); + } + public enum Type { DECOMPILE, + REMAP, } } \ No newline at end of file diff --git a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java index 2d9b52d..f9e4eff 100644 --- a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java @@ -11,6 +11,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.annotation.Nullable; +import org.objectweb.asm.tree.ClassNode; + import cuchaz.enigma.Enigma; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.bytecode.translators.SourceFixVisitor; @@ -19,7 +21,6 @@ import cuchaz.enigma.events.ClassHandleListener.InvalidationType; import cuchaz.enigma.source.*; import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.utils.Result; -import org.objectweb.asm.tree.ClassNode; import static cuchaz.enigma.utils.Utils.withLock; @@ -285,9 +286,13 @@ public final class ClassHandleProvider { int v = mappedVersion.incrementAndGet(); f.thenAcceptAsync(res -> { if (res == null || mappedVersion.get() != v) return; - res = res.map(source -> { - source.remapSource(p.project, p.project.getMapper().getDeobfuscator()); - return source; + res = res.andThen(source -> { + try { + source.remapSource(p.project, p.project.getMapper().getDeobfuscator()); + return Result.ok(source); + } catch (Throwable e) { + return Result.err(ClassHandleError.remap(e)); + } }); Entry.this.source = res; Entry.this.waitingSources.forEach(s -> s.complete(source)); diff --git a/enigma/src/main/resources/lang/de_de.json b/enigma/src/main/resources/lang/de_de.json index ef41da1..65685cf 100644 --- a/enigma/src/main/resources/lang/de_de.json +++ b/enigma/src/main/resources/lang/de_de.json @@ -11,6 +11,7 @@ "editor.decompiling": "Dekompiliere...", "editor.decompile_error": "Ein Fehler ist während des Dekompilierens aufgetreten.", + "editor.remap_error": "Ein Fehler ist während des Remappens aufgetreten.", "validation.message.empty_field": "Dieses Feld muss ausgefüllt werden.", "validation.message.not_int": "Wert muss eine ganze Zahl sein.", diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index 9b12f42..c2a739c 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -79,6 +79,7 @@ "editor.decompiling": "Decompiling...", "editor.decompile_error": "An error was encountered while decompiling.", + "editor.remap_error": "An error was encountered while remapping.", "info_panel.classes.obfuscated": "Obfuscated Classes", "info_panel.classes.deobfuscated": "De-obfuscated Classes", -- cgit v1.2.3