diff --git a/src/main/java/net/md_5/specialsource/IInheritanceProvider.java b/src/main/java/net/md_5/specialsource/IInheritanceProvider.java new file mode 100644 index 0000000..6b11065 --- /dev/null +++ b/src/main/java/net/md_5/specialsource/IInheritanceProvider.java @@ -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 getParents(String className); +} diff --git a/src/main/java/net/md_5/specialsource/JarInheritanceProvider.java b/src/main/java/net/md_5/specialsource/JarInheritanceProvider.java new file mode 100644 index 0000000..a30f370 --- /dev/null +++ b/src/main/java/net/md_5/specialsource/JarInheritanceProvider.java @@ -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 getParents(String owner) { + List parents = new ArrayList(); + ClassNode node = self.getNode(owner); + if (node != null) { + for (String iface : (List) node.interfaces) { + parents.add(iface); + } + parents.add(node.superName); + } + return parents; + } +} diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index 3bfee91..f44cacc 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -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 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) 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; }