diff options
author | shedaniel <daniel@shedaniel.me> | 2020-12-27 13:48:22 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2020-12-27 13:48:22 +0800 |
commit | e38ad19186e1d2dfaeabc2c11983574851d0452c (patch) | |
tree | 7676ad2c7de975e34465955882522855d68af6a7 /src/main/java/net/fabricmc/loom/util/srg | |
parent | 6647f77d95ba870e07adc83cc32ac78faf8415b6 (diff) | |
download | architectury-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.java | 45 |
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); + } + } } |