summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java
diff options
context:
space:
mode:
authorGravatar Gegy2019-01-24 14:48:32 +0200
committerGravatar Adrian Siekierka2019-01-24 13:48:32 +0100
commit00fcd0550fcdda621c2e4662f6ddd55ce673b931 (patch)
tree6f9e4c24dbcc6d118fceec56adf7bf9d747a485c /src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java
parentmark as 0.13.0-SNAPSHOT for preliminary development (diff)
downloadenigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.tar.gz
enigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.tar.xz
enigma-fork-00fcd0550fcdda621c2e4662f6ddd55ce673b931.zip
[WIP] Mapping rework (#91)
* Move packages * Mapping & entry refactor: first pass * Fix deobf -> obf tree remapping * Resolve various issues * Give all entries the potential for parents and treat inner classes as children * Deobf UI tree elements * Tests pass * Sort mapping output * Fix delta tracking * Index separation and first pass for #97 * Keep track of remapped jar index * Fix child entries not being remapped * Drop non-root entries * Track dropped mappings * Fix enigma mapping ordering * EntryTreeNode interface * Small tweaks * Naive full index remap on rename * Entries can resolve to more than one root entry * Support alternative resolution strategies * Bridge method resolution * Tests pass * Fix mappings being used where there are none * Fix methods with different descriptors being considered unique. closes #89
Diffstat (limited to 'src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java67
1 files changed, 40 insertions, 27 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java
index ac05acd..8995eb5 100644
--- a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java
+++ b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java
@@ -12,36 +12,36 @@
12package cuchaz.enigma.analysis; 12package cuchaz.enigma.analysis;
13 13
14import com.google.common.collect.Sets; 14import com.google.common.collect.Sets;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.analysis.index.JarIndex;
16import cuchaz.enigma.mapping.*; 16import cuchaz.enigma.analysis.index.ReferenceIndex;
17import cuchaz.enigma.mapping.entry.Entry; 17import cuchaz.enigma.translation.Translator;
18import cuchaz.enigma.mapping.entry.MethodDefEntry; 18import cuchaz.enigma.translation.mapping.EntryResolver;
19import cuchaz.enigma.mapping.entry.MethodEntry; 19import cuchaz.enigma.translation.representation.entry.Entry;
20import cuchaz.enigma.translation.representation.entry.MethodDefEntry;
21import cuchaz.enigma.translation.representation.entry.MethodEntry;
20 22
21import javax.swing.tree.DefaultMutableTreeNode; 23import javax.swing.tree.DefaultMutableTreeNode;
22import javax.swing.tree.TreeNode; 24import javax.swing.tree.TreeNode;
25import java.util.ArrayList;
26import java.util.Collection;
23import java.util.Set; 27import java.util.Set;
24 28
25public class MethodReferenceTreeNode extends DefaultMutableTreeNode 29public class MethodReferenceTreeNode extends DefaultMutableTreeNode implements ReferenceTreeNode<MethodEntry, MethodDefEntry> {
26 implements ReferenceTreeNode<MethodEntry, MethodDefEntry> {
27 30
28 private Translator deobfuscatingTranslator; 31 private final Translator translator;
29 private MethodEntry entry; 32 private MethodEntry entry;
30 private EntryReference<MethodEntry, MethodDefEntry> reference; 33 private EntryReference<MethodEntry, MethodDefEntry> reference;
31 private AccessFlags access;
32 34
33 public MethodReferenceTreeNode(Translator deobfuscatingTranslator, MethodEntry entry) { 35 public MethodReferenceTreeNode(Translator translator, MethodEntry entry) {
34 this.deobfuscatingTranslator = deobfuscatingTranslator; 36 this.translator = translator;
35 this.entry = entry; 37 this.entry = entry;
36 this.reference = null; 38 this.reference = null;
37 } 39 }
38 40
39 public MethodReferenceTreeNode(Translator deobfuscatingTranslator, 41 public MethodReferenceTreeNode(Translator translator, EntryReference<MethodEntry, MethodDefEntry> reference) {
40 EntryReference<MethodEntry, MethodDefEntry> reference, AccessFlags access) { 42 this.translator = translator;
41 this.deobfuscatingTranslator = deobfuscatingTranslator;
42 this.entry = reference.entry; 43 this.entry = reference.entry;
43 this.reference = reference; 44 this.reference = reference;
44 this.access = access;
45 } 45 }
46 46
47 @Override 47 @Override
@@ -57,21 +57,17 @@ public class MethodReferenceTreeNode extends DefaultMutableTreeNode
57 @Override 57 @Override
58 public String toString() { 58 public String toString() {
59 if (this.reference != null) { 59 if (this.reference != null) {
60 return String.format("%s (%s)", this.deobfuscatingTranslator.getTranslatedMethodDef(this.reference.context), 60 return String.format("%s", translator.translate(this.reference.context));
61 this.access);
62 } 61 }
63 return this.deobfuscatingTranslator.getTranslatedMethod(this.entry).getName(); 62 return translator.translate(this.entry).getName();
64 }
65
66 @Deprecated
67 public void load(JarIndex index, boolean recurse) {
68 load(index, recurse, false);
69 } 63 }
70 64
71 public void load(JarIndex index, boolean recurse, boolean recurseMethod) { 65 public void load(JarIndex index, boolean recurse, boolean recurseMethod) {
72 // get all the child nodes 66 // get all the child nodes
73 for (EntryReference<MethodEntry, MethodDefEntry> reference : index.getMethodsReferencing(this.entry, recurseMethod)) { 67 Collection<EntryReference<MethodEntry, MethodDefEntry>> references = getReferences(index, recurseMethod);
74 add(new MethodReferenceTreeNode(this.deobfuscatingTranslator, reference, index.getAccessFlags(this.entry))); 68
69 for (EntryReference<MethodEntry, MethodDefEntry> reference : references) {
70 add(new MethodReferenceTreeNode(translator, reference));
75 } 71 }
76 72
77 if (recurse && this.children != null) { 73 if (recurse && this.children != null) {
@@ -80,7 +76,7 @@ public class MethodReferenceTreeNode extends DefaultMutableTreeNode
80 MethodReferenceTreeNode node = (MethodReferenceTreeNode) child; 76 MethodReferenceTreeNode node = (MethodReferenceTreeNode) child;
81 77
82 // don't recurse into ancestor 78 // don't recurse into ancestor
83 Set<Entry> ancestors = Sets.newHashSet(); 79 Set<Entry<?>> ancestors = Sets.newHashSet();
84 TreeNode n = node; 80 TreeNode n = node;
85 while (n.getParent() != null) { 81 while (n.getParent() != null) {
86 n = n.getParent(); 82 n = n.getParent();
@@ -92,9 +88,26 @@ public class MethodReferenceTreeNode extends DefaultMutableTreeNode
92 continue; 88 continue;
93 } 89 }
94 90
95 node.load(index, true); 91 node.load(index, true, false);
96 } 92 }
97 } 93 }
98 } 94 }
99 } 95 }
96
97 private Collection<EntryReference<MethodEntry, MethodDefEntry>> getReferences(JarIndex index, boolean recurseMethod) {
98 ReferenceIndex referenceIndex = index.getReferenceIndex();
99
100 if (recurseMethod) {
101 Collection<EntryReference<MethodEntry, MethodDefEntry>> references = new ArrayList<>();
102
103 EntryResolver entryResolver = index.getEntryResolver();
104 for (MethodEntry methodEntry : entryResolver.resolveEquivalentMethods(entry)) {
105 references.addAll(referenceIndex.getReferencesToMethod(methodEntry));
106 }
107
108 return references;
109 } else {
110 return referenceIndex.getReferencesToMethod(entry);
111 }
112 }
100} 113}