blob: 0c2dfd77a01362fbac8ab1364a4c1a1309bfaada (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package cuchaz.enigma.analysis;
import com.google.common.collect.Lists;
import cuchaz.enigma.analysis.index.JarIndex;
import cuchaz.enigma.translation.Translator;
import cuchaz.enigma.translation.mapping.EntryResolver;
import cuchaz.enigma.translation.mapping.ResolutionStrategy;
import cuchaz.enigma.translation.representation.entry.ClassEntry;
import cuchaz.enigma.translation.representation.entry.MethodEntry;
import java.util.Collection;
import java.util.List;
public class IndexTreeBuilder {
private final JarIndex index;
public IndexTreeBuilder(JarIndex index) {
this.index = index;
}
public ClassInheritanceTreeNode buildClassInheritance(Translator translator, ClassEntry obfClassEntry) {
// get the root node
List<String> ancestry = Lists.newArrayList();
ancestry.add(obfClassEntry.getFullName());
for (ClassEntry classEntry : index.getInheritanceIndex().getAncestors(obfClassEntry)) {
ancestry.add(classEntry.getFullName());
}
ClassInheritanceTreeNode rootNode = new ClassInheritanceTreeNode(translator, ancestry.get(ancestry.size() - 1));
// expand all children recursively
rootNode.load(index.getInheritanceIndex(), true);
return rootNode;
}
public ClassImplementationsTreeNode buildClassImplementations(Translator translator, ClassEntry obfClassEntry) {
if (index.getInheritanceIndex().isParent(obfClassEntry)) {
ClassImplementationsTreeNode node = new ClassImplementationsTreeNode(translator, obfClassEntry);
node.load(index);
return node;
}
return null;
}
public MethodInheritanceTreeNode buildMethodInheritance(Translator translator, MethodEntry obfMethodEntry) {
MethodEntry resolvedEntry = index.getEntryResolver().resolveFirstEntry(obfMethodEntry, ResolutionStrategy.RESOLVE_ROOT);
// make a root node at the base
MethodInheritanceTreeNode rootNode = new MethodInheritanceTreeNode(
translator, resolvedEntry,
index.getEntryIndex().hasMethod(resolvedEntry)
);
// expand the full tree
rootNode.load(index);
return rootNode;
}
public List<MethodImplementationsTreeNode> buildMethodImplementations(Translator translator, MethodEntry obfMethodEntry) {
EntryResolver resolver = index.getEntryResolver();
Collection<MethodEntry> resolvedEntries = resolver.resolveEntry(obfMethodEntry, ResolutionStrategy.RESOLVE_ROOT);
List<MethodImplementationsTreeNode> nodes = Lists.newArrayList();
for (MethodEntry resolvedEntry : resolvedEntries) {
MethodImplementationsTreeNode node = new MethodImplementationsTreeNode(translator, resolvedEntry);
node.load(index);
nodes.add(node);
}
return nodes;
}
}
|