Add full support for remapping packages with PK: in .srg

- Includes support for the default package, '.'
- Checks package mappings _after_ class mappings
This commit is contained in:
Agaricus 2013-05-30 20:28:46 -07:00
parent 8f87de55e4
commit 6640b89354
2 changed files with 58 additions and 17 deletions

View File

@ -266,6 +266,7 @@ public class JarMapping {
if (oldClassName.endsWith("/")) {
// Special case: mapping an entire hierarchy of classes
// TODO: support default package, '.' in .srg
packages.put(oldClassName.substring(0, oldClassName.length() - 1), newClassName);
} else {
classes.put(oldClassName, newClassName);
@ -319,23 +320,30 @@ public class JarMapping {
classes.put(oldClassName, newClassName);
}
} else if (kind.equals("PK:")) {
/* TODO: support .srg's package maps properly - not simply prefix matches(?)
String oldPackageName = inputTransformer.transformClassName(tokens[1]);
String newPackageName = outputTransformer.transformClassName(tokens[2]);
String oldPackageName = inputTransformer.transformClassName(tokens[1]);
String newPackageName = outputTransformer.transformClassName(tokens[2]);
if (reverse) {
String temp = newPackageName;
newPackageName = oldPackageName;
oldPackageName = temp;
}
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);
}
// package names always either 1) suffixed with '/', or 2) equal to '.' to signify default package
if (!newPackageName.equals(".") && !newPackageName.endsWith("/")) {
newPackageName += "/";
}
packages.put(oldPackageName, newPackageName);
*/
if (!oldPackageName.equals(".") && !oldPackageName.endsWith("/")) {
oldPackageName += "/";
}
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);
}
packages.put(oldPackageName, newPackageName);
} else if (kind.equals("FD:")) {
String oldFull = tokens[1];
String newFull = tokens[2];

View File

@ -101,19 +101,52 @@ public class JarRemapper extends Remapper {
* Helper method to map a class name by package (prefix) or class (exact)
*/
private static String mapClassName(String className, Map<String, String> packageMap, Map<String, String> classMap) {
if (classMap != null && classMap.containsKey(className)) {
return classMap.get(className);
}
if (packageMap != null) {
Iterator<String> iter = packageMap.keySet().iterator();
while (iter.hasNext()) {
String oldPackage = iter.next();
if (className.startsWith(oldPackage)) {
if (matchClassPackage(oldPackage, className)) {
String newPackage = packageMap.get(oldPackage);
return newPackage + className.substring(oldPackage.length());
return moveClassPackage(newPackage, getSimpleName(oldPackage, className));
}
}
}
return classMap != null ? classMap.get(className) : null;
return null;
}
private static boolean matchClassPackage(String packageName, String className) {
if (packageName.equals(".")) {
return isDefaultPackage(className);
}
return className.startsWith(packageName);
}
private static String moveClassPackage(String packageName, String classSimpleName) {
if (packageName.equals(".")) {
System.out.println("moveClassPackage(.) "+classSimpleName);
return classSimpleName;
}
return packageName + classSimpleName;
}
private static boolean isDefaultPackage(String className) {
return className.indexOf('/') == -1;
}
private static String getSimpleName(String oldPackage, String className) {
if (oldPackage.equals(".")) {
return className;
}
return className.substring(oldPackage.length());
}
@Override