diff --git a/src/main/java/net/md_5/specialsource/CSVMappingTransformer.java b/src/main/java/net/md_5/specialsource/CSVMappingTransformer.java index ac91ec2..f88f40f 100644 --- a/src/main/java/net/md_5/specialsource/CSVMappingTransformer.java +++ b/src/main/java/net/md_5/specialsource/CSVMappingTransformer.java @@ -42,15 +42,34 @@ import java.util.Map; */ public class CSVMappingTransformer extends JarMappingLoadTransformer { - private final Map fieldMap; - private final Map methodMap; + private final Map fieldMap; // numeric srg name field_### -> descriptive csv name + private final Map methodMap; // numeric srg name func_### -> descriptive csv name + private final Map classPackageMap; // class src name -> repackaged full class name - public CSVMappingTransformer(File fieldsCsv, File methodsCsv) throws IOException { + public CSVMappingTransformer(File fieldsCsv, File methodsCsv, File packagesCsv) throws IOException { fieldMap = new HashMap(); methodMap = new HashMap(); readIntoMap(fieldsCsv, fieldMap); readIntoMap(methodsCsv, methodMap); + + if (packagesCsv.exists()) { + // repackaged (FML) + classPackageMap = new HashMap(); + + Map packages = new HashMap(); + readIntoMap(packagesCsv, packages); + + for (Map.Entry entry : packages.entrySet()) { + String classSimpleName = entry.getKey(); + String newPackageName = entry.getValue(); + + classPackageMap.put("net/minecraft/src/" + classSimpleName, newPackageName + "/" + classSimpleName); + } + } else { + // flat package (vanilla MCP) + classPackageMap = null; + } } private void readIntoMap(File file, Map map) throws IOException { @@ -62,16 +81,14 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { continue; } - if (line.length < 4) { + if (line.length < 2) { throw new IllegalArgumentException("Invalid csv line: " + line); } - String numericName = line[0]; - String descriptiveName = line[1]; - //String side = line[2]; - //String javadoc = line[3]; + String key = line[0]; + String value = line[1]; - map.put(numericName, descriptiveName); + map.put(key, value); } } @@ -84,4 +101,28 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { public String transformMethodName(String methodName) { return methodMap.get(methodName); } + + @Override + public String transformClassName(String className) { + if (classPackageMap == null) { + return className; + } + + String newPackage = classPackageMap.get(className); + if (newPackage == null) { + return className; + } + + return JarRemapper.mapTypeName(className, null, classPackageMap, className); + } + + @Override + public String transformMethodDescriptor(String oldDescriptor) { + if (classPackageMap == null) { + return oldDescriptor; + } + + MethodDescriptorTransformer methodDescriptorTransformer = new MethodDescriptorTransformer(null, classPackageMap); + return methodDescriptorTransformer.transform(oldDescriptor); + } } diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index 3790a98..baf0b4f 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -126,14 +126,15 @@ public class JarMapping { // Read output names through csv mappings, if available File fieldsCsv = new File(dir.getPath() + sep + "fields.csv"); File methodsCsv = new File(dir.getPath() + sep + "methods.csv"); + File packagesCsv = new File(dir.getPath() + sep + "packages.csv"); // FML repackaging, optional CSVMappingTransformer outputTransformer; if (fieldsCsv.exists() && methodsCsv.exists()) { // they want descriptive "csv" names - outputTransformer = new CSVMappingTransformer(fieldsCsv, methodsCsv); + outputTransformer = new CSVMappingTransformer(fieldsCsv, methodsCsv, packagesCsv); } else { - // they want numeric "srg" names, for some reason + // they want numeric "srg" names, for some reason (TODO: option to override) outputTransformer = null; }