diff options
| author | 2019-01-24 14:48:32 +0200 | |
|---|---|---|
| committer | 2019-01-24 13:48:32 +0100 | |
| commit | 00fcd0550fcdda621c2e4662f6ddd55ce673b931 (patch) | |
| tree | 6f9e4c24dbcc6d118fceec56adf7bf9d747a485c /src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java | |
| parent | mark as 0.13.0-SNAPSHOT for preliminary development (diff) | |
| download | enigma-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.java | 67 |
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 @@ | |||
| 12 | package cuchaz.enigma.analysis; | 12 | package cuchaz.enigma.analysis; |
| 13 | 13 | ||
| 14 | import com.google.common.collect.Sets; | 14 | import com.google.common.collect.Sets; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.analysis.index.JarIndex; |
| 16 | import cuchaz.enigma.mapping.*; | 16 | import cuchaz.enigma.analysis.index.ReferenceIndex; |
| 17 | import cuchaz.enigma.mapping.entry.Entry; | 17 | import cuchaz.enigma.translation.Translator; |
| 18 | import cuchaz.enigma.mapping.entry.MethodDefEntry; | 18 | import cuchaz.enigma.translation.mapping.EntryResolver; |
| 19 | import cuchaz.enigma.mapping.entry.MethodEntry; | 19 | import cuchaz.enigma.translation.representation.entry.Entry; |
| 20 | import cuchaz.enigma.translation.representation.entry.MethodDefEntry; | ||
| 21 | import cuchaz.enigma.translation.representation.entry.MethodEntry; | ||
| 20 | 22 | ||
| 21 | import javax.swing.tree.DefaultMutableTreeNode; | 23 | import javax.swing.tree.DefaultMutableTreeNode; |
| 22 | import javax.swing.tree.TreeNode; | 24 | import javax.swing.tree.TreeNode; |
| 25 | import java.util.ArrayList; | ||
| 26 | import java.util.Collection; | ||
| 23 | import java.util.Set; | 27 | import java.util.Set; |
| 24 | 28 | ||
| 25 | public class MethodReferenceTreeNode extends DefaultMutableTreeNode | 29 | public 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 | } |