diff options
author | shedaniel <daniel@shedaniel.me> | 2021-01-08 11:38:49 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2021-01-08 11:38:49 +0800 |
commit | 0793ac224e470acda87723854cad43e24665a5e2 (patch) | |
tree | 6d5130f489645db0d379f98f997f23b90fa6d67a /src/main/java/net/fabricmc/loom/util/srg | |
parent | 16e5b39eba7e8a225d7a0f74fd5e22d127791640 (diff) | |
download | architectury-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.java | 56 |
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; + } +} |