From e38ad19186e1d2dfaeabc2c11983574851d0452c Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 27 Dec 2020 13:48:22 +0800 Subject: [PATCH] Remap AT method descriptor --- .../fabricmc/loom/util/srg/AtRemapper.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) 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 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); + } + } }