summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java
new file mode 100644
index 0000000..ff5f2e9
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java
@@ -0,0 +1,96 @@
1/*******************************************************************************
2 * Copyright (c) 2015 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Lesser General Public
5 * License v3.0 which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/lgpl.html
7 * <p>
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11
12package cuchaz.enigma.analysis;
13
14import com.google.common.collect.Sets;
15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.Translator;
17import cuchaz.enigma.mapping.entry.ClassEntry;
18import cuchaz.enigma.mapping.entry.Entry;
19import cuchaz.enigma.mapping.entry.MethodDefEntry;
20import cuchaz.enigma.mapping.entry.MethodEntry;
21
22import javax.swing.tree.DefaultMutableTreeNode;
23import javax.swing.tree.TreeNode;
24import java.util.Set;
25
26public class ClassReferenceTreeNode extends DefaultMutableTreeNode
27 implements ReferenceTreeNode<ClassEntry, MethodDefEntry> {
28
29 private Translator deobfuscatingTranslator;
30 private ClassEntry entry;
31 private EntryReference<ClassEntry, MethodDefEntry> reference;
32 private AccessFlags access;
33
34 public ClassReferenceTreeNode(Translator deobfuscatingTranslator, ClassEntry entry) {
35 this.deobfuscatingTranslator = deobfuscatingTranslator;
36 this.entry = entry;
37 this.reference = null;
38 }
39
40 public ClassReferenceTreeNode(Translator deobfuscatingTranslator,
41 EntryReference<ClassEntry, MethodDefEntry> reference, AccessFlags access) {
42 this.deobfuscatingTranslator = deobfuscatingTranslator;
43 this.entry = reference.entry;
44 this.reference = reference;
45 this.access = access;
46 }
47
48 @Override
49 public ClassEntry getEntry() {
50 return this.entry;
51 }
52
53 @Override
54 public EntryReference<ClassEntry, MethodDefEntry> getReference() {
55 return this.reference;
56 }
57
58 @Override
59 public String toString() {
60 if (this.reference != null) {
61 return String.format("%s (%s)", this.deobfuscatingTranslator.getTranslatedMethodDef(this.reference.context),
62 this.access);
63 }
64 return this.deobfuscatingTranslator.getTranslatedClass(this.entry).getName();
65 }
66
67 public void load(JarIndex index, boolean recurse) {
68 // get all the child nodes
69 for (EntryReference<ClassEntry, MethodDefEntry> reference : index.getMethodsReferencing(this.entry)) {
70 add(new ClassReferenceTreeNode(this.deobfuscatingTranslator, reference, index.getAccessFlags(this.entry)));
71 }
72
73 if (recurse && this.children != null) {
74 for (Object child : this.children) {
75 if (child instanceof ClassReferenceTreeNode) {
76 ClassReferenceTreeNode node = (ClassReferenceTreeNode) child;
77
78 // don't recurse into ancestor
79 Set<Entry> ancestors = Sets.newHashSet();
80 TreeNode n = node;
81 while (n.getParent() != null) {
82 n = n.getParent();
83 if (n instanceof ClassReferenceTreeNode) {
84 ancestors.add(((ClassReferenceTreeNode) n).getEntry());
85 }
86 }
87 if (ancestors.contains(node.getEntry())) {
88 continue;
89 }
90
91 node.load(index, true);
92 }
93 }
94 }
95 }
96}