diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index 03d0f40..63292cf 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -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]; diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index 147b66d..6ad3f4f 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -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 packageMap, Map classMap) { + if (classMap != null && classMap.containsKey(className)) { + return classMap.get(className); + } + if (packageMap != null) { Iterator 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