Abstract inheritance lookup into IInheritanceProvider
This commit is contained in:
parent
06adbcdb63
commit
fa2089271a
@ -0,0 +1,12 @@
|
||||
package net.md_5.specialsource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IInheritanceProvider {
|
||||
/**
|
||||
* Get the superclass and implemented interfaces of a class
|
||||
* @param className
|
||||
* @return
|
||||
*/
|
||||
List<String> getParents(String className);
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package net.md_5.specialsource;
|
||||
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class JarInheritanceProvider implements IInheritanceProvider {
|
||||
private final Jar self;
|
||||
|
||||
public JarInheritanceProvider(Jar self) {
|
||||
this.self = self;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") // Saddens me to see ASM strip vital info like that
|
||||
public List<String> getParents(String owner) {
|
||||
List<String> parents = new ArrayList<String>();
|
||||
ClassNode node = self.getNode(owner);
|
||||
if (node != null) {
|
||||
for (String iface : (List<String>) node.interfaces) {
|
||||
parents.add(iface);
|
||||
}
|
||||
parents.add(node.superName);
|
||||
}
|
||||
return parents;
|
||||
}
|
||||
}
|
@ -47,12 +47,12 @@ import org.objectweb.asm.tree.ClassNode;
|
||||
public class JarRemapper extends Remapper {
|
||||
|
||||
private static final int CLASS_LEN = ".class".length();
|
||||
private final Jar self;
|
||||
private final IInheritanceProvider inheritanceProvider;
|
||||
private final JarMapping jarMapping;
|
||||
|
||||
private JarRemapper(JarMapping jarMapping, Jar self) throws IOException {
|
||||
private JarRemapper(JarMapping jarMapping, IInheritanceProvider inheritanceProvider) throws IOException {
|
||||
this.jarMapping = jarMapping;
|
||||
this.self = self;
|
||||
this.inheritanceProvider = inheritanceProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -91,21 +91,16 @@ public class JarRemapper extends Remapper {
|
||||
return mapped == null ? name : mapped;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") // Saddens me to see ASM strip vital info like that
|
||||
private String tryClimb(Map<String, String> map, NodeType type, String owner, String name) {
|
||||
String key = owner + "/" + name;
|
||||
|
||||
String mapped = map.get(key);
|
||||
if (mapped == null) {
|
||||
ClassNode node = self.getNode(owner);
|
||||
if (node != null) {
|
||||
for (String iface : (List<String>) node.interfaces) {
|
||||
mapped = tryClimb(map, type, iface, name);
|
||||
if (mapped != null) {
|
||||
return mapped;
|
||||
}
|
||||
for (String parent : inheritanceProvider.getParents(owner)) {
|
||||
mapped = tryClimb(map, type, parent, name);
|
||||
if (mapped != null) {
|
||||
return mapped;
|
||||
}
|
||||
return tryClimb(map, type, node.superName, name);
|
||||
}
|
||||
}
|
||||
return mapped;
|
||||
@ -120,7 +115,8 @@ public class JarRemapper extends Remapper {
|
||||
public static void renameJar(Jar jar, File target, JarMapping jarMapping) throws IOException {
|
||||
JarOutputStream out = new JarOutputStream(new FileOutputStream(target));
|
||||
try {
|
||||
JarRemapper self = new JarRemapper(jarMapping, jar);
|
||||
JarInheritanceProvider jarInheritanceProvider = new JarInheritanceProvider(jar);
|
||||
JarRemapper self = new JarRemapper(jarMapping, jarInheritanceProvider);
|
||||
if (jar == null) {
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user