summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/analysis
diff options
context:
space:
mode:
authorGravatar asie2018-11-07 20:18:50 +0100
committerGravatar asie2018-11-07 20:18:50 +0100
commitbe22b07ae28cd8de11e3a32c3766aed6966ec6b5 (patch)
tree97f8db1c2bcb129fe4af262bf3df959dd8f97711 /src/main/java/cuchaz/enigma/analysis
parentunify local variable/argument numbering (diff)
downloadenigma-fork-be22b07ae28cd8de11e3a32c3766aed6966ec6b5.tar.gz
enigma-fork-be22b07ae28cd8de11e3a32c3766aed6966ec6b5.tar.xz
enigma-fork-be22b07ae28cd8de11e3a32c3766aed6966ec6b5.zip
update Guava, show proper constructor tree node, fix AccessFlags.toString
Diffstat (limited to 'src/main/java/cuchaz/enigma/analysis')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java96
-rw-r--r--src/main/java/cuchaz/enigma/analysis/JarIndex.java13
2 files changed, 108 insertions, 1 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}
diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java
index f6338a2..158df4b 100644
--- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java
+++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java
@@ -30,6 +30,7 @@ public class JarIndex {
30 private Multimap<ClassEntry, MethodDefEntry> methods; 30 private Multimap<ClassEntry, MethodDefEntry> methods;
31 private Multimap<String, MethodDefEntry> methodImplementations; 31 private Multimap<String, MethodDefEntry> methodImplementations;
32 private Multimap<MethodEntry, EntryReference<MethodEntry, MethodDefEntry>> methodsReferencing; 32 private Multimap<MethodEntry, EntryReference<MethodEntry, MethodDefEntry>> methodsReferencing;
33 private Multimap<ClassEntry, EntryReference<ClassEntry, MethodDefEntry>> methodsReferencingClasses;
33 private Multimap<MethodEntry, MethodEntry> methodReferences; 34 private Multimap<MethodEntry, MethodEntry> methodReferences;
34 private Multimap<FieldEntry, EntryReference<FieldEntry, MethodDefEntry>> fieldReferences; 35 private Multimap<FieldEntry, EntryReference<FieldEntry, MethodDefEntry>> fieldReferences;
35 private Multimap<ClassEntry, ClassEntry> innerClassesByOuter; 36 private Multimap<ClassEntry, ClassEntry> innerClassesByOuter;
@@ -45,6 +46,7 @@ public class JarIndex {
45 this.fields = HashMultimap.create(); 46 this.fields = HashMultimap.create();
46 this.methods = HashMultimap.create(); 47 this.methods = HashMultimap.create();
47 this.methodImplementations = HashMultimap.create(); 48 this.methodImplementations = HashMultimap.create();
49 this.methodsReferencingClasses = HashMultimap.create();
48 this.methodsReferencing = HashMultimap.create(); 50 this.methodsReferencing = HashMultimap.create();
49 this.methodReferences = HashMultimap.create(); 51 this.methodReferences = HashMultimap.create();
50 this.fieldReferences = HashMultimap.create(); 52 this.fieldReferences = HashMultimap.create();
@@ -93,6 +95,7 @@ public class JarIndex {
93 EntryRenamer.renameClassesInSet(renames, this.obfClassEntries); 95 EntryRenamer.renameClassesInSet(renames, this.obfClassEntries);
94 this.translationIndex.renameClasses(renames); 96 this.translationIndex.renameClasses(renames);
95 EntryRenamer.renameClassesInMultimap(renames, this.methodImplementations); 97 EntryRenamer.renameClassesInMultimap(renames, this.methodImplementations);
98 EntryRenamer.renameClassesInMultimap(renames, this.methodsReferencingClasses);
96 EntryRenamer.renameClassesInMultimap(renames, this.methodsReferencing); 99 EntryRenamer.renameClassesInMultimap(renames, this.methodsReferencing);
97 EntryRenamer.renameClassesInMultimap(renames, this.methodReferences); 100 EntryRenamer.renameClassesInMultimap(renames, this.methodReferences);
98 EntryRenamer.renameClassesInMultimap(renames, this.fieldReferences); 101 EntryRenamer.renameClassesInMultimap(renames, this.fieldReferences);
@@ -136,12 +139,16 @@ public class JarIndex {
136 } 139 }
137 140
138 protected void indexMethodCall(MethodDefEntry callerEntry, String owner, String name, String desc) { 141 protected void indexMethodCall(MethodDefEntry callerEntry, String owner, String name, String desc) {
139 MethodEntry referencedMethod = new MethodEntry(entryPool.getClass(owner), name, new MethodDescriptor(desc)); 142 ClassEntry referencedClass = entryPool.getClass(owner);
143 MethodEntry referencedMethod = new MethodEntry(referencedClass, name, new MethodDescriptor(desc));
140 ClassEntry resolvedClassEntry = translationIndex.resolveEntryOwner(referencedMethod); 144 ClassEntry resolvedClassEntry = translationIndex.resolveEntryOwner(referencedMethod);
141 if (resolvedClassEntry != null && !resolvedClassEntry.equals(referencedMethod.getOwnerClassEntry())) { 145 if (resolvedClassEntry != null && !resolvedClassEntry.equals(referencedMethod.getOwnerClassEntry())) {
142 referencedMethod = referencedMethod.updateOwnership(resolvedClassEntry); 146 referencedMethod = referencedMethod.updateOwnership(resolvedClassEntry);
143 } 147 }
144 methodsReferencing.put(referencedMethod, new EntryReference<>(referencedMethod, referencedMethod.getName(), callerEntry)); 148 methodsReferencing.put(referencedMethod, new EntryReference<>(referencedMethod, referencedMethod.getName(), callerEntry));
149 if (referencedMethod.isConstructor()) {
150 methodsReferencingClasses.put(referencedClass, new EntryReference<>(referencedClass, referencedMethod.getName(), callerEntry));
151 }
145 methodReferences.put(callerEntry, referencedMethod); 152 methodReferences.put(callerEntry, referencedMethod);
146 } 153 }
147 154
@@ -421,6 +428,10 @@ public class JarIndex {
421 return fieldEntries; 428 return fieldEntries;
422 } 429 }
423 430
431 public Collection<EntryReference<ClassEntry, MethodDefEntry>> getMethodsReferencing(ClassEntry classEntry) {
432 return this.methodsReferencingClasses.get(classEntry);
433 }
434
424 public Collection<EntryReference<MethodEntry, MethodDefEntry>> getMethodsReferencing(MethodEntry methodEntry) { 435 public Collection<EntryReference<MethodEntry, MethodDefEntry>> getMethodsReferencing(MethodEntry methodEntry) {
425 return this.methodsReferencing.get(methodEntry); 436 return this.methodsReferencing.get(methodEntry);
426 } 437 }