md-5/SpecialSource

Package renaming inconsistency for T/CSRG mappings

Su5eD opened this issue · 1 comments

Su5eD commented

The Issue

Commit 147a04d introduced an update to JarMapping#parseCsrgLine that would remove the / suffix from old package names in CSRG mappings in order to comply with the mapped package names on bukkit, which did not have a trailing slash.

if (reverse) {
packages.put(newClassName, oldClassName.substring(0, oldClassName.length() - 1));
} else {
packages.put(oldClassName.substring(0, oldClassName.length() - 1), newClassName);
}

However, this causes an inconsistency in names that breaks renaming packages.

Normally, both old and new SRG package names are expected to have trailing slashes. This should apply to other SRG-based formats as well.

// package names always either 1) suffixed with '/', or 2) equal to '.' to signify default package

Reproduction

Remaping the class name com/example/foo/Main with any of the following TSRG lines will result in invalid class names:

  • com/example/foo/ com/example/bar/ -> com/example/bar//Main, expected: com/example/bar/Main
  • com/example/foo/ . -> /Main, expected: Main

Expected behavior

SpecialSource should be able to properly handle package names' trailing slashes for all SRG-based formats.

Proposed solution

Adding the existing trailing slash handler code from parseSrgLine to parseCsrgLine as well solves the issue. It's a simple and backwards-compatible solution.

if (!newPackageName.equals(".") && !newPackageName.endsWith("/")) {
newPackageName += "/";
}
if (!oldPackageName.equals(".") && !oldPackageName.endsWith("/")) {
oldPackageName += "/";
}

md-5 commented

Please open a PR?