From 1212e56d9ccf6e6025cba3b5bbd8175e45c1ac27 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 5 Jun 2021 01:55:26 +0800 Subject: [PATCH] Detect tsrg2 Signed-off-by: shedaniel --- build.gradle | 4 +- .../net/fabricmc/loom/util/srg/MCPReader.java | 77 +++++++++++-------- .../net/fabricmc/loom/util/srg/SrgMerger.java | 51 ++++++++++-- 3 files changed, 92 insertions(+), 40 deletions(-) diff --git a/build.gradle b/build.gradle index fa862d82..dff5e013 100644 --- a/build.gradle +++ b/build.gradle @@ -91,7 +91,7 @@ dependencies { // tinyfile management implementation ('dev.architectury:tiny-remapper:1.1.0') - implementation ('dev.architectury:mappings-layers-core:1.1.6') + implementation ('dev.architectury:mappings-layers-core:1.2.7') implementation ('net.fabricmc:tiny-mappings-parser:0.3.0+build.17') implementation 'net.fabricmc:access-widener:1.0.0' @@ -116,7 +116,7 @@ dependencies { implementation ('net.minecraftforge:binarypatcher:1.1.1') implementation ('org.cadixdev:lorenz:0.5.3') implementation ('org.cadixdev:lorenz-asm:0.5.3') - implementation ('net.minecraftforge:accesstransformers:2.2.0') + implementation ('net.minecraftforge:accesstransformers:3.0.1') implementation ('de.oceanlabs.mcp:mcinjector:3.8.0') implementation ('com.opencsv:opencsv:5.4') diff --git a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java index bdb22d73..e0b4ed5b 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java +++ b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java @@ -24,7 +24,9 @@ package net.fabricmc.loom.util.srg; +import java.io.BufferedReader; import java.io.IOException; +import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; @@ -35,12 +37,17 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; +import dev.architectury.mappingslayers.api.mutable.MutableClassDef; +import dev.architectury.mappingslayers.api.mutable.MutableFieldDef; +import dev.architectury.mappingslayers.api.mutable.MutableMethodDef; +import dev.architectury.mappingslayers.api.mutable.MutableTinyTree; +import dev.architectury.mappingslayers.api.utils.MappingsUtils; +import org.apache.commons.io.IOUtils; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.lorenz.io.srg.tsrg.TSrgReader; import org.cadixdev.lorenz.model.ClassMapping; @@ -180,17 +187,43 @@ public class MCPReader { private Map readSrg() throws IOException { Map tokens = new HashMap<>(); - try (TSrgReader reader = new TSrgReader(Files.newBufferedReader(srgTsrgPath, StandardCharsets.UTF_8))) { - MappingSet mappingSet = reader.read(); + try (BufferedReader reader = Files.newBufferedReader(srgTsrgPath, StandardCharsets.UTF_8)) { + String content = IOUtils.toString(reader); - for (TopLevelClassMapping classMapping : mappingSet.getTopLevelClassMappings()) { - appendClass(tokens, classMapping); + if (content.startsWith("tsrg2")) { + readTsrg2(tokens, content); + } else { + MappingSet mappingSet = new TSrgReader(new StringReader(content)).read(); + + for (TopLevelClassMapping classMapping : mappingSet.getTopLevelClassMappings()) { + appendClass(tokens, classMapping); + } } } return tokens; } + private void readTsrg2(Map tokens, String content) { + MutableTinyTree tree = MappingsUtils.deserializeFromTsrg2(content); + int obfIndex = tree.getMetadata().index("obf"); + int srgIndex = tree.getMetadata().index("srg"); + + for (MutableClassDef classDef : tree.getClassesMutable()) { + MemberToken ofClass = MemberToken.ofClass(classDef.getName(obfIndex)); + tokens.put(ofClass, classDef.getName(srgIndex)); + + for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) { + tokens.put(MemberToken.ofField(ofClass, fieldDef.getName(obfIndex)), fieldDef.getName(srgIndex)); + } + + for (MutableMethodDef methodDef : classDef.getMethodsMutable()) { + tokens.put(MemberToken.ofMethod(ofClass, methodDef.getName(obfIndex), methodDef.getDescriptor(obfIndex)), + methodDef.getName(srgIndex)); + } + } + } + private void injectMcp(Path mcpJar, Map intermediaryToSrgMap, Map intermediaryToDocsMap, Map> intermediaryToParamsMap) throws IOException, CsvValidationException { Map> srgToIntermediary = inverseMap(intermediaryToSrgMap); @@ -304,21 +337,12 @@ public class MCPReader { } } - private static class MemberToken { - private final TokenType type; - @Nullable - private final MemberToken owner; - private final String name; - @Nullable - private final String descriptor; - - MemberToken(TokenType type, @Nullable MemberToken owner, String name, @Nullable String descriptor) { - this.type = type; - this.owner = owner; - this.name = name; - this.descriptor = descriptor; - } - + private record MemberToken( + TokenType type, + @Nullable MCPReader.MemberToken owner, + String name, + @Nullable String descriptor + ) { static MemberToken ofClass(String name) { return new MemberToken(TokenType.CLASS, null, name, null); } @@ -330,19 +354,6 @@ public class MCPReader { static MemberToken ofMethod(MemberToken owner, String name, String descriptor) { return new MemberToken(TokenType.METHOD, owner, name, descriptor); } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MemberToken that = (MemberToken) o; - return type == that.type && name.equals(that.name) && Objects.equals(descriptor, that.descriptor) && Objects.equals(owner, that.owner); - } - - @Override - public int hashCode() { - return Objects.hash(type, name, descriptor, owner); - } } private enum TokenType { diff --git a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java index 9f9fbe7d..cfaa34f7 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java +++ b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java @@ -26,6 +26,7 @@ package net.fabricmc.loom.util.srg; import java.io.BufferedReader; import java.io.IOException; +import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -34,6 +35,12 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; +import dev.architectury.mappingslayers.api.mutable.MutableClassDef; +import dev.architectury.mappingslayers.api.mutable.MutableFieldDef; +import dev.architectury.mappingslayers.api.mutable.MutableMethodDef; +import dev.architectury.mappingslayers.api.mutable.MutableTinyTree; +import dev.architectury.mappingslayers.api.utils.MappingsUtils; +import org.apache.commons.io.IOUtils; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.lorenz.io.srg.tsrg.TSrgReader; import org.cadixdev.lorenz.model.ClassMapping; @@ -74,13 +81,9 @@ public final class SrgMerger { * or if an element mentioned in the SRG file does not have tiny mappings */ public static void mergeSrg(Path srg, Path tiny, Path out, boolean lenient) throws IOException, MappingException { - MappingSet arr; + MappingSet arr = readSrg(srg); TinyTree foss; - try (TSrgReader reader = new TSrgReader(Files.newBufferedReader(srg))) { - arr = reader.read(); - } - try (BufferedReader reader = Files.newBufferedReader(tiny)) { foss = TinyMappingFactory.loadWithDetection(reader); } @@ -104,6 +107,44 @@ public final class SrgMerger { TinyV2Writer.write(file, out); } + private static MappingSet readSrg(Path srg) throws IOException { + try (BufferedReader reader = Files.newBufferedReader(srg)) { + String content = IOUtils.toString(reader); + + if (content.startsWith("tsrg2")) { + return readTsrg2(content); + } else { + try (TSrgReader srgReader = new TSrgReader(new StringReader(content))) { + return srgReader.read(); + } + } + } + } + + private static MappingSet readTsrg2(String content) { + MappingSet set = MappingSet.create(); + MutableTinyTree tree = MappingsUtils.deserializeFromTsrg2(content); + int obfIndex = tree.getMetadata().index("obf"); + int srgIndex = tree.getMetadata().index("srg"); + + for (MutableClassDef classDef : tree.getClassesMutable()) { + ClassMapping classMapping = set.getOrCreateClassMapping(classDef.getName(obfIndex)); + classMapping.setDeobfuscatedName(classDef.getName(srgIndex)); + + for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) { + FieldMapping fieldMapping = classMapping.getOrCreateFieldMapping(fieldDef.getName(obfIndex)); + fieldMapping.setDeobfuscatedName(fieldDef.getName(srgIndex)); + } + + for (MutableMethodDef methodDef : classDef.getMethodsMutable()) { + MethodMapping methodMapping = classMapping.getOrCreateMethodMapping(methodDef.getName(obfIndex), methodDef.getDescriptor(obfIndex)); + methodMapping.setDeobfuscatedName(methodDef.getName(srgIndex)); + } + } + + return set; + } + private static void classToTiny(TinyTree foss, List namespaces, ClassMapping klass, Consumer classConsumer, boolean lenient) { String obf = klass.getFullObfuscatedName(); String srg = klass.getFullDeobfuscatedName();