mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-04-02 05:27:43 -05:00
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user