Remap AT method descriptor

This commit is contained in:
shedaniel
2020-12-27 13:48:22 +08:00
parent 6647f77d95
commit e38ad19186

View File

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