diff options
| author | 2019-02-24 11:02:59 +0200 | |
|---|---|---|
| committer | 2019-02-24 11:02:59 +0200 | |
| commit | 809052b4ed5cf77d073617912878691f865d855f (patch) | |
| tree | 43a042350672a33a35a1a817553552e04bc57874 /src | |
| parent | Fix #110 and remap indices with matched bridge method names (diff) | |
| download | enigma-809052b4ed5cf77d073617912878691f865d855f.tar.gz enigma-809052b4ed5cf77d073617912878691f865d855f.tar.xz enigma-809052b4ed5cf77d073617912878691f865d855f.zip | |
Fix #81 -- validate renames across related classes
Diffstat (limited to 'src')
6 files changed, 41 insertions, 37 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index d7be1a9d..770520bb 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java | |||
| @@ -197,7 +197,11 @@ public class MenuBar extends JMenuBar { | |||
| 197 | JMenuItem search = new JMenuItem("Search"); | 197 | JMenuItem search = new JMenuItem("Search"); |
| 198 | search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); | 198 | search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); |
| 199 | menu.add(search); | 199 | menu.add(search); |
| 200 | search.addActionListener(event -> new SearchDialog(this.gui).show()); | 200 | search.addActionListener(event -> { |
| 201 | if (this.gui.getController().getDeobfuscator() != null) { | ||
| 202 | new SearchDialog(this.gui).show(); | ||
| 203 | } | ||
| 204 | }); | ||
| 201 | 205 | ||
| 202 | } | 206 | } |
| 203 | } | 207 | } |
diff --git a/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java b/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java index ed9f8202..8c4a3268 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java | |||
| @@ -28,7 +28,7 @@ public class EntryRemapper { | |||
| 28 | 28 | ||
| 29 | this.deobfuscator = new MappingTranslator(obfToDeobf, obfResolver); | 29 | this.deobfuscator = new MappingTranslator(obfToDeobf, obfResolver); |
| 30 | 30 | ||
| 31 | this.validator = new MappingValidator(obfToDeobf, deobfuscator, obfResolver); | 31 | this.validator = new MappingValidator(obfToDeobf, deobfuscator, jarIndex); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | public EntryRemapper(JarIndex jarIndex) { | 34 | public EntryRemapper(JarIndex jarIndex) { |
diff --git a/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java b/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java index 9be48c3a..a20c5028 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java | |||
| @@ -1,26 +1,30 @@ | |||
| 1 | package cuchaz.enigma.translation.mapping; | 1 | package cuchaz.enigma.translation.mapping; |
| 2 | 2 | ||
| 3 | import cuchaz.enigma.analysis.index.InheritanceIndex; | ||
| 4 | import cuchaz.enigma.analysis.index.JarIndex; | ||
| 3 | import cuchaz.enigma.throwables.IllegalNameException; | 5 | import cuchaz.enigma.throwables.IllegalNameException; |
| 4 | import cuchaz.enigma.translation.Translator; | 6 | import cuchaz.enigma.translation.Translator; |
| 5 | import cuchaz.enigma.translation.mapping.tree.EntryTree; | 7 | import cuchaz.enigma.translation.mapping.tree.EntryTree; |
| 8 | import cuchaz.enigma.translation.representation.entry.ClassEntry; | ||
| 6 | import cuchaz.enigma.translation.representation.entry.Entry; | 9 | import cuchaz.enigma.translation.representation.entry.Entry; |
| 7 | 10 | ||
| 8 | import java.util.Collection; | 11 | import java.util.Collection; |
| 12 | import java.util.HashSet; | ||
| 9 | import java.util.stream.Collectors; | 13 | import java.util.stream.Collectors; |
| 10 | 14 | ||
| 11 | public class MappingValidator { | 15 | public class MappingValidator { |
| 12 | private final EntryTree<EntryMapping> obfToDeobf; | 16 | private final EntryTree<EntryMapping> obfToDeobf; |
| 13 | private final Translator deobfuscator; | 17 | private final Translator deobfuscator; |
| 14 | private final EntryResolver entryResolver; | 18 | private final JarIndex index; |
| 15 | 19 | ||
| 16 | public MappingValidator(EntryTree<EntryMapping> obfToDeobf, Translator deobfuscator, EntryResolver entryResolver) { | 20 | public MappingValidator(EntryTree<EntryMapping> obfToDeobf, Translator deobfuscator, JarIndex index) { |
| 17 | this.obfToDeobf = obfToDeobf; | 21 | this.obfToDeobf = obfToDeobf; |
| 18 | this.deobfuscator = deobfuscator; | 22 | this.deobfuscator = deobfuscator; |
| 19 | this.entryResolver = entryResolver; | 23 | this.index = index; |
| 20 | } | 24 | } |
| 21 | 25 | ||
| 22 | public void validateRename(Entry<?> entry, String name) throws IllegalNameException { | 26 | public void validateRename(Entry<?> entry, String name) throws IllegalNameException { |
| 23 | Collection<Entry<?>> equivalentEntries = entryResolver.resolveEquivalentEntries(entry); | 27 | Collection<Entry<?>> equivalentEntries = index.getEntryResolver().resolveEquivalentEntries(entry); |
| 24 | for (Entry<?> equivalentEntry : equivalentEntries) { | 28 | for (Entry<?> equivalentEntry : equivalentEntries) { |
| 25 | equivalentEntry.validateName(name); | 29 | equivalentEntry.validateName(name); |
| 26 | validateUnique(equivalentEntry, name); | 30 | validateUnique(equivalentEntry, name); |
| @@ -28,19 +32,38 @@ public class MappingValidator { | |||
| 28 | } | 32 | } |
| 29 | 33 | ||
| 30 | private void validateUnique(Entry<?> entry, String name) { | 34 | private void validateUnique(Entry<?> entry, String name) { |
| 31 | Entry<?> translatedEntry = deobfuscator.translate(entry); | 35 | ClassEntry containingClass = entry.getContainingClass(); |
| 32 | Collection<Entry<?>> translatedSiblings = obfToDeobf.getSiblings(entry).stream() | 36 | Collection<ClassEntry> relatedClasses = getRelatedClasses(containingClass); |
| 33 | .map(deobfuscator::translate) | ||
| 34 | .collect(Collectors.toList()); | ||
| 35 | 37 | ||
| 36 | if (!isUnique(translatedEntry, translatedSiblings, name)) { | 38 | for (ClassEntry relatedClass : relatedClasses) { |
| 37 | throw new IllegalNameException(name, "Name is not unique in " + translatedEntry.getParent() + "!"); | 39 | Entry<?> relatedEntry = entry.replaceAncestor(containingClass, relatedClass); |
| 40 | Entry<?> translatedEntry = deobfuscator.translate(relatedEntry); | ||
| 41 | |||
| 42 | Collection<Entry<?>> translatedSiblings = obfToDeobf.getChildren(relatedClass).stream() | ||
| 43 | .filter(e -> !entry.equals(e)) | ||
| 44 | .map(deobfuscator::translate) | ||
| 45 | .collect(Collectors.toList()); | ||
| 46 | |||
| 47 | if (!isUnique(translatedEntry, translatedSiblings, name)) { | ||
| 48 | throw new IllegalNameException(name, "Name is not unique in " + translatedEntry.getParent() + "!"); | ||
| 49 | } | ||
| 38 | } | 50 | } |
| 39 | } | 51 | } |
| 40 | 52 | ||
| 53 | private Collection<ClassEntry> getRelatedClasses(ClassEntry classEntry) { | ||
| 54 | InheritanceIndex inheritanceIndex = index.getInheritanceIndex(); | ||
| 55 | |||
| 56 | Collection<ClassEntry> relatedClasses = new HashSet<>(); | ||
| 57 | relatedClasses.add(classEntry); | ||
| 58 | relatedClasses.addAll(inheritanceIndex.getChildren(classEntry)); | ||
| 59 | relatedClasses.addAll(inheritanceIndex.getAncestors(classEntry)); | ||
| 60 | |||
| 61 | return relatedClasses; | ||
| 62 | } | ||
| 63 | |||
| 41 | private boolean isUnique(Entry<?> entry, Collection<Entry<?>> siblings, String name) { | 64 | private boolean isUnique(Entry<?> entry, Collection<Entry<?>> siblings, String name) { |
| 42 | for (Entry<?> child : siblings) { | 65 | for (Entry<?> sibling : siblings) { |
| 43 | if (entry.canConflictWith(child) && child.getName().equals(name)) { | 66 | if (entry.canConflictWith(sibling) && sibling.getName().equals(name)) { |
| 44 | return false; | 67 | return false; |
| 45 | } | 68 | } |
| 46 | } | 69 | } |
diff --git a/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java b/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java index 255fa5fb..d8b1f50f 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java | |||
| @@ -55,11 +55,6 @@ public class DeltaTrackingTree<T> implements EntryTree<T> { | |||
| 55 | return delegate.getChildren(entry); | 55 | return delegate.getChildren(entry); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | @Override | ||
| 59 | public Collection<Entry<?>> getSiblings(Entry<?> entry) { | ||
| 60 | return delegate.getSiblings(entry); | ||
| 61 | } | ||
| 62 | |||
| 63 | @Nullable | 58 | @Nullable |
| 64 | @Override | 59 | @Override |
| 65 | public EntryTreeNode<T> findNode(Entry<?> entry) { | 60 | public EntryTreeNode<T> findNode(Entry<?> entry) { |
diff --git a/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java b/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java index daaefcc1..f919a393 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java | |||
| @@ -14,8 +14,6 @@ import java.util.stream.Stream; | |||
| 14 | public interface EntryTree<T> extends EntryMap<T>, Iterable<EntryTreeNode<T>>, Translatable { | 14 | public interface EntryTree<T> extends EntryMap<T>, Iterable<EntryTreeNode<T>>, Translatable { |
| 15 | Collection<Entry<?>> getChildren(Entry<?> entry); | 15 | Collection<Entry<?>> getChildren(Entry<?> entry); |
| 16 | 16 | ||
| 17 | Collection<Entry<?>> getSiblings(Entry<?> entry); | ||
| 18 | |||
| 19 | @Nullable | 17 | @Nullable |
| 20 | EntryTreeNode<T> findNode(Entry<?> entry); | 18 | EntryTreeNode<T> findNode(Entry<?> entry); |
| 21 | 19 | ||
diff --git a/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java b/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java index bb21de6f..02f2c04a 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java | |||
| @@ -73,22 +73,6 @@ public class HashEntryTree<T> implements EntryTree<T> { | |||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | @Override | 75 | @Override |
| 76 | public Collection<Entry<?>> getSiblings(Entry<?> entry) { | ||
| 77 | List<HashTreeNode<T>> path = computePath(entry, false); | ||
| 78 | if (path.size() <= 1) { | ||
| 79 | return getSiblings(entry, root.keySet()); | ||
| 80 | } | ||
| 81 | HashTreeNode<T> parent = path.get(path.size() - 2); | ||
| 82 | return getSiblings(entry, parent.getChildren()); | ||
| 83 | } | ||
| 84 | |||
| 85 | private Collection<Entry<?>> getSiblings(Entry<?> entry, Collection<Entry<?>> children) { | ||
| 86 | Set<Entry<?>> siblings = new HashSet<>(children); | ||
| 87 | siblings.remove(entry); | ||
| 88 | return siblings; | ||
| 89 | } | ||
| 90 | |||
| 91 | @Override | ||
| 92 | @Nullable | 76 | @Nullable |
| 93 | public HashTreeNode<T> findNode(Entry<?> target) { | 77 | public HashTreeNode<T> findNode(Entry<?> target) { |
| 94 | List<Entry<?>> parentChain = target.getAncestry(); | 78 | List<Entry<?>> parentChain = target.getAncestry(); |