From eca0ab1bbddcb4b9797d75a8d3d0a05b02336276 Mon Sep 17 00:00:00 2001 From: modmuss Date: Sat, 13 Sep 2025 09:18:47 +0100 Subject: Remove legacy mapping handling (#560) * Remove legacy mapping handling * Minor cleanup * More cleanup--- .../main/java/cuchaz/enigma/command/Command.java | 7 - .../cuchaz/enigma/command/MappingCommandsUtil.java | 14 +- .../enigma/network/DedicatedEnigmaServer.java | 3 - .../main/java/cuchaz/enigma/gui/GuiController.java | 13 - .../src/main/java/cuchaz/enigma/gui/Main.java | 3 - .../java/cuchaz/enigma/gui/elements/MenuBar.java | 50 +-- .../translation/mapping/serde/MappingFormat.java | 106 ++---- .../translation/mapping/serde/MappingHelper.java | 31 -- .../translation/mapping/serde/MappingsReader.java | 12 - .../translation/mapping/serde/MappingsWriter.java | 16 - .../translation/mapping/serde/RawEntryMapping.java | 30 -- .../mapping/serde/enigma/EnigmaMappingsReader.java | 361 --------------------- .../mapping/serde/enigma/EnigmaMappingsWriter.java | 44 +-- .../serde/proguard/ProguardMappingsReader.java | 137 -------- .../mapping/serde/recaf/RecafMappingsReader.java | 64 ---- .../mapping/serde/recaf/RecafMappingsWriter.java | 77 ----- .../mapping/serde/srg/SrgMappingsWriter.java | 119 ------- .../mapping/serde/tiny/TinyMappingsReader.java | 117 ------- .../mapping/serde/tiny/TinyMappingsWriter.java | 144 -------- .../mapping/serde/tinyv2/TinyV2Reader.java | 332 ------------------- .../mapping/serde/tinyv2/TinyV2Writer.java | 187 ----------- enigma/src/main/resources/lang/en_us.json | 1 - .../enigma/translation/mapping/TestComments.java | 37 --- .../translation/mapping/TestReadWriteCycle.java | 5 - .../mapping/TestTinyV2InnerClasses.java | 37 --- .../enigma/translation/mapping/TestV2Main.java | 23 -- .../translation/mapping/serde/recaf/TestRecaf.java | 45 --- enigma/src/test/resources/comments/test.mapping | 18 - enigma/src/test/resources/recaf.mappings | 10 - .../test/resources/tinyV2InnerClasses/c.mapping | 2 - .../tinyV2InnerClasses/cuchaz/enigma/Dad.mapping | 5 - 31 files changed, 34 insertions(+), 2016 deletions(-) delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsReader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsWriter.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/RawEntryMapping.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/proguard/ProguardMappingsReader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Reader.java delete mode 100644 enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java delete mode 100644 enigma/src/test/java/cuchaz/enigma/translation/mapping/TestComments.java delete mode 100644 enigma/src/test/java/cuchaz/enigma/translation/mapping/TestTinyV2InnerClasses.java delete mode 100644 enigma/src/test/java/cuchaz/enigma/translation/mapping/TestV2Main.java delete mode 100644 enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java delete mode 100644 enigma/src/test/resources/comments/test.mapping delete mode 100644 enigma/src/test/resources/recaf.mappings delete mode 100644 enigma/src/test/resources/tinyV2InnerClasses/c.mapping delete mode 100644 enigma/src/test/resources/tinyV2InnerClasses/cuchaz/enigma/Dad.mapping diff --git a/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java b/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java index 7f42f3a..30afb2c 100644 --- a/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java +++ b/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java @@ -7,7 +7,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.tree.MemoryMappingTree; @@ -17,7 +16,6 @@ import cuchaz.enigma.Enigma; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.serde.MappingFormat; import cuchaz.enigma.translation.mapping.serde.MappingIoConverter; import cuchaz.enigma.translation.mapping.serde.MappingParseException; import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; @@ -57,11 +55,6 @@ public abstract class Command { } protected static EntryTree readMappings(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - // Legacy - if (path.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".zip")) { - return MappingFormat.ENIGMA_ZIP.read(path, progress, saveParameters, null); - } - net.fabricmc.mappingio.format.MappingFormat format = MappingReader.detectFormat(path); if (format == null) throw new IllegalArgumentException("Unknown mapping format!"); diff --git a/enigma-cli/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java b/enigma-cli/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java index 7c6bf43..1bd72ac 100644 --- a/enigma-cli/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java +++ b/enigma-cli/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java @@ -15,8 +15,6 @@ import cuchaz.enigma.translation.mapping.serde.MappingFormat; import cuchaz.enigma.translation.mapping.serde.MappingIoConverter; import cuchaz.enigma.translation.mapping.serde.MappingParseException; import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsWriter; -import cuchaz.enigma.translation.mapping.serde.tinyv2.TinyV2Writer; import cuchaz.enigma.translation.mapping.tree.EntryTree; public final class MappingCommandsUtil { @@ -25,7 +23,7 @@ public final class MappingCommandsUtil { public static EntryTree read(String type, Path path, MappingSaveParameters saveParameters) throws MappingParseException, IOException { if (type.equals("enigma")) { - return (Files.isDirectory(path) ? MappingFormat.ENIGMA_DIRECTORY : MappingFormat.ENIGMA_ZIP).read(path, ProgressListener.none(), saveParameters, null); + return (Files.isDirectory(path) ? MappingFormat.ENIGMA_DIRECTORY : MappingFormat.ENIGMA_FILE).read(path, ProgressListener.none(), saveParameters, null); } if (type.equals("tiny")) { @@ -62,11 +60,6 @@ public final class MappingCommandsUtil { throw new IllegalArgumentException("specify column names as 'tinyv2:from_namespace:to_namespace'"); } - if (!System.getProperty("enigma.use_mappingio", "true").equals("true")) { - new TinyV2Writer(split[1], split[2]).write(mappings, path, ProgressListener.none(), saveParameters); - return; - } - try { VisitableMappingTree tree = MappingIoConverter.toMappingIo(mappings, ProgressListener.none(), split[1], split[2]); tree.accept(MappingWriter.create(path, net.fabricmc.mappingio.format.MappingFormat.TINY_2_FILE)); @@ -84,11 +77,6 @@ public final class MappingCommandsUtil { throw new IllegalArgumentException("specify column names as 'tiny:from_column:to_column'"); } - if (!System.getProperty("enigma.use_mappingio", "true").equals("true")) { - new TinyMappingsWriter(split[1], split[2]).write(mappings, path, ProgressListener.none(), saveParameters); - return; - } - try { VisitableMappingTree tree = MappingIoConverter.toMappingIo(mappings, ProgressListener.none(), split[1], split[2]); tree.accept(MappingWriter.create(path, net.fabricmc.mappingio.format.MappingFormat.TINY_FILE)); diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java b/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java index 24fd9ff..f7112cf 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java @@ -6,7 +6,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import java.util.Locale; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; @@ -104,8 +103,6 @@ public class DedicatedEnigmaServer extends EnigmaServer { if (Files.isDirectory(mappingsFile)) { mappingFormat = MappingFormat.ENIGMA_DIRECTORY; - } else if (mappingsFile.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".zip")) { - mappingFormat = MappingFormat.ENIGMA_ZIP; } else { mappingFormat = MappingFormat.ENIGMA_FILE; } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index 1853a9f..a2b3bd9 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -31,7 +31,6 @@ import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import cuchaz.enigma.Enigma; @@ -172,12 +171,6 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida this.gui.onCloseJar(); } - @ApiStatus.Internal - public CompletableFuture openMappings(MappingFormat format, Path path, boolean useMappingIo) { - System.getProperties().setProperty("enigma.use_mappingio", useMappingIo ? "true" : "false"); - return openMappings(format, path); - } - public CompletableFuture openMappings(MappingFormat format, Path path) { if (project == null) { return CompletableFuture.completedFuture(null); @@ -220,12 +213,6 @@ public class GuiController implements ClientPacketHandler, GuiView, DataInvalida return saveMappings(path, loadedMappingFormat); } - @ApiStatus.Internal - public CompletableFuture saveMappings(Path path, MappingFormat format, boolean useMappingIo) { - System.getProperties().setProperty("enigma.use_mappingio", useMappingIo ? "true" : "false"); - return saveMappings(path, format); - } - /** * Saves the mappings, with a dialog popping up, showing the progress. * diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java index b9ad19e..0ed500e 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java @@ -18,7 +18,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.EnumSet; import java.util.List; -import java.util.Locale; import java.util.Set; import joptsimple.OptionException; @@ -148,8 +147,6 @@ public class Main { if (Files.isDirectory(mappingsPath)) { controller.openMappings(MappingFormat.ENIGMA_DIRECTORY, mappingsPath); - } else if (mappingsPath.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".zip")) { - controller.openMappings(MappingFormat.ENIGMA_ZIP, mappingsPath); } else { controller.openMappings(MappingFormat.ENIGMA_FILE, mappingsPath); } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index 02fa9e3..e891786 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -405,28 +405,13 @@ public class MenuBar { } private static void prepareOpenMappingsMenu(JMenu openMappingsMenu, Gui gui) { - // Mapping-IO readers - for (MappingFormat format : MappingFormat.values()) { - if (format.getMappingIoCounterpart() != null) { - addOpenMappingsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)), - format, true, openMappingsMenu, gui); - } - } - - openMappingsMenu.addSeparator(); - - // Enigma's own readers - String legacySuffix = " (" + I18n.translate("legacy") + ")"; - - for (MappingFormat format : MappingFormat.values()) { - if (format.getReader() != null) { - addOpenMappingsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)) + legacySuffix, - format, false, openMappingsMenu, gui); - } + for (MappingFormat format : MappingFormat.getReadableFormats()) { + addOpenMappingsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)), + format, openMappingsMenu, gui); } } - private static void addOpenMappingsMenuEntry(String text, MappingFormat format, boolean mappingIo, JMenu openMappingsMenu, Gui gui) { + private static void addOpenMappingsMenuEntry(String text, MappingFormat format, JMenu openMappingsMenu, Gui gui) { JMenuItem item = new JMenuItem(text); item.addActionListener(event -> { ExtensionFileFilter.setupFileChooser(gui.mappingsFileChooser, format); @@ -434,7 +419,7 @@ public class MenuBar { if (gui.mappingsFileChooser.showOpenDialog(gui.getFrame()) == JFileChooser.APPROVE_OPTION) { File selectedFile = gui.mappingsFileChooser.getSelectedFile(); - gui.getController().openMappings(format, selectedFile.toPath(), mappingIo); + gui.getController().openMappings(format, selectedFile.toPath()); UiConfig.setLastSelectedDir(gui.mappingsFileChooser.getCurrentDirectory().toString()); } }); @@ -442,28 +427,13 @@ public class MenuBar { } private static void prepareSaveMappingsAsMenu(JMenu saveMappingsAsMenu, JMenuItem saveMappingsItem, Gui gui) { - // Mapping-IO writers - for (MappingFormat format : MappingFormat.values()) { - if (format.hasMappingIoWriter()) { - addSaveMappingsAsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)), - format, true, saveMappingsAsMenu, saveMappingsItem, gui); - } - } - - saveMappingsAsMenu.addSeparator(); - - // Enigma's own writers - String legacySuffix = " (" + I18n.translate("legacy") + ")"; - - for (MappingFormat format : MappingFormat.values()) { - if (format.getWriter() != null) { - addSaveMappingsAsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)) + legacySuffix, - format, false, saveMappingsAsMenu, saveMappingsItem, gui); - } + for (MappingFormat format : MappingFormat.getWritableFormats()) { + addSaveMappingsAsMenuEntry(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)), + format, saveMappingsAsMenu, saveMappingsItem, gui); } } - private static void addSaveMappingsAsMenuEntry(String text, MappingFormat format, boolean mappingIo, JMenu saveMappingsAsMenu, JMenuItem saveMappingsItem, Gui gui) { + private static void addSaveMappingsAsMenuEntry(String text, MappingFormat format, JMenu saveMappingsAsMenu, JMenuItem saveMappingsItem, Gui gui) { JMenuItem item = new JMenuItem(text); item.addActionListener(event -> { JFileChooser fileChooser = gui.mappingsFileChooser; @@ -475,7 +445,7 @@ public class MenuBar { if (fileChooser.showSaveDialog(gui.getFrame()) == JFileChooser.APPROVE_OPTION) { Path savePath = ExtensionFileFilter.getSavePath(fileChooser); - gui.getController().saveMappings(savePath, format, mappingIo); + gui.getController().saveMappings(savePath, format); saveMappingsItem.setEnabled(true); UiConfig.setLastSelectedDir(fileChooser.getCurrentDirectory().toString()); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java index ec36d47..b891f43 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java @@ -5,6 +5,7 @@ import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.Arrays; import java.util.List; +import java.util.Objects; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingWriter; @@ -12,56 +13,39 @@ import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.mappingio.tree.VisitOrder; import net.fabricmc.mappingio.tree.VisitableMappingTree; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.MappingDelta; import cuchaz.enigma.translation.mapping.MappingOperations; -import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsWriter; -import cuchaz.enigma.translation.mapping.serde.proguard.ProguardMappingsReader; -import cuchaz.enigma.translation.mapping.serde.recaf.RecafMappingsReader; -import cuchaz.enigma.translation.mapping.serde.recaf.RecafMappingsWriter; -import cuchaz.enigma.translation.mapping.serde.srg.SrgMappingsWriter; -import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsReader; -import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsWriter; -import cuchaz.enigma.translation.mapping.serde.tinyv2.TinyV2Reader; -import cuchaz.enigma.translation.mapping.serde.tinyv2.TinyV2Writer; import cuchaz.enigma.translation.mapping.tree.EntryTree; import cuchaz.enigma.utils.I18n; public enum MappingFormat { - ENIGMA_FILE(EnigmaMappingsWriter.FILE, EnigmaMappingsReader.FILE, FileType.MAPPING, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_FILE), - ENIGMA_DIRECTORY(EnigmaMappingsWriter.DIRECTORY, EnigmaMappingsReader.DIRECTORY, FileType.DIRECTORY, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_DIR), - ENIGMA_ZIP(EnigmaMappingsWriter.ZIP, EnigmaMappingsReader.ZIP, FileType.ZIP, null), - TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader(), FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_2_FILE), - TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE, FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_FILE), - SRG_FILE(SrgMappingsWriter.INSTANCE, null, FileType.SRG, net.fabricmc.mappingio.format.MappingFormat.SRG_FILE), - XSRG_FILE(null, null, FileType.XSRG, net.fabricmc.mappingio.format.MappingFormat.XSRG_FILE), - JAM_FILE(null, null, FileType.JAM, net.fabricmc.mappingio.format.MappingFormat.JAM_FILE), - CSRG_FILE(null, null, FileType.CSRG, net.fabricmc.mappingio.format.MappingFormat.CSRG_FILE), - TSRG_FILE(null, null, FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_FILE), - TSRG_2_FILE(null, null, FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_2_FILE), - PROGUARD(null, ProguardMappingsReader.INSTANCE, FileType.TXT, net.fabricmc.mappingio.format.MappingFormat.PROGUARD_FILE), - RECAF(RecafMappingsWriter.INSTANCE, RecafMappingsReader.INSTANCE, FileType.TXT, net.fabricmc.mappingio.format.MappingFormat.RECAF_SIMPLE_FILE), - JOBF_FILE(null, null, FileType.JOBF, net.fabricmc.mappingio.format.MappingFormat.JOBF_FILE), - INTELLIJ_MIGRATION_MAP_FILE(null, null, FileType.XML, net.fabricmc.mappingio.format.MappingFormat.INTELLIJ_MIGRATION_MAP_FILE); - - private final MappingsWriter writer; - private final MappingsReader reader; + ENIGMA_FILE(FileType.MAPPING, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_FILE), + ENIGMA_DIRECTORY(FileType.DIRECTORY, net.fabricmc.mappingio.format.MappingFormat.ENIGMA_DIR), + TINY_V2(FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_2_FILE), + TINY_FILE(FileType.TINY, net.fabricmc.mappingio.format.MappingFormat.TINY_FILE), + SRG_FILE(FileType.SRG, net.fabricmc.mappingio.format.MappingFormat.SRG_FILE), + XSRG_FILE(FileType.XSRG, net.fabricmc.mappingio.format.MappingFormat.XSRG_FILE), + JAM_FILE(FileType.JAM, net.fabricmc.mappingio.format.MappingFormat.JAM_FILE), + CSRG_FILE(FileType.CSRG, net.fabricmc.mappingio.format.MappingFormat.CSRG_FILE), + TSRG_FILE(FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_FILE), + TSRG_2_FILE(FileType.TSRG, net.fabricmc.mappingio.format.MappingFormat.TSRG_2_FILE), + PROGUARD(FileType.TXT, net.fabricmc.mappingio.format.MappingFormat.PROGUARD_FILE), + RECAF(FileType.TXT, net.fabricmc.mappingio.format.MappingFormat.RECAF_SIMPLE_FILE), + JOBF_FILE(FileType.JOBF, net.fabricmc.mappingio.format.MappingFormat.JOBF_FILE), + INTELLIJ_MIGRATION_MAP_FILE(FileType.XML, net.fabricmc.mappingio.format.MappingFormat.INTELLIJ_MIGRATION_MAP_FILE); + private final FileType fileType; private final net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart; - private final boolean hasMappingIoWriter; private boolean usedMappingIoWriterLast; - MappingFormat(MappingsWriter writer, MappingsReader reader, FileType fileType, net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart) { - this.writer = writer; - this.reader = reader; + MappingFormat(FileType fileType, net.fabricmc.mappingio.format.MappingFormat mappingIoCounterpart) { this.fileType = fileType; - this.mappingIoCounterpart = mappingIoCounterpart; - this.hasMappingIoWriter = mappingIoCounterpart == null ? false : mappingIoCounterpart.hasWriter; + this.mappingIoCounterpart = Objects.requireNonNull(mappingIoCounterpart); } public void write(EntryTree mappings, Path path, ProgressListener progressListener, MappingSaveParameters saveParameters) { @@ -69,10 +53,8 @@ public enum MappingFormat { } public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progressListener, MappingSaveParameters saveParameters) { - if (!hasMappingIoWriter || (!useMappingIo() && writer != null)) { - writer.write(mappings, usedMappingIoWriterLast ? MappingDelta.added(mappings) : delta, path, progressListener, saveParameters); - usedMappingIoWriterLast = false; - return; + if (!isWritable()) { + throw new UnsupportedOperationException("Mapping format " + this + " does not support writing"); } try { @@ -103,10 +85,6 @@ public enum MappingFormat { } public EntryTree read(Path path, ProgressListener progressListener, MappingSaveParameters saveParameters, JarIndex index) throws IOException, MappingParseException { - if (mappingIoCounterpart == null || (!useMappingIo() && reader != null)) { - return reader.read(path, progressListener, saveParameters); - } - String loadingMessage; if (mappingIoCounterpart.hasSingleFile()) { @@ -124,56 +102,17 @@ public enum MappingFormat { return this == PROGUARD ? MappingOperations.invert(mappings) : mappings; } - /** - * @return Enigma's native writer for the format, or {@code null} if none exists. - * - * @deprecated Use {@link #isWritable()} and {@link #write(EntryTree, Path, ProgressListener, MappingSaveParameters)} instead, - * which take the new Mapping-IO equivalents (and eventual replacements) into account. - */ - @Nullable - @Deprecated - public MappingsWriter getWriter() { - return writer; - } - - /** - * @return Enigma's native reader for the format, or {@code null} if none exists. - * - * @deprecated Use {@link #isReadable()} and {@link #read(Path, ProgressListener, MappingSaveParameters, JarIndex)} instead, - * which take the new Mapping-IO equivalents (and eventual replacements) into account. - */ - @Nullable - @Deprecated - public MappingsReader getReader() { - return reader; - } - @ApiStatus.Internal public FileType getFileType() { return fileType; } - @Nullable - @ApiStatus.Internal - public net.fabricmc.mappingio.format.MappingFormat getMappingIoCounterpart() { - return mappingIoCounterpart; - } - - @ApiStatus.Internal - public boolean hasMappingIoWriter() { - return hasMappingIoWriter; - } - public boolean isReadable() { - return reader != null || mappingIoCounterpart != null; + return true; } public boolean isWritable() { - return writer != null || hasMappingIoWriter; - } - - private boolean useMappingIo() { - return System.getProperty("enigma.use_mappingio", "true").equals("true"); + return mappingIoCounterpart.hasWriter; } public static List getReadableFormats() { @@ -199,7 +138,6 @@ public enum MappingFormat { @ApiStatus.Internal public record FileType(List extensions) { public static final FileType DIRECTORY = new FileType(); - public static final FileType ZIP = new FileType(".zip"); public static final FileType MAPPING = new FileType(".mapping", ".mappings"); public static final FileType TINY = new FileType(".tiny"); public static final FileType SRG = new FileType(".srg"); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingHelper.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingHelper.java index 5f466bb..d89205c 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingHelper.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingHelper.java @@ -21,37 +21,6 @@ public final class MappingHelper { return builder.toString(); } - public static String unescape(String str) { - int pos = str.indexOf('\\'); - - if (pos < 0) { - return str; - } - - StringBuilder ret = new StringBuilder(str.length() - 1); - int start = 0; - - do { - ret.append(str, start, pos); - pos++; - int type; - - if (pos >= str.length()) { - throw new RuntimeException("incomplete escape sequence at the end"); - } else if ((type = ESCAPED.indexOf(str.charAt(pos))) < 0) { - throw new RuntimeException("invalid escape character: \\" + str.charAt(pos)); - } else { - ret.append(TO_ESCAPE.charAt(type)); - } - - start = pos + 1; - } while ((pos = str.indexOf('\\', start)) >= 0); - - ret.append(str, start, str.length()); - - return ret.toString(); - } - private MappingHelper() { } } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsReader.java deleted file mode 100644 index 4fdfdcb..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsReader.java +++ /dev/null @@ -1,12 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde; - -import java.io.IOException; -import java.nio.file.Path; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.tree.EntryTree; - -public interface MappingsReader { - EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException; -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsWriter.java deleted file mode 100644 index 5c273ad..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingsWriter.java +++ /dev/null @@ -1,16 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde; - -import java.nio.file.Path; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingDelta; -import cuchaz.enigma.translation.mapping.tree.EntryTree; - -public interface MappingsWriter { - void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters); - - default void write(EntryTree mappings, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - write(mappings, MappingDelta.added(mappings), path, progress, saveParameters); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/RawEntryMapping.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/RawEntryMapping.java deleted file mode 100644 index 6465008..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/RawEntryMapping.java +++ /dev/null @@ -1,30 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde; - -import java.util.ArrayList; -import java.util.List; - -import cuchaz.enigma.translation.mapping.AccessModifier; -import cuchaz.enigma.translation.mapping.EntryMapping; - -public final class RawEntryMapping { - private final String targetName; - private final AccessModifier access; - private final List javadocs = new ArrayList<>(); - - public RawEntryMapping(String targetName) { - this(targetName, AccessModifier.UNCHANGED); - } - - public RawEntryMapping(String targetName, AccessModifier access) { - this.access = access; - this.targetName = targetName != null && !targetName.equals("-") ? targetName : null; - } - - public void addJavadocLine(String line) { - javadocs.add(line); - } - - public EntryMapping bake() { - return new EntryMapping(targetName, access, javadocs.isEmpty() ? null : String.join("\n", javadocs)); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java deleted file mode 100644 index 08d0e57..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java +++ /dev/null @@ -1,361 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.enigma; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.NotDirectoryException; -import java.nio.file.Path; -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.Deque; -import java.util.List; -import java.util.Locale; - -import org.jetbrains.annotations.Nullable; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.AccessModifier; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingPair; -import cuchaz.enigma.translation.mapping.serde.MappingHelper; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsReader; -import cuchaz.enigma.translation.mapping.serde.RawEntryMapping; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.HashEntryTree; -import cuchaz.enigma.translation.representation.MethodDescriptor; -import cuchaz.enigma.translation.representation.TypeDescriptor; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; -import cuchaz.enigma.utils.I18n; - -public enum EnigmaMappingsReader implements MappingsReader { - FILE { - @Override - public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - progress.init(1, I18n.translate("progress.mappings.loading_file")); - - EntryTree mappings = new HashEntryTree<>(); - readFile(path, mappings); - - progress.step(1, I18n.translate("progress.done")); - - return mappings; - } - }, - DIRECTORY { - @Override - public EntryTree read(Path root, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - if (!Files.isDirectory(root)) { - throw new NotDirectoryException(root.toString()); - } - - EntryTree mappings = new HashEntryTree<>(); - List files = Files.walk(root).filter(f -> !Files.isDirectory(f)).filter(f -> f.toString().endsWith(".mapping")).toList(); - - progress.init(files.size(), I18n.translate("progress.mappings.loading_directory")); - int step = 0; - - for (Path file : files) { - progress.step(step++, root.relativize(file).toString()); - - if (Files.isHidden(file)) { - continue; - } - - readFile(file, mappings); - } - - return mappings; - } - }, - ZIP { - @Override - public EntryTree read(Path zip, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException { - try (FileSystem fs = FileSystems.newFileSystem(zip, (ClassLoader) null)) { - return DIRECTORY.read(fs.getPath("/"), progress, saveParameters); - } - } - }; - - /** - * Reads multiple Enigma mapping files. - * - * @param progress the progress listener - * @param paths the Enigma files to read; cannot be empty - * @return the parsed mappings - * @throws MappingParseException if a mapping file cannot be parsed - * @throws IOException if an IO error occurs - * @throws IllegalArgumentException if there are no paths to read - */ - public static EntryTree readFiles(ProgressListener progress, Path... paths) throws MappingParseException, IOException { - EntryTree mappings = new HashEntryTree<>(); - - if (paths.length == 0) { - throw new IllegalArgumentException("No paths to read mappings from"); - } - - progress.init(paths.length, I18n.translate("progress.mappings.loading_directory")); - int step = 0; - - for (Path file : paths) { - progress.step(step++, paths.toString()); - readFile(file, mappings); - } - - return mappings; - } - - private static void readFile(Path path, EntryTree mappings) throws IOException, MappingParseException { - List lines = Files.readAllLines(path, StandardCharsets.UTF_8); - Deque> mappingStack = new ArrayDeque<>(); - - for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { - String line = lines.get(lineNumber); - int indentation = countIndentation(line, path, lineNumber); - - line = formatLine(line); - - if (line == null) { - continue; - } - - cleanMappingStack(indentation, mappingStack, mappings); - - try { - MappingPair pair = parseLine(mappingStack.peek(), line); - - if (pair != null) { - mappingStack.push(pair); - } - } catch (Throwable t) { - throw new MappingParseException(path, lineNumber + 1, t); - } - } - - // Clean up rest - cleanMappingStack(0, mappingStack, mappings); - } - - private static void cleanMappingStack(int indentation, Deque> mappingStack, EntryTree mappings) { - while (indentation < mappingStack.size()) { - MappingPair pair = mappingStack.pop(); - - if (pair.getMapping() != null) { - mappings.insert(pair.getEntry(), pair.getMapping().bake()); - } - } - } - - @Nullable - private static String formatLine(String line) { - line = stripComment(line); - line = line.trim(); - - if (line.isEmpty()) { - return null; - } - - return line; - } - - private static String stripComment(String line) { - //Dont support comments on javadoc lines - if (line.trim().startsWith(EnigmaFormat.COMMENT)) { - return line; - } - - int commentPos = line.indexOf('#'); - - if (commentPos >= 0) { - return line.substring(0, commentPos); - } - - return line; - } - - private static int countIndentation(String line, Path path, int lineNumber) throws MappingParseException { - int indent = 0; - - for (int i = 0; i < line.length(); i++) { - if (line.charAt(i) == ' ') { - throw new MappingParseException(path, lineNumber + 1, "Spaces must not be used to indent lines!"); - } - - if (line.charAt(i) != '\t') { - break; - } - - indent++; - } - - return indent; - } - - private static MappingPair parseLine(@Nullable MappingPair parent, String line) { - String[] tokens = line.trim().split("\\s"); - String keyToken = tokens[0].toUpperCase(Locale.ROOT); - Entry parentEntry = parent == null ? null : parent.getEntry(); - - switch (keyToken) { - case EnigmaFormat.CLASS: - return parseClass(parentEntry, tokens); - case EnigmaFormat.FIELD: - return parseField(parentEntry, tokens); - case EnigmaFormat.METHOD: - return parseMethod(parentEntry, tokens); - case EnigmaFormat.PARAMETER: - return parseArgument(parentEntry, tokens); - case EnigmaFormat.COMMENT: - readJavadoc(parent, tokens); - return null; - default: - throw new RuntimeException("Unknown token '" + keyToken + "'"); - } - } - - private static void readJavadoc(MappingPair parent, String[] tokens) { - if (parent == null) { - throw new IllegalStateException("Javadoc has no parent!"); - } - - // Empty string to concat - String jdLine = tokens.length > 1 ? String.join(" ", Arrays.copyOfRange(tokens, 1, tokens.length)) : ""; - - if (parent.getMapping() == null) { - parent.setMapping(new RawEntryMapping(parent.getEntry().getName(), AccessModifier.UNCHANGED)); - } - - parent.getMapping().addJavadocLine(MappingHelper.unescape(jdLine)); - } - - private static MappingPair parseClass(@Nullable Entry parent, String[] tokens) { - String obfuscatedName = ClassEntry.getInnerName(tokens[1]); - ClassEntry obfuscatedEntry; - - if (parent instanceof ClassEntry) { - obfuscatedEntry = new ClassEntry((ClassEntry) parent, obfuscatedName); - } else { - obfuscatedEntry = new ClassEntry(obfuscatedName); - } - - String mapping = null; - AccessModifier modifier = AccessModifier.UNCHANGED; - - if (tokens.length == 3) { - AccessModifier parsedModifier = parseModifier(tokens[2]); - - if (parsedModifier != null) { - modifier = parsedModifier; - mapping = obfuscatedName; - } else { - mapping = tokens[2]; - } - } else if (tokens.length == 4) { - mapping = tokens[2]; - modifier = parseModifier(tokens[3]); - } - - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping, modifier)); - } - - private static MappingPair parseField(@Nullable Entry parent, String[] tokens) { - if (!(parent instanceof ClassEntry)) { - throw new RuntimeException("Field must be a child of a class!"); - } - - ClassEntry ownerEntry = (ClassEntry) parent; - - String obfuscatedName = tokens[1]; - String mapping = null; - AccessModifier modifier = AccessModifier.UNCHANGED; - TypeDescriptor descriptor; - - if (tokens.length == 3) { - descriptor = new TypeDescriptor(tokens[2]); - } else if (tokens.length == 4) { - AccessModifier parsedModifier = parseModifier(tokens[3]); - - if (parsedModifier != null) { - descriptor = new TypeDescriptor(tokens[2]); - modifier = parsedModifier; - } else { - mapping = tokens[2]; - descriptor = new TypeDescriptor(tokens[3]); - } - } else if (tokens.length == 5) { - mapping = tokens[2]; - modifier = parseModifier(tokens[3]); - descriptor = new TypeDescriptor(tokens[4]); - } else { - throw new RuntimeException("Invalid field declaration"); - } - - FieldEntry obfuscatedEntry = new FieldEntry(ownerEntry, obfuscatedName, descriptor); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping, modifier)); - } - - private static MappingPair parseMethod(@Nullable Entry parent, String[] tokens) { - if (!(parent instanceof ClassEntry)) { - throw new RuntimeException("Method must be a child of a class!"); - } - - ClassEntry ownerEntry = (ClassEntry) parent; - - String obfuscatedName = tokens[1]; - String mapping = null; - AccessModifier modifier = AccessModifier.UNCHANGED; - MethodDescriptor descriptor; - - if (tokens.length == 3) { - descriptor = new MethodDescriptor(tokens[2]); - } else if (tokens.length == 4) { - AccessModifier parsedModifier = parseModifier(tokens[3]); - - if (parsedModifier != null) { - modifier = parsedModifier; - mapping = obfuscatedName; - descriptor = new MethodDescriptor(tokens[2]); - } else { - mapping = tokens[2]; - descriptor = new MethodDescriptor(tokens[3]); - } - } else if (tokens.length == 5) { - mapping = tokens[2]; - modifier = parseModifier(tokens[4]); - descriptor = new MethodDescriptor(tokens[3]); - } else { - throw new RuntimeException("Invalid method declaration"); - } - - MethodEntry obfuscatedEntry = new MethodEntry(ownerEntry, obfuscatedName, descriptor); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping, modifier)); - } - - private static MappingPair parseArgument(@Nullable Entry parent, String[] tokens) { - if (!(parent instanceof MethodEntry)) { - throw new RuntimeException("Method arg must be a child of a method!"); - } - - MethodEntry ownerEntry = (MethodEntry) parent; - LocalVariableEntry obfuscatedEntry = new LocalVariableEntry(ownerEntry, Integer.parseInt(tokens[1]), "", true, null); - String mapping = tokens[2]; - - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping)); - } - - @Nullable - private static AccessModifier parseModifier(String token) { - if (token.startsWith("ACC:")) { - return AccessModifier.valueOf(token.substring(4)); - } - - return null; - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java index 266668d..b90bb7f 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java @@ -13,17 +13,12 @@ package cuchaz.enigma.translation.mapping.serde.enigma; import java.io.IOException; import java.io.PrintWriter; -import java.net.URI; -import java.net.URISyntaxException; import java.nio.file.DirectoryStream; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -50,7 +45,6 @@ import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; import cuchaz.enigma.translation.mapping.serde.MappingHelper; import cuchaz.enigma.translation.mapping.serde.MappingIoConverter; import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsWriter; import cuchaz.enigma.translation.mapping.tree.EntryTree; import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; import cuchaz.enigma.translation.mapping.tree.HashEntryTree; @@ -61,32 +55,8 @@ import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; import cuchaz.enigma.utils.I18n; -public enum EnigmaMappingsWriter implements MappingsWriter { - FILE { - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - Collection classes = mappings.getRootNodes().filter(entry -> entry.getEntry() instanceof ClassEntry).map(entry -> (ClassEntry) entry.getEntry()).toList(); - - progress.init(classes.size(), I18n.translate("progress.mappings.writing")); - - int steps = 0; - - try (PrintWriter writer = new LfPrintWriter(Files.newBufferedWriter(path))) { - for (ClassEntry classEntry : classes) { - progress.step(steps++, classEntry.getFullName()); - writeRoot(writer, mappings, classEntry); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }, +public enum EnigmaMappingsWriter { DIRECTORY { - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - write(mappings, delta, path, progress, saveParameters, false); - } - @Override @ApiStatus.Internal public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters, boolean useMio) { @@ -199,18 +169,6 @@ public enum EnigmaMappingsWriter implements MappingsWriter { private Path resolve(Path root, ClassEntry classEntry) { return root.resolve(classEntry.getFullName() + ".mapping"); } - }, - ZIP { - @Override - public void write(EntryTree mappings, MappingDelta delta, Path zip, ProgressListener progress, MappingSaveParameters saveParameters) { - try (FileSystem fs = FileSystems.newFileSystem(new URI("jar:file", null, zip.toUri().getPath(), ""), Collections.singletonMap("create", "true"))) { - DIRECTORY.write(mappings, delta, fs.getPath("/"), progress, saveParameters); - } catch (IOException e) { - e.printStackTrace(); - } catch (URISyntaxException e) { - throw new RuntimeException("Unexpected error creating URI for " + zip, e); - } - } }; protected void writeRoot(PrintWriter writer, EntryTree mappings, ClassEntry classEntry) { diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/proguard/ProguardMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/proguard/ProguardMappingsReader.java deleted file mode 100644 index b839c07..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/proguard/ProguardMappingsReader.java +++ /dev/null @@ -1,137 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.proguard; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingOperations; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsReader; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.HashEntryTree; -import cuchaz.enigma.translation.representation.MethodDescriptor; -import cuchaz.enigma.translation.representation.TypeDescriptor; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public class ProguardMappingsReader implements MappingsReader { - public static final ProguardMappingsReader INSTANCE = new ProguardMappingsReader(); - private static final String NAME = "[a-zA-Z0-9_\\-.$<>]+"; - private static final String TYPE = NAME + "(?:\\[])*"; - private static final String TYPE_LIST = "|(?:(?:" + TYPE + ",)*" + TYPE + ")"; - private static final Pattern CLASS = Pattern.compile("(" + NAME + ") -> (" + NAME + "):"); - private static final Pattern FIELD = Pattern.compile(" {4}(" + TYPE + ") (" + NAME + ") -> (" + NAME + ")"); - private static final Pattern METHOD = Pattern.compile(" {4}(?:[0-9]+:[0-9]+:)?(" + TYPE + ") (" + NAME + ")\\((" + TYPE_LIST + ")\\) -> (" + NAME + ")"); - - public ProguardMappingsReader() { - } - - @Override - public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException { - EntryTree mappings = new HashEntryTree<>(); - - int lineNumber = 0; - ClassEntry currentClass = null; - - for (String line : Files.readAllLines(path, StandardCharsets.UTF_8)) { - lineNumber++; - - if (line.startsWith("#") || line.isEmpty()) { - continue; - } - - Matcher classMatcher = CLASS.matcher(line); - Matcher fieldMatcher = FIELD.matcher(line); - Matcher methodMatcher = METHOD.matcher(line); - - if (classMatcher.matches()) { - String name = classMatcher.group(1); - String targetName = classMatcher.group(2); - - mappings.insert(currentClass = new ClassEntry(name.replace('.', '/')), new EntryMapping(ClassEntry.getInnerName(targetName.replace('.', '/')))); - } else if (fieldMatcher.matches()) { - String type = fieldMatcher.group(1); - String name = fieldMatcher.group(2); - String targetName = fieldMatcher.group(3); - - if (currentClass == null) { - throw new MappingParseException(path, lineNumber, "field mapping not inside class: " + line); - } - - mappings.insert(new FieldEntry(currentClass, name, new TypeDescriptor(getDescriptor(type))), new EntryMapping(targetName)); - } else if (methodMatcher.matches()) { - String returnType = methodMatcher.group(1); - String name = methodMatcher.group(2); - String[] parameterTypes = methodMatcher.group(3).isEmpty() ? new String[0] : methodMatcher.group(3).split(","); - String targetName = methodMatcher.group(4); - - if (currentClass == null) { - throw new MappingParseException(path, lineNumber, "method mapping not inside class: " + line); - } - - mappings.insert(new MethodEntry(currentClass, name, new MethodDescriptor(getDescriptor(returnType, parameterTypes))), new EntryMapping(targetName)); - } else { - throw new MappingParseException(path, lineNumber, "invalid mapping line: " + line); - } - } - - return MappingOperations.invert(mappings); - } - - private String getDescriptor(String type) { - StringBuilder descriptor = new StringBuilder(); - - while (type.endsWith("[]")) { - descriptor.append("["); - type = type.substring(0, type.length() - 2); - } - - switch (type) { - case "byte": - return descriptor + "B"; - case "char": - return descriptor + "C"; - case "short": - return descriptor + "S"; - case "int": - return descriptor + "I"; - case "long": - return descriptor + "J"; - case "float": - return descriptor + "F"; - case "double": - return descriptor + "D"; - case "boolean": - return descriptor + "Z"; - case "void": - return descriptor + "V"; - } - - descriptor.append("L"); - descriptor.append(type.replace('.', '/')); - descriptor.append(";"); - - return descriptor.toString(); - } - - private String getDescriptor(String returnType, String[] parameterTypes) { - StringBuilder descriptor = new StringBuilder(); - descriptor.append('('); - - for (String parameterType : parameterTypes) { - descriptor.append(getDescriptor(parameterType)); - } - - descriptor.append(')'); - descriptor.append(getDescriptor(returnType)); - - return descriptor.toString(); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java deleted file mode 100644 index ce54fea..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java +++ /dev/null @@ -1,64 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.recaf; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsReader; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.HashEntryTree; -import cuchaz.enigma.translation.representation.MethodDescriptor; -import cuchaz.enigma.translation.representation.TypeDescriptor; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public class RecafMappingsReader implements MappingsReader { - public static final RecafMappingsReader INSTANCE = new RecafMappingsReader(); - private static final Pattern METHOD_PATTERN = Pattern.compile("(.*?)\\.(.*?)(\\(.*?) (.*)"); - private static final Pattern FIELD_PATTERN = Pattern.compile("(.*?)\\.(.*?) (.*?) (.*)"); - private static final Pattern CLASS_PATTERN = Pattern.compile("(.*?) (.*)"); - - @Override - public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException { - EntryTree mappings = new HashEntryTree<>(); - List lines = Files.readAllLines(path); - - for (String line : lines) { - Matcher methodMatcher = METHOD_PATTERN.matcher(line); - - if (methodMatcher.find()) { - ClassEntry owner = new ClassEntry(methodMatcher.group(1)); - String name = methodMatcher.group(2); - MethodDescriptor desc = new MethodDescriptor(methodMatcher.group(3)); - mappings.insert(new MethodEntry(owner, name, desc), new EntryMapping(methodMatcher.group(4))); - continue; - } - - Matcher fieldMatcher = FIELD_PATTERN.matcher(line); - - if (fieldMatcher.find()) { - ClassEntry owner = new ClassEntry(fieldMatcher.group(1)); - String name = fieldMatcher.group(2); - TypeDescriptor desc = new TypeDescriptor(fieldMatcher.group(3)); - mappings.insert(new FieldEntry(owner, name, desc), new EntryMapping(fieldMatcher.group(4))); - continue; - } - - Matcher classMatcher = CLASS_PATTERN.matcher(line); - - if (classMatcher.find()) { - mappings.insert(new ClassEntry(classMatcher.group(1)), new EntryMapping(classMatcher.group(2))); - } - } - - return mappings; - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java deleted file mode 100644 index 26a29bf..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java +++ /dev/null @@ -1,77 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.recaf; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.Writer; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingDelta; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsWriter; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public class RecafMappingsWriter implements MappingsWriter { - public static final RecafMappingsWriter INSTANCE = new RecafMappingsWriter(); - - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - try { - Files.deleteIfExists(path); - Files.createFile(path); - } catch (IOException e) { - e.printStackTrace(); - } - - try (BufferedWriter writer = Files.newBufferedWriter(path)) { - new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).forEach(entry -> writeEntry(writer, mappings, entry)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void writeEntry(Writer writer, EntryTree mappings, Entry entry) { - EntryTreeNode node = mappings.findNode(entry); - - if (node == null) { - return; - } - - EntryMapping mapping = mappings.get(entry); - - try { - if (mapping != null && mapping.targetName() != null) { - if (entry instanceof ClassEntry classEntry) { - writer.write(classEntry.getFullName()); - writer.write(" "); - writer.write(mapping.targetName()); - } else if (entry instanceof FieldEntry fieldEntry) { - writer.write(fieldEntry.getFullName()); - writer.write(" "); - writer.write(fieldEntry.getDesc().toString()); - writer.write(" "); - writer.write(mapping.targetName()); - } else if (entry instanceof MethodEntry methodEntry) { - writer.write(methodEntry.getFullName()); - writer.write(methodEntry.getDesc().toString()); - writer.write(" "); - writer.write(mapping.targetName()); - } - - writer.write("\n"); - } - } catch (IOException e) { - e.printStackTrace(); - } - - node.getChildren().forEach(child -> writeEntry(writer, mappings, child)); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java deleted file mode 100644 index 4237237..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java +++ /dev/null @@ -1,119 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.srg; - -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.MappingTranslator; -import cuchaz.enigma.translation.Translator; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingDelta; -import cuchaz.enigma.translation.mapping.VoidEntryResolver; -import cuchaz.enigma.translation.mapping.serde.LfPrintWriter; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsWriter; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; -import cuchaz.enigma.utils.I18n; - -public enum SrgMappingsWriter implements MappingsWriter { - INSTANCE; - - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - try { - Files.deleteIfExists(path); - Files.createFile(path); - } catch (IOException e) { - e.printStackTrace(); - } - - List classLines = new ArrayList<>(); - List fieldLines = new ArrayList<>(); - List methodLines = new ArrayList<>(); - - List> rootEntries = new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).toList(); - progress.init(rootEntries.size(), I18n.translate("progress.mappings.converting")); - - int steps = 0; - - for (Entry entry : sorted(rootEntries)) { - progress.step(steps++, entry.getName()); - writeEntry(classLines, fieldLines, methodLines, mappings, entry); - } - - progress.init(3, I18n.translate("progress.mappings.writing")); - - try (PrintWriter writer = new LfPrintWriter(Files.newBufferedWriter(path))) { - progress.step(0, I18n.translate("type.classes")); - classLines.forEach(writer::println); - progress.step(1, I18n.translate("type.fields")); - fieldLines.forEach(writer::println); - progress.step(2, I18n.translate("type.methods")); - methodLines.forEach(writer::println); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void writeEntry(List classes, List fields, List methods, EntryTree mappings, Entry entry) { - EntryTreeNode node = mappings.findNode(entry); - - if (node == null) { - return; - } - - Translator translator = new MappingTranslator(mappings, VoidEntryResolver.INSTANCE); - - if (entry instanceof ClassEntry) { - classes.add(generateClassLine((ClassEntry) entry, translator)); - } else if (entry instanceof FieldEntry) { - fields.add(generateFieldLine((FieldEntry) entry, translator)); - } else if (entry instanceof MethodEntry) { - methods.add(generateMethodLine((MethodEntry) entry, translator)); - } - - for (Entry child : sorted(node.getChildren())) { - writeEntry(classes, fields, methods, mappings, child); - } - } - - private String generateClassLine(ClassEntry sourceEntry, Translator translator) { - ClassEntry targetEntry = translator.translate(sourceEntry); - return "CL: " + sourceEntry.getFullName() + " " + targetEntry.getFullName(); - } - - private String generateMethodLine(MethodEntry sourceEntry, Translator translator) { - MethodEntry targetEntry = translator.translate(sourceEntry); - return "MD: " + describeMethod(sourceEntry) + " " + describeMethod(targetEntry); - } - - private String describeMethod(MethodEntry entry) { - return entry.getParent().getFullName() + "/" + entry.getName() + " " + entry.getDesc(); - } - - private String generateFieldLine(FieldEntry sourceEntry, Translator translator) { - FieldEntry targetEntry = translator.translate(sourceEntry); - return "FD: " + describeField(sourceEntry) + " " + describeField(targetEntry); - } - - private String describeField(FieldEntry entry) { - return entry.getParent().getFullName() + "/" + entry.getName(); - } - - private Collection> sorted(Collection> collection) { - ArrayList> sorted = new ArrayList<>(collection); - sorted.sort(Comparator.comparing(Entry::getName)); - return sorted; - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java deleted file mode 100644 index ae00300..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java +++ /dev/null @@ -1,117 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.tiny; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingPair; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsReader; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.HashEntryTree; -import cuchaz.enigma.translation.representation.MethodDescriptor; -import cuchaz.enigma.translation.representation.TypeDescriptor; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; -import cuchaz.enigma.utils.I18n; - -public enum TinyMappingsReader implements MappingsReader { - INSTANCE; - - @Override - public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - return read(path, Files.readAllLines(path, StandardCharsets.UTF_8), progress); - } - - private EntryTree read(Path path, List lines, ProgressListener progress) throws MappingParseException { - EntryTree mappings = new HashEntryTree<>(); - lines.remove(0); - - progress.init(lines.size(), I18n.translate("progress.mappings.loading_file")); - - for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { - progress.step(lineNumber, ""); - - String line = lines.get(lineNumber); - - if (line.trim().startsWith("#")) { - continue; - } - - try { - MappingPair mapping = parseLine(line); - mappings.insert(mapping.getEntry(), mapping.getMapping()); - } catch (Throwable t) { - throw new MappingParseException(path, lineNumber, t); - } - } - - return mappings; - } - - private MappingPair parseLine(String line) { - String[] tokens = line.split("\t"); - - String key = tokens[0]; - switch (key) { - case "CLASS": - return parseClass(tokens); - case "FIELD": - return parseField(tokens); - case "METHOD": - return parseMethod(tokens); - case "MTH-ARG": - return parseArgument(tokens); - default: - throw new RuntimeException("Unknown token '" + key + "'!"); - } - } - - private MappingPair parseClass(String[] tokens) { - ClassEntry obfuscatedEntry = new ClassEntry(tokens[1]); - String mapping = tokens[2]; - - if (mapping.indexOf('$') > 0) { - // inner classes should map to only the final part - mapping = mapping.substring(mapping.lastIndexOf('$') + 1); - } - - return new MappingPair<>(obfuscatedEntry, new EntryMapping(mapping)); - } - - private MappingPair parseField(String[] tokens) { - ClassEntry ownerClass = new ClassEntry(tokens[1]); - TypeDescriptor descriptor = new TypeDescriptor(tokens[2]); - - FieldEntry obfuscatedEntry = new FieldEntry(ownerClass, tokens[3], descriptor); - String mapping = tokens[4]; - return new MappingPair<>(obfuscatedEntry, new EntryMapping(mapping)); - } - - private MappingPair parseMethod(String[] tokens) { - ClassEntry ownerClass = new ClassEntry(tokens[1]); - MethodDescriptor descriptor = new MethodDescriptor(tokens[2]); - - MethodEntry obfuscatedEntry = new MethodEntry(ownerClass, tokens[3], descriptor); - String mapping = tokens[4]; - return new MappingPair<>(obfuscatedEntry, new EntryMapping(mapping)); - } - - private MappingPair parseArgument(String[] tokens) { - ClassEntry ownerClass = new ClassEntry(tokens[1]); - MethodDescriptor ownerDescriptor = new MethodDescriptor(tokens[2]); - MethodEntry ownerMethod = new MethodEntry(ownerClass, tokens[3], ownerDescriptor); - int variableIndex = Integer.parseInt(tokens[4]); - - String mapping = tokens[5]; - LocalVariableEntry obfuscatedEntry = new LocalVariableEntry(ownerMethod, variableIndex, "", true, null); - return new MappingPair<>(obfuscatedEntry, new EntryMapping(mapping)); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java deleted file mode 100644 index 67582be..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java +++ /dev/null @@ -1,144 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.tiny; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Set; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.MappingTranslator; -import cuchaz.enigma.translation.Translator; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingDelta; -import cuchaz.enigma.translation.mapping.VoidEntryResolver; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsWriter; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public class TinyMappingsWriter implements MappingsWriter { - private static final String VERSION_CONSTANT = "v1"; - - //Possibly add a gui or a way to select the namespaces when exporting from the gui - public static final TinyMappingsWriter INSTANCE = new TinyMappingsWriter("intermediary", "named"); - - // HACK: as of enigma 0.13.1, some fields seem to appear duplicated? - private final Set writtenLines = new HashSet<>(); - private final String nameObf; - private final String nameDeobf; - - public TinyMappingsWriter(String nameObf, String nameDeobf) { - this.nameObf = nameObf; - this.nameDeobf = nameDeobf; - } - - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { - try { - Files.deleteIfExists(path); - Files.createFile(path); - } catch (IOException e) { - e.printStackTrace(); - } - - try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { - writeLine(writer, new String[]{VERSION_CONSTANT, nameObf, nameDeobf}); - - new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).sorted(Comparator.comparing(Object::toString)).forEach(entry -> writeEntry(writer, mappings, entry)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void writeEntry(Writer writer, EntryTree mappings, Entry entry) { - EntryTreeNode node = mappings.findNode(entry); - - if (node == null) { - return; - } - - Translator translator = new MappingTranslator(mappings, VoidEntryResolver.INSTANCE); - - EntryMapping mapping = mappings.get(entry); - - // Do not write mappings without deobfuscated name since tiny v1 doesn't - // support comments anyway - if (mapping != null && mapping.targetName() != null) { - if (entry instanceof ClassEntry) { - writeClass(writer, (ClassEntry) entry, translator); - } else if (entry instanceof FieldEntry) { - writeLine(writer, serializeEntry(entry, mapping.targetName())); - } else if (entry instanceof MethodEntry) { - writeLine(writer, serializeEntry(entry, mapping.targetName())); - } - } - - writeChildren(writer, mappings, node); - } - - private void writeChildren(Writer writer, EntryTree mappings, EntryTreeNode node) { - node.getChildren().stream().filter(e -> e instanceof FieldEntry).sorted().forEach(child -> writeEntry(writer, mappings, child)); - - node.getChildren().stream().filter(e -> e instanceof MethodEntry).sorted().forEach(child -> writeEntry(writer, mappings, child)); - - node.getChildren().stream().filter(e -> e instanceof ClassEntry).sorted().forEach(child -> writeEntry(writer, mappings, child)); - } - - private void writeClass(Writer writer, ClassEntry entry, Translator translator) { - ClassEntry translatedEntry = translator.translate(entry); - - String obfClassName = entry.getFullName(); - String deobfClassName = translatedEntry.getFullName(); - writeLine(writer, new String[]{"CLASS", obfClassName, deobfClassName}); - } - - private void writeLine(Writer writer, String[] data) { - try { - String line = String.join("\t", data) + "\n"; - - if (writtenLines.add(line)) { - writer.write(line); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private String[] serializeEntry(Entry entry, String... extraFields) { - String[] data = null; - - if (entry instanceof FieldEntry) { - data = new String[4 + extraFields.length]; - data[0] = "FIELD"; - data[1] = entry.getContainingClass().getFullName(); - data[2] = ((FieldEntry) entry).getDesc().toString(); - data[3] = entry.getName(); - } else if (entry instanceof MethodEntry) { - data = new String[4 + extraFields.length]; - data[0] = "METHOD"; - data[1] = entry.getContainingClass().getFullName(); - data[2] = ((MethodEntry) entry).getDesc().toString(); - data[3] = entry.getName(); - } else if (entry instanceof ClassEntry) { - data = new String[2 + extraFields.length]; - data[0] = "CLASS"; - data[1] = ((ClassEntry) entry).getFullName(); - } - - if (data != null) { - System.arraycopy(extraFields, 0, data, data.length - extraFields.length, extraFields.length); - } - - return data; - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Reader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Reader.java deleted file mode 100644 index 28185f5..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Reader.java +++ /dev/null @@ -1,332 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.tinyv2; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.BitSet; -import java.util.List; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingPair; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsReader; -import cuchaz.enigma.translation.mapping.serde.RawEntryMapping; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.HashEntryTree; -import cuchaz.enigma.translation.representation.MethodDescriptor; -import cuchaz.enigma.translation.representation.TypeDescriptor; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public final class TinyV2Reader implements MappingsReader { - private static final String MINOR_VERSION = "0"; - // 0 indent - private static final int IN_HEADER = 0; - private static final int IN_CLASS = IN_HEADER + 1; - // 1 indent - private static final int IN_METHOD = IN_CLASS + 1; - private static final int IN_FIELD = IN_METHOD + 1; - // 2 indent - private static final int IN_PARAMETER = IN_FIELD + 1; - // general properties - private static final int STATE_SIZE = IN_PARAMETER + 1; - private static final int[] INDENT_CLEAR_START = {IN_HEADER, IN_METHOD, IN_PARAMETER, STATE_SIZE}; - - @Override - public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - return read(path, Files.readAllLines(path, StandardCharsets.UTF_8), progress); - } - - private EntryTree read(Path path, List lines, ProgressListener progress) throws MappingParseException { - EntryTree mappings = new HashEntryTree<>(); - - progress.init(lines.size(), "progress.mappings.loading_file"); - - BitSet state = new BitSet(STATE_SIZE); - @SuppressWarnings({"unchecked", "rawtypes"}) MappingPair, RawEntryMapping>[] holds = new MappingPair[STATE_SIZE]; - boolean escapeNames = false; - - for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { - try { - progress.step(lineNumber, ""); - String line = lines.get(lineNumber); - - int indent = 0; - - while (line.charAt(indent) == '\t') { - indent++; - } - - String[] parts = line.substring(indent).split("\t", -1); - - if (parts.length == 0 || indent >= INDENT_CLEAR_START.length) { - throw new IllegalArgumentException("Invalid format"); - } - - // clean and register stuff in stack - for (int i = INDENT_CLEAR_START[indent]; i < STATE_SIZE; i++) { - state.clear(i); - - if (holds[i] != null) { - bakeHeld(mappings, holds[i]); - holds[i] = null; - } - } - - switch (indent) { - case 0: - switch (parts[0]) { - case "tiny": // header - if (lineNumber != 0) { - throw new IllegalArgumentException("Header can only be on the first line"); - } - - if (parts.length < 5) { - throw new IllegalArgumentException("Not enough header columns, needs at least 5"); - } - - if (!"2".equals(parts[1]) || !MINOR_VERSION.equals(parts[2])) { - throw new IllegalArgumentException("Unsupported TinyV2 version, requires major " + "2" + " and minor " + MINOR_VERSION + ""); - } - - state.set(IN_HEADER); - break; - case "c": // class - state.set(IN_CLASS); - holds[IN_CLASS] = parseClass(parts, escapeNames); - break; - default: - unsupportKey(parts); - } - - break; - case 1: - if (state.get(IN_HEADER)) { - if (parts[0].equals("esacpe-names")) { - escapeNames = true; - } - - break; - } - - if (state.get(IN_CLASS)) { - switch (parts[0]) { - case "m": // method - state.set(IN_METHOD); - holds[IN_METHOD] = parseMethod(holds[IN_CLASS], parts, escapeNames); - break; - case "f": // field - state.set(IN_FIELD); - holds[IN_FIELD] = parseField(holds[IN_CLASS], parts, escapeNames); - break; - case "c": // class javadoc - addJavadoc(holds[IN_CLASS], parts); - break; - default: - unsupportKey(parts); - } - - break; - } - - unsupportKey(parts); - case 2: - if (state.get(IN_METHOD)) { - switch (parts[0]) { - case "p": // parameter - state.set(IN_PARAMETER); - holds[IN_PARAMETER] = parseArgument(holds[IN_METHOD], parts, escapeNames); - break; - case "v": // local variable - // TODO add local var mapping - break; - case "c": // method javadoc - addJavadoc(holds[IN_METHOD], parts); - break; - default: - unsupportKey(parts); - } - - break; - } - - if (state.get(IN_FIELD)) { - switch (parts[0]) { - case "c": // field javadoc - addJavadoc(holds[IN_FIELD], parts); - break; - default: - unsupportKey(parts); - } - - break; - } - - unsupportKey(parts); - case 3: - if (state.get(IN_PARAMETER)) { - switch (parts[0]) { - case "c": - addJavadoc(holds[IN_PARAMETER], parts); - break; - default: - unsupportKey(parts); - } - - break; - } - - unsupportKey(parts); - default: - unsupportKey(parts); - } - } catch (Throwable t) { - throw new MappingParseException(path, lineNumber + 1, t); - } - } - - //bake any remainders - for (MappingPair, RawEntryMapping> hold : holds) { - if (hold != null) { - bakeHeld(mappings, hold); - } - } - - return mappings; - } - - private static void bakeHeld(EntryTree mappings, MappingPair, RawEntryMapping> hold2) { - RawEntryMapping mapping = hold2.getMapping(); - - if (mapping != null) { - EntryMapping baked = mapping.bake(); - - if (baked != null) { - mappings.insert(hold2.getEntry(), baked); - } - } - } - - private void unsupportKey(String[] parts) { - throw new IllegalArgumentException("Unsupported key " + parts[0]); - } - - private void addJavadoc(MappingPair pair, String[] parts) { - if (parts.length != 2) { - throw new IllegalArgumentException("Invalid javadoc declaration"); - } - - addJavadoc(pair, parts[1]); - } - - private MappingPair parseClass(String[] tokens, boolean escapeNames) { - ClassEntry obfuscatedEntry = new ClassEntry(unescapeOpt(tokens[1], escapeNames)); - - if (tokens.length <= 2) { - return new MappingPair<>(obfuscatedEntry); - } - - String token2 = unescapeOpt(tokens[2], escapeNames); - String mapping = token2.substring(token2.lastIndexOf('$') + 1); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping)); - } - - private MappingPair parseField(MappingPair parent, String[] tokens, boolean escapeNames) { - ClassEntry ownerClass = (ClassEntry) parent.getEntry(); - TypeDescriptor descriptor = new TypeDescriptor(unescapeOpt(tokens[1], escapeNames)); - - FieldEntry obfuscatedEntry = new FieldEntry(ownerClass, unescapeOpt(tokens[2], escapeNames), descriptor); - - if (tokens.length <= 3) { - return new MappingPair<>(obfuscatedEntry); - } - - String mapping = unescapeOpt(tokens[3], escapeNames); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping)); - } - - private MappingPair parseMethod(MappingPair parent, String[] tokens, boolean escapeNames) { - ClassEntry ownerClass = (ClassEntry) parent.getEntry(); - MethodDescriptor descriptor = new MethodDescriptor(unescapeOpt(tokens[1], escapeNames)); - - MethodEntry obfuscatedEntry = new MethodEntry(ownerClass, unescapeOpt(tokens[2], escapeNames), descriptor); - - if (tokens.length <= 3) { - return new MappingPair<>(obfuscatedEntry); - } - - String mapping = unescapeOpt(tokens[3], escapeNames); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping)); - } - - private void addJavadoc(MappingPair pair, String javadoc) { - RawEntryMapping mapping = pair.getMapping(); - - if (mapping == null) { - throw new IllegalArgumentException("Javadoc requires a mapping in enigma!"); - } - - mapping.addJavadocLine(unescape(javadoc)); - } - - private MappingPair parseArgument(MappingPair parent, String[] tokens, boolean escapeNames) { - MethodEntry ownerMethod = (MethodEntry) parent.getEntry(); - int variableIndex = Integer.parseInt(tokens[1]); - - // tokens[2] is the useless obf name - - LocalVariableEntry obfuscatedEntry = new LocalVariableEntry(ownerMethod, variableIndex, "", true, null); - - if (tokens.length <= 3) { - return new MappingPair<>(obfuscatedEntry); - } - - String mapping = unescapeOpt(tokens[3], escapeNames); - return new MappingPair<>(obfuscatedEntry, new RawEntryMapping(mapping)); - } - - private static final String TO_ESCAPE = "\\\n\r\0\t"; - private static final String ESCAPED = "\\nr0t"; - - private static String unescapeOpt(String raw, boolean escapedStrings) { - return escapedStrings ? unescape(raw) : raw; - } - - private static String unescape(String str) { - // copied from matcher, lazy! - int pos = str.indexOf('\\'); - - if (pos < 0) { - return str; - } - - StringBuilder ret = new StringBuilder(str.length() - 1); - int start = 0; - - do { - ret.append(str, start, pos); - pos++; - int type; - - if (pos >= str.length()) { - throw new RuntimeException("incomplete escape sequence at the end"); - } else if ((type = ESCAPED.indexOf(str.charAt(pos))) < 0) { - throw new RuntimeException("invalid escape character: \\" + str.charAt(pos)); - } else { - ret.append(TO_ESCAPE.charAt(type)); - } - - start = pos + 1; - } while ((pos = str.indexOf('\\', start)) >= 0); - - ret.append(str, start, str.length()); - - return ret.toString(); - } -} diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java deleted file mode 100644 index d85ed6e..0000000 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java +++ /dev/null @@ -1,187 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.tinyv2; - -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Deque; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.StreamSupport; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMap; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.MappingDelta; -import cuchaz.enigma.translation.mapping.serde.LfPrintWriter; -import cuchaz.enigma.translation.mapping.serde.MappingHelper; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.MappingsWriter; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; -import cuchaz.enigma.translation.representation.entry.ClassEntry; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; -import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; -import cuchaz.enigma.translation.representation.entry.MethodEntry; - -public final class TinyV2Writer implements MappingsWriter { - private static final String MINOR_VERSION = "0"; - private final String obfHeader; - private final String deobfHeader; - - public TinyV2Writer(String obfHeader, String deobfHeader) { - this.obfHeader = obfHeader; - this.deobfHeader = deobfHeader; - } - - @Override - public void write(EntryTree mappings, MappingDelta delta, Path path, ProgressListener progress, MappingSaveParameters parameters) { - List> classes = StreamSupport.stream(mappings.spliterator(), false).filter(node -> node.getEntry() instanceof ClassEntry).toList(); - - try (PrintWriter writer = new LfPrintWriter(Files.newBufferedWriter(path))) { - writer.println("tiny\t2\t" + MINOR_VERSION + "\t" + obfHeader + "\t" + deobfHeader); - - // no escape names - - for (EntryTreeNode node : classes) { - writeClass(writer, node, mappings); - } - } catch (IOException ex) { - ex.printStackTrace(); // TODO add some better logging system - } - } - - private void writeClass(PrintWriter writer, EntryTreeNode node, EntryMap tree) { - writer.print("c\t"); - ClassEntry classEntry = (ClassEntry) node.getEntry(); - String fullName = classEntry.getFullName(); - writer.print(fullName); - Deque parts = new LinkedList<>(); - - do { - EntryMapping mapping = tree.get(classEntry); - - if (mapping != null && mapping.targetName() != null) { - parts.addFirst(mapping.targetName()); - } else { - parts.addFirst(classEntry.getName()); - } - - classEntry = classEntry.getOuterClass(); - } while (classEntry != null); - - String mappedName = String.join("$", parts); - - writer.print("\t"); - - writer.print(mappedName); // todo escaping when we have v2 fixed later - - writer.println(); - - writeComment(writer, node.getValue(), 1); - - for (EntryTreeNode child : node.getChildNodes()) { - Entry entry = child.getEntry(); - - if (entry instanceof FieldEntry) { - writeField(writer, child); - } else if (entry instanceof MethodEntry) { - writeMethod(writer, child); - } - } - } - - private void writeMethod(PrintWriter writer, EntryTreeNode node) { - writer.print(indent(1)); - writer.print("m\t"); - writer.print(((MethodEntry) node.getEntry()).getDesc().toString()); - writer.print("\t"); - writer.print(node.getEntry().getName()); - writer.print("\t"); - EntryMapping mapping = node.getValue(); - - if (mapping == null) { - mapping = EntryMapping.DEFAULT; - } - - if (mapping.targetName() != null) { - writer.println(mapping.targetName()); - } else { - writer.println(node.getEntry().getName()); // todo fix v2 name inference - } - - writeComment(writer, mapping, 2); - - for (EntryTreeNode child : node.getChildNodes()) { - Entry entry = child.getEntry(); - - if (entry instanceof LocalVariableEntry) { - writeParameter(writer, child); - } - - // TODO write actual local variables - } - } - - private void writeField(PrintWriter writer, EntryTreeNode node) { - if (node.getValue() == null || node.getValue().equals(EntryMapping.DEFAULT)) { - return; // Shortcut - } - - writer.print(indent(1)); - writer.print("f\t"); - writer.print(((FieldEntry) node.getEntry()).getDesc().toString()); - writer.print("\t"); - writer.print(node.getEntry().getName()); - writer.print("\t"); - EntryMapping mapping = node.getValue(); - - if (mapping == null) { - mapping = EntryMapping.DEFAULT; - } - - if (mapping.targetName() != null) { - writer.println(mapping.targetName()); - } else { - writer.println(node.getEntry().getName()); // todo fix v2 name inference - } - - writeComment(writer, mapping, 2); - } - - private void writeParameter(PrintWriter writer, EntryTreeNode node) { - if (node.getValue() == null || node.getValue().equals(EntryMapping.DEFAULT)) { - return; // Shortcut - } - - writer.print(indent(2)); - writer.print("p\t"); - writer.print(((LocalVariableEntry) node.getEntry()).getIndex()); - writer.print("\t"); - writer.print(node.getEntry().getName()); - writer.print("\t"); - EntryMapping mapping = node.getValue(); - - if (mapping == null || mapping.targetName() == null) { - writer.println(); // todo ??? - } else { - writer.println(mapping.targetName()); - - writeComment(writer, mapping, 3); - } - } - - private void writeComment(PrintWriter writer, EntryMapping mapping, int indent) { - if (mapping != null && mapping.javadoc() != null) { - writer.print(indent(indent)); - writer.print("c\t"); - writer.print(MappingHelper.escape(mapping.javadoc())); - writer.println(); - } - } - - private String indent(int level) { - return "\t".repeat(level); - } -} diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index e0882b9..a9c7ac9 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -16,7 +16,6 @@ "mapping_format.recaf": "Recaf Simple File", "mapping_format.jobf_file": "JOBF File", "mapping_format.intellij_migration_map_file": "IntelliJ Migration Map File", - "legacy": "legacy", "type.methods": "Methods", "type.fields": "Fields", diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestComments.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestComments.java deleted file mode 100644 index 15ec44e..0000000 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestComments.java +++ /dev/null @@ -1,37 +0,0 @@ -package cuchaz.enigma.translation.mapping; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.junit.Test; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; -import cuchaz.enigma.translation.mapping.serde.MappingParseException; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; -import cuchaz.enigma.translation.mapping.serde.tinyv2.TinyV2Writer; -import cuchaz.enigma.translation.mapping.tree.EntryTree; - -public class TestComments { - private static Path DIRECTORY; - - static { - try { - DIRECTORY = Paths.get(TestTinyV2InnerClasses.class.getResource("/comments/").toURI()); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - - @Test - public void testParseAndWrite() throws IOException, MappingParseException { - ProgressListener progressListener = ProgressListener.none(); - MappingSaveParameters params = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF); - EntryTree mappings = EnigmaMappingsReader.DIRECTORY.read(DIRECTORY, progressListener, params); - - new TinyV2Writer("intermediary", "named").write(mappings, DIRECTORY.resolve("convertedtiny.tiny"), progressListener, params); - } -} diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestReadWriteCycle.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestReadWriteCycle.java index 25f11fb..f665c36 100644 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestReadWriteCycle.java +++ b/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestReadWriteCycle.java @@ -103,11 +103,6 @@ public class TestReadWriteCycle { testReadWriteCycle(MappingFormat.ENIGMA_DIRECTORY, true, ".tmp"); } - @Test - public void testEnigmaZip() throws IOException, MappingParseException { - testReadWriteCycle(MappingFormat.ENIGMA_ZIP, true, ".zip"); - } - @Test public void testTinyFile() throws IOException, MappingParseException { testReadWriteCycle(MappingFormat.TINY_FILE, false, ".tiny"); diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestTinyV2InnerClasses.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestTinyV2InnerClasses.java deleted file mode 100644 index 9164abe..0000000 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestTinyV2InnerClasses.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2015 Jeff Martin. -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the GNU Lesser General Public -* License v3.0 which accompanies this distribution, and is available at -* http://www.gnu.org/licenses/lgpl.html -* -*

Contributors: -* Jeff Martin - initial API and implementation -******************************************************************************/ - -package cuchaz.enigma.translation.mapping; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -import cuchaz.enigma.Enigma; -import cuchaz.enigma.EnigmaProject; -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; - -public final class TestTinyV2InnerClasses { - private Path jar; - private Path mappings; - - public TestTinyV2InnerClasses() throws Exception { - jar = Paths.get("build/test-obf/innerClasses.jar"); - mappings = Paths.get(TestTinyV2InnerClasses.class.getResource("/tinyV2InnerClasses/").toURI()); - } - - // @Test - public void testMappings() throws Exception { - EnigmaProject project = Enigma.create().openJar(jar, List.of(), ProgressListener.none()); - project.setMappings(EnigmaMappingsReader.DIRECTORY.read(mappings, ProgressListener.none(), project.getEnigma().getProfile().getMappingSaveParameters())); - } -} diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestV2Main.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestV2Main.java deleted file mode 100644 index cc08b85..0000000 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/TestV2Main.java +++ /dev/null @@ -1,23 +0,0 @@ -package cuchaz.enigma.translation.mapping; - -import java.nio.file.Path; -import java.nio.file.Paths; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; -import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; -import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; -import cuchaz.enigma.translation.mapping.serde.tinyv2.TinyV2Writer; -import cuchaz.enigma.translation.mapping.tree.EntryTree; - -public final class TestV2Main { - public static void main(String... args) throws Exception { - Path path = Paths.get(TestV2Main.class.getResource("/tinyV2InnerClasses/").toURI()); - - MappingSaveParameters parameters = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF); - - EntryTree tree = EnigmaMappingsReader.DIRECTORY.read(path, ProgressListener.none(), parameters); - - new TinyV2Writer("obf", "deobf").write(tree, Paths.get("currentYarn.tiny"), ProgressListener.none(), parameters); - } -} diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java deleted file mode 100644 index 5f3e47c..0000000 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java +++ /dev/null @@ -1,45 +0,0 @@ -package cuchaz.enigma.translation.mapping.serde.recaf; - -import static org.junit.Assert.assertEquals; - -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.Set; - -import com.google.common.jimfs.Jimfs; -import org.junit.Test; - -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.tree.EntryTree; - -public class TestRecaf { - @Test - public void testIntegrity() throws Exception { - Set contents; - - try (InputStream in = getClass().getResourceAsStream("/recaf.mappings")) { - contents = Set.of(new String(in.readAllBytes(), StandardCharsets.UTF_8).split("\\R")); - } - - try (FileSystem fs = Jimfs.newFileSystem()) { - Path path = fs.getPath("recaf.mappings"); - Files.writeString(path, String.join("\n", contents)); - - RecafMappingsWriter writer = RecafMappingsWriter.INSTANCE; - RecafMappingsReader reader = RecafMappingsReader.INSTANCE; - - EntryTree mappings = reader.read(path, ProgressListener.none(), null); - writer.write(mappings, path, ProgressListener.none(), null); - - reader.read(path, ProgressListener.none(), null); - Set newContents = new HashSet<>(Files.readAllLines(path)); - - assertEquals(contents, newContents); - } - } -} diff --git a/enigma/src/test/resources/comments/test.mapping b/enigma/src/test/resources/comments/test.mapping deleted file mode 100644 index d134558..0000000 --- a/enigma/src/test/resources/comments/test.mapping +++ /dev/null @@ -1,18 +0,0 @@ -CLASS net/minecraft/class_1158 net/minecraft/util/math/Quaternion - COMMENT it circel - COMMENT next line - FIELD field_21493 IDENTITY Lnet/minecraft/class_1158; - COMMENT moar comment thing - COMMENT near field - METHOD foo bar (FFFF)V - COMMENT method comment - COMMENT second line - COMMENT third line - ARG 1 b - COMMENT arg comment - CLASS old new - COMMENT inner comment - FIELD field_19263 iterator Lnet/minecraft/class_3980; - METHOD tryAdvance (Ljava/util/function/Consumer;)Z - ARG 1 consumer - COMMENT very inner comment \ No newline at end of file diff --git a/enigma/src/test/resources/recaf.mappings b/enigma/src/test/resources/recaf.mappings deleted file mode 100644 index 479099e..0000000 --- a/enigma/src/test/resources/recaf.mappings +++ /dev/null @@ -1,10 +0,0 @@ -a testClass -a.a Z testField -a.a()V testMethod0 -a.a(Z)V testMethod1 -a.b()V testMethod2 -a/a testInnerClass -a/a.a Z testInnerField -a/a.a()V testInnerMethod0 -a/a.a(Z)V testInnerMethod1 -a/a.b()V testInnerMethod2 diff --git a/enigma/src/test/resources/tinyV2InnerClasses/c.mapping b/enigma/src/test/resources/tinyV2InnerClasses/c.mapping deleted file mode 100644 index f9b0442..0000000 --- a/enigma/src/test/resources/tinyV2InnerClasses/c.mapping +++ /dev/null @@ -1,2 +0,0 @@ -CLASS c - CLASS a Kid diff --git a/enigma/src/test/resources/tinyV2InnerClasses/cuchaz/enigma/Dad.mapping b/enigma/src/test/resources/tinyV2InnerClasses/cuchaz/enigma/Dad.mapping deleted file mode 100644 index 8d43ba9..0000000 --- a/enigma/src/test/resources/tinyV2InnerClasses/cuchaz/enigma/Dad.mapping +++ /dev/null @@ -1,5 +0,0 @@ -CLASS f cuchaz/enigma/Dad - CLASS a One - CLASS a Two - CLASS a - FIELD a value I -- cgit v1.2.3