From 33d8d24d7e9c620ad75d59162de59627df1ebb2e Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 1 Jul 2013 10:39:19 +1000 Subject: [PATCH] Close issue #3 - static and private inheritance --- .../net/md_5/specialsource/JarComparer.java | 4 +-- .../net/md_5/specialsource/JarMapping.java | 25 +++++++++++-------- .../net/md_5/specialsource/JarRemapper.java | 8 +++--- .../java/net/md_5/specialsource/Ownable.java | 7 ++++++ .../specialsource/RemapperPreprocessor.java | 4 +-- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/md_5/specialsource/JarComparer.java b/src/main/java/net/md_5/specialsource/JarComparer.java index d6e43dc..8657e50 100644 --- a/src/main/java/net/md_5/specialsource/JarComparer.java +++ b/src/main/java/net/md_5/specialsource/JarComparer.java @@ -73,7 +73,7 @@ public class JarComparer extends ClassVisitor { @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - Ownable field = new Ownable(NodeType.FIELD, myName, name, desc); + Ownable field = new Ownable(NodeType.FIELD, myName, name, desc, access); fields.add(field); return null; // No need to get more info about a field! } @@ -82,7 +82,7 @@ public class JarComparer extends ClassVisitor { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // Check for initializers if (!name.equals("") && !name.equals("")) { - Ownable method = new Ownable(NodeType.METHOD, myName, name, desc); + Ownable method = new Ownable(NodeType.METHOD, myName, name, desc, access); methods.add(method); } // FIXME: Scan return types too! diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index c7bdac3..8301bbe 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -39,14 +39,15 @@ import net.md_5.specialsource.transformer.MethodDescriptor; import net.md_5.specialsource.transformer.ChainingTransformer; import net.md_5.specialsource.transformer.MappingTransformer; import java.io.*; +import java.lang.reflect.Modifier; import java.util.*; public class JarMapping { public final LinkedHashMap packages = new LinkedHashMap(); public final Map classes = new HashMap(); - public final Map fields = new HashMap(); - public final Map methods = new HashMap(); + public final Map fields = new HashMap(); + public final Map methods = new HashMap(); private InheritanceMap inheritanceMap = new InheritanceMap(); private InheritanceProvider fallbackInheritanceProvider = null; private Set excludedPackages = new HashSet(); @@ -90,10 +91,14 @@ public class JarMapping { return false; } - public String tryClimb(Map map, NodeType type, String owner, String name) { + public Ownable tryClimb(Map map, NodeType type, String owner, String name) { String key = owner + "/" + name; - String mapped = map.get(key); + Ownable mapped = map.get(key); + if (mapped != null && (Modifier.isPrivate(mapped.getAccess()) || Modifier.isStatic(mapped.getAccess()))) { + return null; + } + if (mapped == null) { Collection parents = null; @@ -295,13 +300,13 @@ public class JarMapping { String oldClassName = inputTransformer.transformClassName(tokens[0]); String oldFieldName = inputTransformer.transformFieldName(tokens[0], tokens[1]); String newFieldName = outputTransformer.transformFieldName(tokens[0], tokens[2]); - fields.put(oldClassName + "/" + oldFieldName, newFieldName); + fields.put(oldClassName + "/" + oldFieldName, new Ownable(NodeType.FIELD, newFieldName)); } else if (tokens.length == 4) { String oldClassName = inputTransformer.transformClassName(tokens[0]); String oldMethodName = inputTransformer.transformMethodName(tokens[0], tokens[1], tokens[2]); String oldMethodDescriptor = inputTransformer.transformMethodDescriptor(tokens[2]); String newMethodName = outputTransformer.transformMethodName(tokens[0], tokens[3], tokens[2]); - methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, newMethodName); + methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, new Ownable(NodeType.METHOD, newMethodName)); } else { throw new IOException("Invalid csrg file line, token count " + tokens.length + " unexpected in " + line); } @@ -404,7 +409,7 @@ public class JarMapping { return; } - fields.put(oldClassName + "/" + oldFieldName, newFieldName); + fields.put(oldClassName + "/" + oldFieldName, new Ownable(NodeType.FIELD, newFieldName)); } else if (kind.equals("MD:")) { String oldFull = tokens[1]; String newFull = tokens[3]; @@ -439,7 +444,7 @@ public class JarMapping { return; } - methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, newMethodName); + methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, new Ownable(NodeType.METHOD, newMethodName)); } else { throw new IllegalArgumentException("Unable to parse srg file, unrecognized mapping type in line=" + line); } @@ -482,7 +487,7 @@ public class JarMapping { Ownable oldField = oldJar.fields.get(i); Ownable newField = newJar.fields.get(i); String key = oldField.owner + "/" + oldField.name; - fields.put(key, newField.name); + fields.put(key, newField); if (full || !oldField.name.equals(newField.name)) { srgWriter.addFieldMap(oldField, newField); @@ -492,7 +497,7 @@ public class JarMapping { Ownable oldMethod = oldJar.methods.get(i); Ownable newMethod = newJar.methods.get(i); String key = oldMethod.owner + "/" + oldMethod.name + " " + oldMethod.descriptor; - methods.put(key, newMethod.name); + methods.put(key, newMethod); MethodDescriptor methodDescriptorTransformer = new MethodDescriptor(null, classes); String oldDescriptor = methodDescriptorTransformer.transform(oldMethod.descriptor); diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index 68c86fc..60723c7 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -150,14 +150,14 @@ public class JarRemapper extends Remapper { @Override public String mapFieldName(String owner, String name, String desc) { - String mapped = jarMapping.tryClimb(jarMapping.fields, NodeType.FIELD, owner, name); - return mapped == null ? name : mapped; + Ownable mapped = jarMapping.tryClimb(jarMapping.fields, NodeType.FIELD, owner, name); + return mapped == null ? name : mapped.name; } @Override public String mapMethodName(String owner, String name, String desc) { - String mapped = jarMapping.tryClimb(jarMapping.methods, NodeType.METHOD, owner, name + " " + desc); - return mapped == null ? name : mapped; + Ownable mapped = jarMapping.tryClimb(jarMapping.methods, NodeType.METHOD, owner, name + " " + desc); + return mapped == null ? name : mapped.name; } /** diff --git a/src/main/java/net/md_5/specialsource/Ownable.java b/src/main/java/net/md_5/specialsource/Ownable.java index 1366e69..e2799ad 100644 --- a/src/main/java/net/md_5/specialsource/Ownable.java +++ b/src/main/java/net/md_5/specialsource/Ownable.java @@ -29,16 +29,23 @@ package net.md_5.specialsource; import lombok.Data; +import lombok.RequiredArgsConstructor; /** * A class which can be used to represent a field, method, or anything else * which has an owner, a name and a descriptor. */ @Data +@RequiredArgsConstructor public class Ownable { public final NodeType type; public final String owner; public final String name; public final String descriptor; + public final int access; + + public Ownable(NodeType type, String name) { + this(type, null, name, null, -1); + } } diff --git a/src/main/java/net/md_5/specialsource/RemapperPreprocessor.java b/src/main/java/net/md_5/specialsource/RemapperPreprocessor.java index 215b0b0..1818b62 100644 --- a/src/main/java/net/md_5/specialsource/RemapperPreprocessor.java +++ b/src/main/java/net/md_5/specialsource/RemapperPreprocessor.java @@ -227,12 +227,12 @@ public class RemapperPreprocessor { } String className = ((Type) ldcClass.cst).getInternalName(); - String newName = jarMapping.tryClimb(jarMapping.fields, NodeType.FIELD, className, fieldName); + Ownable newName = jarMapping.tryClimb(jarMapping.fields, NodeType.FIELD, className, fieldName); logR("Remapping " + className + "/" + fieldName + " -> " + newName); if (newName != null) { // Change the string literal to the correct name - ldcField.cst = newName; + ldcField.cst = newName.name; //ldcClass.cst = className; // not remapped here - taken care of by JarRemapper } }