aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/util/srg
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-12-27 13:48:22 +0800
committershedaniel <daniel@shedaniel.me>2020-12-27 13:48:22 +0800
commite38ad19186e1d2dfaeabc2c11983574851d0452c (patch)
tree7676ad2c7de975e34465955882522855d68af6a7 /src/main/java/net/fabricmc/loom/util/srg
parent6647f77d95ba870e07adc83cc32ac78faf8415b6 (diff)
downloadarchitectury-loom-e38ad19186e1d2dfaeabc2c11983574851d0452c.tar.gz
architectury-loom-e38ad19186e1d2dfaeabc2c11983574851d0452c.tar.bz2
architectury-loom-e38ad19186e1d2dfaeabc2c11983574851d0452c.zip
Remap AT method descriptor
Diffstat (limited to 'src/main/java/net/fabricmc/loom/util/srg')
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
index 38b2a0a8..b08fdcb9 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
@@ -33,9 +33,11 @@ import org.zeroturnaround.zip.transform.StringZipEntryTransformer;
import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry;
import java.io.IOException;
+import java.io.StringReader;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.UnaryOperator;
import java.util.zip.ZipEntry;
/**
@@ -59,7 +61,7 @@ public final class AtRemapper {
continue;
}
- String[] parts = line.split(" ");
+ String[] parts = line.split("\\s+");
if (parts.length < 2) {
logger.warn("Invalid AT Line: " + line);
output.add(i, line);
@@ -70,6 +72,16 @@ public final class AtRemapper {
mappings.getClasses(),
def -> def.getName("srg").equals(name)
).map(def -> def.getName("named")).orElse(name).replace('/', '.');
+ if (parts.length >= 3) {
+ if (parts[2].contains("(")) {
+ parts[2] = parts[2].substring(0, parts[2].indexOf('(')) + remapDescriptor(parts[2].substring(parts[2].indexOf('(')), s -> {
+ return CollectionUtil.find(
+ mappings.getClasses(),
+ def -> def.getName("srg").equals(s)
+ ).map(def -> def.getName("named")).orElse(s);
+ });
+ }
+ }
output.add(i, String.join(" ", parts));
}
@@ -78,4 +90,35 @@ public final class AtRemapper {
}
}))});
}
+
+ private static String remapDescriptor(String original, UnaryOperator<String> classMappings) {
+ try {
+ StringReader reader = new StringReader(original);
+ StringBuilder result = new StringBuilder();
+ boolean insideClassName = false;
+ StringBuilder className = new StringBuilder();
+ while (true) {
+ int c = reader.read();
+ if (c == -1) {
+ break;
+ }
+ if ((char) c == ';') {
+ insideClassName = false;
+ result.append(classMappings.apply(className.toString()));
+ }
+ if (insideClassName) {
+ className.append((char) c);
+ } else {
+ result.append((char) c);
+ }
+ if (!insideClassName && (char) c == 'L') {
+ insideClassName = true;
+ className.setLength(0);
+ }
+ }
+ return result.toString();
+ } catch (IOException e) {
+ throw new AssertionError(e);
+ }
+ }
}