Detect tsrg2

Signed-off-by: shedaniel <daniel@shedaniel.me>
This commit is contained in:
shedaniel
2021-07-11 01:51:43 +08:00
parent 6b7784c0b5
commit 0193cab83b
3 changed files with 85 additions and 6 deletions

View File

@@ -102,7 +102,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')

View File

@@ -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;
@@ -41,6 +43,12 @@ 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 +188,43 @@ public class MCPReader {
private Map<MemberToken, String> readSrg() throws IOException {
Map<MemberToken, String> 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<MemberToken, String> 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<String, String> intermediaryToSrgMap, Map<String, String[]> intermediaryToDocsMap, Map<String, Map<Integer, String>> intermediaryToParamsMap)
throws IOException, CsvValidationException {
Map<String, List<String>> srgToIntermediary = inverseMap(intermediaryToSrgMap);

View File

@@ -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,7 +81,7 @@ 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))) {
@@ -104,6 +111,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<String> namespaces, ClassMapping<?, ?> klass, Consumer<TinyClass> classConsumer, boolean lenient) {
String obf = klass.getFullObfuscatedName();
String srg = klass.getFullDeobfuscatedName();