From 2fc8ae770442ec3ab91cf0c16cc30917e0d048d3 Mon Sep 17 00:00:00 2001 From: Cuchaz Date: Mon, 30 Mar 2015 23:56:21 -0400 Subject: resolve methods using interfaces as well as superclasses --- src/cuchaz/enigma/analysis/JarIndex.java | 36 +++++++++++++++----------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'src/cuchaz/enigma/analysis/JarIndex.java') diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index e255468..6b3cf67 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java @@ -59,7 +59,6 @@ public class JarIndex { private Set m_obfClassEntries; private TranslationIndex m_translationIndex; - private Multimap m_interfaces; private Map m_access; private Multimap m_fields; private Multimap m_behaviors; @@ -74,7 +73,6 @@ public class JarIndex { public JarIndex() { m_obfClassEntries = Sets.newHashSet(); m_translationIndex = new TranslationIndex(); - m_interfaces = HashMultimap.create(); m_access = Maps.newHashMap(); m_fields = HashMultimap.create(); m_behaviors = HashMultimap.create(); @@ -124,7 +122,6 @@ public class JarIndex { if (className.equals(interfaceName)) { throw new IllegalArgumentException("Class cannot be its own interface! " + className); } - m_interfaces.put(className, interfaceName); } for (CtBehavior behavior : c.getDeclaredBehaviors()) { indexBehavior(behavior); @@ -176,7 +173,6 @@ public class JarIndex { } EntryRenamer.renameClassesInSet(renames, m_obfClassEntries); m_translationIndex.renameClasses(renames); - EntryRenamer.renameClassesInMultimap(renames, m_interfaces); EntryRenamer.renameClassesInMultimap(renames, m_methodImplementations); EntryRenamer.renameClassesInMultimap(renames, m_behaviorReferences); EntryRenamer.renameClassesInMultimap(renames, m_fieldReferences); @@ -637,11 +633,11 @@ public class JarIndex { interfaceMethodEntries.add(obfMethodEntry); } else { // get the interface class - for (String interfaceName : getInterfaces(obfMethodEntry.getClassName())) { + for (ClassEntry interfaceEntry : getInterfaces(obfMethodEntry.getClassName())) { // is this method defined in this interface? MethodEntry methodInterface = new MethodEntry( - new ClassEntry(interfaceName), + interfaceEntry, obfMethodEntry.getName(), obfMethodEntry.getSignature() ); @@ -745,31 +741,33 @@ public class JarIndex { return m_anonymousClasses.get(obfInnerClassName); } - public Set getInterfaces(String className) { - Set interfaceNames = new HashSet(); - interfaceNames.addAll(m_interfaces.get(className)); - for (ClassEntry ancestor : m_translationIndex.getAncestry(new ClassEntry(className))) { - interfaceNames.addAll(m_interfaces.get(ancestor.getName())); + public Set getInterfaces(String className) { + ClassEntry classEntry = new ClassEntry(className); + Set interfaces = new HashSet(); + interfaces.addAll(m_translationIndex.getInterfaces(classEntry)); + for (ClassEntry ancestor : m_translationIndex.getAncestry(classEntry)) { + interfaces.addAll(m_translationIndex.getInterfaces(ancestor)); } - return interfaceNames; + return interfaces; } public Set getImplementingClasses(String targetInterfaceName) { + // linear search is fast enough for now Set classNames = Sets.newHashSet(); - for (Map.Entry entry : m_interfaces.entries()) { - String className = entry.getKey(); - String interfaceName = entry.getValue(); - if (interfaceName.equals(targetInterfaceName)) { - classNames.add(className); - m_translationIndex.getSubclassNamesRecursively(classNames, new ClassEntry(className)); + for (Map.Entry entry : m_translationIndex.getClassInterfaces()) { + ClassEntry classEntry = entry.getKey(); + ClassEntry interfaceEntry = entry.getValue(); + if (interfaceEntry.getName().equals(targetInterfaceName)) { + classNames.add(classEntry.getClassName()); + m_translationIndex.getSubclassNamesRecursively(classNames, classEntry); } } return classNames; } public boolean isInterface(String className) { - return m_interfaces.containsValue(className); + return m_translationIndex.isInterface(new ClassEntry(className)); } public boolean containsObfClass(ClassEntry obfClassEntry) { -- cgit v1.2.3