diff options
| author | 2024-04-10 14:13:33 +0200 | |
|---|---|---|
| committer | 2024-04-10 13:13:33 +0100 | |
| commit | fba6b59d6d5c838f08d6cadb6a1e311dbc888474 (patch) | |
| tree | b62ae92ae571f523740d61e23155aa0bcdcb7118 | |
| parent | Invert Mapping-IO Proguard mappings to mirror legacy behavior (#542) (diff) | |
| download | enigma-fba6b59d6d5c838f08d6cadb6a1e311dbc888474.tar.gz enigma-fba6b59d6d5c838f08d6cadb6a1e311dbc888474.tar.xz enigma-fba6b59d6d5c838f08d6cadb6a1e311dbc888474.zip | |
Add temporary bodge to MIO Enigma dir writer to support deltas (#543)
| -rw-r--r-- | enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java | 21 | ||||
| -rw-r--r-- | enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java | 44 |
2 files changed, 55 insertions, 10 deletions
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 56b36e06..7daa5d48 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 | |||
| @@ -78,16 +78,21 @@ public enum MappingFormat { | |||
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | try { | 80 | try { |
| 81 | if (this == PROGUARD) { | 81 | if (this == ENIGMA_DIRECTORY) { // TODO: Remove once MIO supports deltas |
| 82 | mappings = MappingOperations.invert(mappings); | 82 | EnigmaMappingsWriter.DIRECTORY.write(mappings, lastUsedMappingIoWriter ? MappingDelta.added(mappings) : delta, path, progressListener, saveParameters, true); |
| 83 | } else { | ||
| 84 | if (this == PROGUARD) { | ||
| 85 | mappings = MappingOperations.invert(mappings); | ||
| 86 | } | ||
| 87 | |||
| 88 | VisitableMappingTree tree = MappingIoConverter.toMappingIo(mappings, progressListener); | ||
| 89 | progressListener.init(1, I18n.translate("progress.mappings.writing")); | ||
| 90 | progressListener.step(1, null); // Reset message | ||
| 91 | |||
| 92 | tree.accept(MappingWriter.create(path, mappingIoCounterpart), VisitOrder.createByName()); | ||
| 93 | progressListener.step(1, I18n.translate("progress.done")); | ||
| 83 | } | 94 | } |
| 84 | 95 | ||
| 85 | VisitableMappingTree tree = MappingIoConverter.toMappingIo(mappings, progressListener); | ||
| 86 | progressListener.init(1, I18n.translate("progress.mappings.writing")); | ||
| 87 | progressListener.step(1, null); // Reset message | ||
| 88 | |||
| 89 | tree.accept(MappingWriter.create(path, mappingIoCounterpart), VisitOrder.createByName()); | ||
| 90 | progressListener.step(1, I18n.translate("progress.done")); | ||
| 91 | lastUsedMappingIoWriter = true; | 96 | lastUsedMappingIoWriter = true; |
| 92 | } catch (IOException e) { | 97 | } catch (IOException e) { |
| 93 | throw new UncheckedIOException(e); | 98 | throw new UncheckedIOException(e); |
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 73f29a16..24867b69 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 | |||
| @@ -24,13 +24,21 @@ import java.nio.file.Paths; | |||
| 24 | import java.util.ArrayList; | 24 | import java.util.ArrayList; |
| 25 | import java.util.Collection; | 25 | import java.util.Collection; |
| 26 | import java.util.Collections; | 26 | import java.util.Collections; |
| 27 | import java.util.HashSet; | ||
| 27 | import java.util.Objects; | 28 | import java.util.Objects; |
| 29 | import java.util.Set; | ||
| 28 | import java.util.concurrent.atomic.AtomicInteger; | 30 | import java.util.concurrent.atomic.AtomicInteger; |
| 29 | import java.util.stream.Collectors; | 31 | import java.util.stream.Collectors; |
| 30 | import java.util.stream.Stream; | 32 | import java.util.stream.Stream; |
| 31 | 33 | ||
| 32 | import javax.annotation.Nonnull; | 34 | import javax.annotation.Nonnull; |
| 33 | 35 | ||
| 36 | import net.fabricmc.mappingio.MappingWriter; | ||
| 37 | import net.fabricmc.mappingio.format.MappingFormat; | ||
| 38 | import net.fabricmc.mappingio.tree.VisitOrder; | ||
| 39 | import net.fabricmc.mappingio.tree.VisitableMappingTree; | ||
| 40 | import org.jetbrains.annotations.ApiStatus; | ||
| 41 | |||
| 34 | import cuchaz.enigma.ProgressListener; | 42 | import cuchaz.enigma.ProgressListener; |
| 35 | import cuchaz.enigma.translation.MappingTranslator; | 43 | import cuchaz.enigma.translation.MappingTranslator; |
| 36 | import cuchaz.enigma.translation.Translator; | 44 | import cuchaz.enigma.translation.Translator; |
| @@ -41,10 +49,12 @@ import cuchaz.enigma.translation.mapping.VoidEntryResolver; | |||
| 41 | import cuchaz.enigma.translation.mapping.serde.LfPrintWriter; | 49 | import cuchaz.enigma.translation.mapping.serde.LfPrintWriter; |
| 42 | import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; | 50 | import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; |
| 43 | import cuchaz.enigma.translation.mapping.serde.MappingHelper; | 51 | import cuchaz.enigma.translation.mapping.serde.MappingHelper; |
| 52 | import cuchaz.enigma.translation.mapping.serde.MappingIoConverter; | ||
| 44 | import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; | 53 | import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; |
| 45 | import cuchaz.enigma.translation.mapping.serde.MappingsWriter; | 54 | import cuchaz.enigma.translation.mapping.serde.MappingsWriter; |
| 46 | import cuchaz.enigma.translation.mapping.tree.EntryTree; | 55 | import cuchaz.enigma.translation.mapping.tree.EntryTree; |
| 47 | import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; | 56 | import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; |
| 57 | import cuchaz.enigma.translation.mapping.tree.HashEntryTree; | ||
| 48 | import cuchaz.enigma.translation.representation.entry.ClassEntry; | 58 | import cuchaz.enigma.translation.representation.entry.ClassEntry; |
| 49 | import cuchaz.enigma.translation.representation.entry.Entry; | 59 | import cuchaz.enigma.translation.representation.entry.Entry; |
| 50 | import cuchaz.enigma.translation.representation.entry.FieldEntry; | 60 | import cuchaz.enigma.translation.representation.entry.FieldEntry; |
| @@ -75,6 +85,12 @@ public enum EnigmaMappingsWriter implements MappingsWriter { | |||
| 75 | DIRECTORY { | 85 | DIRECTORY { |
| 76 | @Override | 86 | @Override |
| 77 | public void write(EntryTree<EntryMapping> mappings, MappingDelta<EntryMapping> delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { | 87 | public void write(EntryTree<EntryMapping> mappings, MappingDelta<EntryMapping> delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) { |
| 88 | write(mappings, delta, path, progress, saveParameters, false); | ||
| 89 | } | ||
| 90 | |||
| 91 | @Override | ||
| 92 | @ApiStatus.Internal | ||
| 93 | public void write(EntryTree<EntryMapping> mappings, MappingDelta<EntryMapping> delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters, boolean useMio) { | ||
| 78 | Collection<ClassEntry> changedClasses = delta.getChangedRoots().filter(entry -> entry instanceof ClassEntry).map(entry -> (ClassEntry) entry).toList(); | 94 | Collection<ClassEntry> changedClasses = delta.getChangedRoots().filter(entry -> entry instanceof ClassEntry).map(entry -> (ClassEntry) entry).toList(); |
| 79 | 95 | ||
| 80 | applyDeletions(path, changedClasses, mappings, delta.getBaseMappings(), saveParameters.getFileNameFormat()); | 96 | applyDeletions(path, changedClasses, mappings, delta.getBaseMappings(), saveParameters.getFileNameFormat()); |
| @@ -98,8 +114,26 @@ public enum EnigmaMappingsWriter implements MappingsWriter { | |||
| 98 | Files.createDirectories(classPath.getParent()); | 114 | Files.createDirectories(classPath.getParent()); |
| 99 | Files.deleteIfExists(classPath); | 115 | Files.deleteIfExists(classPath); |
| 100 | 116 | ||
| 101 | try (PrintWriter writer = new LfPrintWriter(Files.newBufferedWriter(classPath))) { | 117 | if (useMio) { |
| 102 | writeRoot(writer, mappings, classEntry); | 118 | EntryTree<EntryMapping> currentMappings = new HashEntryTree<>(); |
| 119 | Set<Entry<?>> children = new HashSet<>(); | ||
| 120 | children.add(classEntry); | ||
| 121 | |||
| 122 | while (!children.isEmpty()) { | ||
| 123 | Entry<?> child = children.stream().findFirst().get(); | ||
| 124 | children.remove(child); | ||
| 125 | children.addAll(mappings.getChildren(child)); | ||
| 126 | |||
| 127 | EntryMapping mapping = mappings.get(child); | ||
| 128 | currentMappings.insert(child, mapping != null ? mapping : EntryMapping.DEFAULT); | ||
| 129 | } | ||
| 130 | |||
| 131 | VisitableMappingTree tree = MappingIoConverter.toMappingIo(currentMappings, ProgressListener.none()); | ||
| 132 | tree.accept(MappingWriter.create(classPath, MappingFormat.ENIGMA_FILE), VisitOrder.createByName()); | ||
| 133 | } else { | ||
| 134 | try (PrintWriter writer = new LfPrintWriter(Files.newBufferedWriter(classPath))) { | ||
| 135 | writeRoot(writer, mappings, classEntry); | ||
| 136 | } | ||
| 103 | } | 137 | } |
| 104 | } catch (Throwable t) { | 138 | } catch (Throwable t) { |
| 105 | System.err.println("Failed to write class '" + classEntry.getFullName() + "'"); | 139 | System.err.println("Failed to write class '" + classEntry.getFullName() + "'"); |
| @@ -325,4 +359,10 @@ public enum EnigmaMappingsWriter implements MappingsWriter { | |||
| 325 | private boolean isMappingEmpty(EntryMapping mapping) { | 359 | private boolean isMappingEmpty(EntryMapping mapping) { |
| 326 | return mapping.targetName() == null && mapping.accessModifier() == AccessModifier.UNCHANGED && mapping.javadoc() == null; | 360 | return mapping.targetName() == null && mapping.accessModifier() == AccessModifier.UNCHANGED && mapping.javadoc() == null; |
| 327 | } | 361 | } |
| 362 | |||
| 363 | @ApiStatus.Internal | ||
| 364 | public void write(EntryTree<EntryMapping> mappings, MappingDelta<EntryMapping> mappingDelta, Path path, | ||
| 365 | ProgressListener progressListener, MappingSaveParameters saveParameters, boolean useMio) { | ||
| 366 | throw new UnsupportedOperationException("Not implemented"); | ||
| 367 | } | ||
| 328 | } | 368 | } |