Detect tsrg2

Signed-off-by: shedaniel <daniel@shedaniel.me>
This commit is contained in:
shedaniel
2021-06-05 01:55:26 +08:00
parent 58347914b5
commit 1212e56d9c
3 changed files with 92 additions and 40 deletions

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;
@@ -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<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);
@@ -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 {

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