summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar NebelNidas2024-04-10 14:13:33 +0200
committerGravatar GitHub2024-04-10 13:13:33 +0100
commitfba6b59d6d5c838f08d6cadb6a1e311dbc888474 (patch)
treeb62ae92ae571f523740d61e23155aa0bcdcb7118
parentInvert Mapping-IO Proguard mappings to mirror legacy behavior (#542) (diff)
downloadenigma-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.java21
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java44
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;
24import java.util.ArrayList; 24import java.util.ArrayList;
25import java.util.Collection; 25import java.util.Collection;
26import java.util.Collections; 26import java.util.Collections;
27import java.util.HashSet;
27import java.util.Objects; 28import java.util.Objects;
29import java.util.Set;
28import java.util.concurrent.atomic.AtomicInteger; 30import java.util.concurrent.atomic.AtomicInteger;
29import java.util.stream.Collectors; 31import java.util.stream.Collectors;
30import java.util.stream.Stream; 32import java.util.stream.Stream;
31 33
32import javax.annotation.Nonnull; 34import javax.annotation.Nonnull;
33 35
36import net.fabricmc.mappingio.MappingWriter;
37import net.fabricmc.mappingio.format.MappingFormat;
38import net.fabricmc.mappingio.tree.VisitOrder;
39import net.fabricmc.mappingio.tree.VisitableMappingTree;
40import org.jetbrains.annotations.ApiStatus;
41
34import cuchaz.enigma.ProgressListener; 42import cuchaz.enigma.ProgressListener;
35import cuchaz.enigma.translation.MappingTranslator; 43import cuchaz.enigma.translation.MappingTranslator;
36import cuchaz.enigma.translation.Translator; 44import cuchaz.enigma.translation.Translator;
@@ -41,10 +49,12 @@ import cuchaz.enigma.translation.mapping.VoidEntryResolver;
41import cuchaz.enigma.translation.mapping.serde.LfPrintWriter; 49import cuchaz.enigma.translation.mapping.serde.LfPrintWriter;
42import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; 50import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat;
43import cuchaz.enigma.translation.mapping.serde.MappingHelper; 51import cuchaz.enigma.translation.mapping.serde.MappingHelper;
52import cuchaz.enigma.translation.mapping.serde.MappingIoConverter;
44import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; 53import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
45import cuchaz.enigma.translation.mapping.serde.MappingsWriter; 54import cuchaz.enigma.translation.mapping.serde.MappingsWriter;
46import cuchaz.enigma.translation.mapping.tree.EntryTree; 55import cuchaz.enigma.translation.mapping.tree.EntryTree;
47import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; 56import cuchaz.enigma.translation.mapping.tree.EntryTreeNode;
57import cuchaz.enigma.translation.mapping.tree.HashEntryTree;
48import cuchaz.enigma.translation.representation.entry.ClassEntry; 58import cuchaz.enigma.translation.representation.entry.ClassEntry;
49import cuchaz.enigma.translation.representation.entry.Entry; 59import cuchaz.enigma.translation.representation.entry.Entry;
50import cuchaz.enigma.translation.representation.entry.FieldEntry; 60import 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}