Add support for loading mappings in reverse

--srg-in ^filename will load the mappings as if they were reversed.

This is a decoration on the filename instead of a separate command-
line option flag so it can apply to the particular mapping file,
when loading multiple mappings simultaneously.
This commit is contained in:
Agaricus 2013-02-21 18:51:13 -08:00
parent 87a5874745
commit 44de5cb247

View File

@ -94,14 +94,24 @@ public class JarMapping {
}
/**
* Load mappings given a (path) specification, optionally relocated
* through a suffix @oldpath1=newpath1,oldpath2=newpath2...
* Load mappings given a (path) specification, optionally:
* - reversed through a prefix '^'
* - relocated through a suffix '@oldpath1=newpath1,oldpath2=newpath2'...
*
* Intended for convenient command-line usage.
*/
public void loadMappings(String spec) throws IOException {
boolean reverse;
if (spec.startsWith("^")) {
reverse = true;
spec = spec.substring(1);
} else {
reverse = false;
}
if ((new File(spec)).isDirectory()) {
loadMappingsDir(new File(spec));
loadMappingsDir((new File(spec)), reverse);
return;
}
@ -119,13 +129,13 @@ public class JarMapping {
BufferedReader reader = new BufferedReader(new FileReader(path));
loadMappings(reader, inputTransformer, null);
loadMappings(reader, inputTransformer, null, reverse);
}
/**
* Load mappings from an MCP directory
*/
public void loadMappingsDir(File dir) throws IOException {
public void loadMappingsDir(File dir, boolean reverse) throws IOException {
if (!dir.isDirectory()) {
throw new IllegalArgumentException("loadMappingsDir("+dir+"): not a directory");
}
@ -173,17 +183,17 @@ public class JarMapping {
}
for (File srg : srgFiles) {
loadMappings(new BufferedReader(new FileReader(srg)), null, outputTransformer);
loadMappings(new BufferedReader(new FileReader(srg)), null, outputTransformer, reverse);
}
}
public void loadMappings(File file) throws IOException {
loadMappings(new BufferedReader(new FileReader(file)), null, null);
loadMappings(new BufferedReader(new FileReader(file)), null, null, false);
}
@Deprecated
public void loadMappings(BufferedReader reader, ShadeRelocationSimulator shader) throws IOException {
loadMappings(reader, (JarMappingLoadTransformer) shader, null);
loadMappings(reader, (JarMappingLoadTransformer) shader, null, false);
}
/**
@ -192,12 +202,16 @@ public class JarMapping {
* @param reader Mapping file reader
* @param inputTransformer Transformation to apply on input
* @param outputTransformer Transformation to apply on output
* @param reverse Swap input and output mappings (after applying any input/output transformations)
* @throws IOException
*/
public void loadMappings(BufferedReader reader, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer) throws IOException {
public void loadMappings(BufferedReader reader, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException {
if (inputTransformer == null) {
inputTransformer = ShadeRelocationSimulator.IDENTITY;
}
if (outputTransformer == null) {
outputTransformer = ShadeRelocationSimulator.IDENTITY;
}
String line;
while ((line = reader.readLine()) != null) {
@ -207,10 +221,10 @@ public class JarMapping {
if (line.contains(":")) {
// standard srg
parseSrgLine(line, inputTransformer, outputTransformer);
parseSrgLine(line, inputTransformer, outputTransformer, reverse);
} else {
// better 'compact' srg format
parseCsrgLine(line, inputTransformer, outputTransformer);
parseCsrgLine(line, inputTransformer, outputTransformer, reverse);
}
}
}
@ -218,7 +232,11 @@ public class JarMapping {
/**
* Parse a 'csrg' mapping format line and populate the data structures
*/
private void parseCsrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer) throws IOException {
private void parseCsrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException {
if (reverse) {
throw new IllegalArgumentException("csrg reversed not supported"); // TODO: reverse csg (need to lookup remapped classes)
}
String[] tokens = line.split(" ");
if (tokens.length == 2) {
@ -250,7 +268,7 @@ public class JarMapping {
/**
* Parse a standard 'srg' mapping format line and populate the data structures
*/
private void parseSrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer) throws IOException {
private void parseSrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException {
String[] tokens = line.split(" ");
String kind = tokens[0];
@ -258,6 +276,12 @@ public class JarMapping {
String oldClassName = inputTransformer.transformClassName(tokens[1]);
String newClassName = outputTransformer.transformClassName(tokens[2]);
if (reverse) {
String temp = newClassName;
newClassName = oldClassName;
oldClassName = temp;
}
if (classes.containsKey(oldClassName) && !newClassName.equals(classes.get(oldClassName))) {
throw new IllegalArgumentException("Duplicate class mapping: " + oldClassName + " -> " + newClassName +
" but already mapped to "+classes.get(oldClassName)+" in line="+line);
@ -268,6 +292,12 @@ public class JarMapping {
String oldPackageName = inputTransformer.transformClassName(tokens[1]);
String newPackageName = outputTransformer.transformClassName(tokens[2]);
if (reverse) {
String temp = newPackageName;
newPackageName = oldPackageName;
oldPackageName = temp;
}
if (packages.containsKey(oldPackageName) && !newPackageName.equals(packages.get(oldPackageName))) {
throw new IllegalArgumentException("Duplicate package mapping: " + oldPackageName + " ->" + newPackageName +
" but already mapped to "+packages.get(oldPackageName)+" in line="+line);
@ -288,15 +318,23 @@ public class JarMapping {
String oldClassName = inputTransformer.transformClassName(oldFull.substring(0, splitOld));
String oldFieldName = inputTransformer.transformFieldName(oldFull.substring(splitOld + 1));
//String newClassName = newFull.substring(0, splitNew); // redundant and ignored
String newClassName = newFull.substring(0, splitNew); // TODO: verify with existing class map? (only used for reverse)
String newFieldName = outputTransformer.transformFieldName(newFull.substring(splitNew + 1));
if (reverse) {
oldClassName = newClassName;
String temp = newFieldName;
newFieldName = oldFieldName;
oldFieldName = temp;
}
fields.put(oldClassName + "/" + oldFieldName, newFieldName);
} else if (kind.equals("MD:")) {
String oldFull = tokens[1];
String oldMethodDescriptor = inputTransformer.transformMethodDescriptor(tokens[2]);
String newFull = tokens[3];
//String newMethodDescriptor = outputTransformer.transformMethodDescriptor(tokens[4]); // redundant and ignored
String newMethodDescriptor = outputTransformer.transformMethodDescriptor(tokens[4]); // TODO: verify with existing class map? (only used for reverse)
// Split the qualified field names into their classes and actual names TODO: refactor with above
int splitOld = oldFull.lastIndexOf('/');
@ -308,9 +346,18 @@ public class JarMapping {
String oldClassName = inputTransformer.transformClassName(oldFull.substring(0, splitOld));
String oldMethodName = inputTransformer.transformMethodName(oldFull.substring(splitOld + 1));
//String newClassName = outputTransformer.transformClassName(newFull.substring(0, splitNew)); // redundant and ignored
String newClassName = outputTransformer.transformClassName(newFull.substring(0, splitNew)); // TODO: verify with existing class map? (only used for reverse)
String newMethodName = outputTransformer.transformMethodName(newFull.substring(splitNew + 1));
if (reverse) {
oldClassName = newClassName;
oldMethodDescriptor = newMethodDescriptor;
String temp = newMethodName;
newMethodName = oldMethodName;
oldMethodName = temp;
}
methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, newMethodName);
} else {
throw new IllegalArgumentException("Unable to parse srg file, unrecognized mapping type in line="+line);