Skip to content

Commit 1edc1eb

Browse files
authored
Track mapping loading progress for the Enigma directory format (#577)
1 parent 87581ff commit 1edc1eb

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,11 @@ public EntryTree<EntryMapping> read(Path path, ProgressListener progressListener
9393
loadingMessage = I18n.translate("progress.mappings.loading_directory");
9494
}
9595

96-
progressListener.init(1, loadingMessage);
97-
9896
VisitableMappingTree mappingTree = new MemoryMappingTree();
99-
MappingReader.read(path, mappingIoCounterpart, mappingTree);
97+
ProgressTrackingMappingVisitor.trackLoadingProgress(mappingTree, path, this, progressListener, (visitor, totalWork) -> {
98+
progressListener.init(totalWork, loadingMessage);
99+
MappingReader.read(path, mappingIoCounterpart, visitor);
100+
});
100101
EntryTree<EntryMapping> mappings = MappingIoConverter.fromMappingIo(mappingTree, progressListener, index);
101102

102103
return this == PROGUARD ? MappingOperations.invert(mappings) : mappings;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package cuchaz.enigma.translation.mapping.serde;
2+
3+
import java.io.IOException;
4+
import java.nio.file.FileVisitResult;
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
import java.nio.file.SimpleFileVisitor;
8+
import java.nio.file.attribute.BasicFileAttributes;
9+
import java.util.HashSet;
10+
import java.util.Set;
11+
12+
import net.fabricmc.mappingio.MappedElementKind;
13+
import net.fabricmc.mappingio.MappingVisitor;
14+
import net.fabricmc.mappingio.adapter.ForwardingMappingVisitor;
15+
16+
import cuchaz.enigma.ProgressListener;
17+
18+
final class ProgressTrackingMappingVisitor extends ForwardingMappingVisitor {
19+
private final Set<String> classNames;
20+
private final ProgressListener progressListener;
21+
private int progress = 0;
22+
23+
ProgressTrackingMappingVisitor(MappingVisitor next, Set<String> classNames, ProgressListener progressListener) {
24+
super(next);
25+
this.classNames = classNames;
26+
this.progressListener = progressListener;
27+
}
28+
29+
@Override
30+
public void visitDstName(MappedElementKind targetKind, int namespace, String name) throws IOException {
31+
if (targetKind == MappedElementKind.CLASS && classNames.contains(name)) {
32+
progressListener.step(++progress, name);
33+
}
34+
35+
super.visitDstName(targetKind, namespace, name);
36+
}
37+
38+
static void trackLoadingProgress(MappingVisitor next, Path path, MappingFormat format, ProgressListener progressListener, VisitorWithProgressConsumer consumer) throws IOException {
39+
if (format != MappingFormat.ENIGMA_DIRECTORY) {
40+
consumer.accept(next, 1);
41+
}
42+
43+
Set<String> classNames = collectClassNames(path);
44+
consumer.accept(new ProgressTrackingMappingVisitor(next, classNames, progressListener), classNames.size());
45+
}
46+
47+
private static Set<String> collectClassNames(Path dir) throws IOException {
48+
Set<String> names = new HashSet<>();
49+
50+
Files.walkFileTree(dir, new SimpleFileVisitor<>() {
51+
@Override
52+
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
53+
// Matches the logic for finding files in mapping-io's EnigmaDirReader.
54+
String extension = "." + net.fabricmc.mappingio.format.MappingFormat.ENIGMA_FILE.fileExt;
55+
56+
if (file.getFileName().toString().endsWith(extension)) {
57+
String filePath = dir.relativize(file).toString().replace(dir.getFileSystem().getSeparator(), "/");
58+
String className = filePath.substring(0, filePath.length() - extension.length());
59+
names.add(className);
60+
}
61+
62+
return FileVisitResult.CONTINUE;
63+
}
64+
});
65+
66+
return names;
67+
}
68+
69+
@FunctionalInterface
70+
interface VisitorWithProgressConsumer {
71+
void accept(MappingVisitor visitor, int totalWork) throws IOException;
72+
}
73+
}

0 commit comments

Comments
 (0)