aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/util/srg
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-01-08 11:38:49 +0800
committershedaniel <daniel@shedaniel.me>2021-01-08 11:38:49 +0800
commit0793ac224e470acda87723854cad43e24665a5e2 (patch)
tree6d5130f489645db0d379f98f997f23b90fa6d67a /src/main/java/net/fabricmc/loom/util/srg
parent16e5b39eba7e8a225d7a0f74fd5e22d127791640 (diff)
downloadarchitectury-loom-0793ac224e470acda87723854cad43e24665a5e2.tar.gz
architectury-loom-0793ac224e470acda87723854cad43e24665a5e2.tar.bz2
architectury-loom-0793ac224e470acda87723854cad43e24665a5e2.zip
Remap forge added inner classes correctly
Diffstat (limited to 'src/main/java/net/fabricmc/loom/util/srg')
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java
new file mode 100644
index 00000000..7d57f6fd
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java
@@ -0,0 +1,56 @@
+package net.fabricmc.loom.util.srg;
+
+import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.tinyremapper.IMappingProvider;
+import org.zeroturnaround.zip.ZipUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class InnerClassRemapper {
+ public static IMappingProvider of(Path fromJar, TinyTree mappingsWithSrg, String from, String to) throws IOException {
+ Map<String, String> map = buildInnerClassRemap(fromJar, mappingsWithSrg, from, to);
+ return sink -> {
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ sink.acceptClass(entry.getKey(), entry.getValue());
+ }
+ };
+ }
+
+ private static Map<String, String> buildInnerClassRemap(Path fromJar, TinyTree mappingsWithSrg, String from, String to) throws IOException {
+ Map<String, String> remapInnerClasses = new HashMap<>();
+
+ try (InputStream inputStream = Files.newInputStream(fromJar)) {
+ Set<String> availableClasses = mappingsWithSrg.getClasses().stream()
+ .map(classDef -> classDef.getName(from))
+ .collect(Collectors.toSet());
+ ZipUtil.iterate(inputStream, (in, zipEntry) -> {
+ if (!zipEntry.isDirectory() && zipEntry.getName().contains("$") && zipEntry.getName().endsWith(".class")) {
+ String className = zipEntry.getName().substring(0, zipEntry.getName().length() - 6);
+ if (!availableClasses.contains(className)) {
+ String parentName = className.substring(0, className.indexOf('$'));
+ String childName = className.substring(className.indexOf('$') + 1);
+ String remappedParentName = mappingsWithSrg.getClasses().stream()
+ .filter(classDef -> Objects.equals(classDef.getName(from), parentName))
+ .findFirst()
+ .map(classDef -> classDef.getName(to))
+ .orElse(parentName);
+ String remappedName = remappedParentName + "$" + childName;
+ if (!className.equals(remappedName)) {
+ remapInnerClasses.put(className, remappedName);
+ }
+ }
+ }
+ });
+ }
+
+ return remapInnerClasses;
+ }
+}