From 809052b4ed5cf77d073617912878691f865d855f Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sun, 24 Feb 2019 11:02:59 +0200 Subject: Fix #81 -- validate renames across related classes --- .../java/cuchaz/enigma/gui/elements/MenuBar.java | 6 ++- .../enigma/translation/mapping/EntryRemapper.java | 2 +- .../translation/mapping/MappingValidator.java | 47 ++++++++++++++++------ .../mapping/tree/DeltaTrackingTree.java | 5 --- .../enigma/translation/mapping/tree/EntryTree.java | 2 - .../translation/mapping/tree/HashEntryTree.java | 16 -------- 6 files changed, 41 insertions(+), 37 deletions(-) (limited to 'src/main/java/cuchaz') diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index d7be1a9..770520b 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 { JMenuItem search = new JMenuItem("Search"); search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); menu.add(search); - search.addActionListener(event -> new SearchDialog(this.gui).show()); + search.addActionListener(event -> { + if (this.gui.getController().getDeobfuscator() != null) { + new SearchDialog(this.gui).show(); + } + }); } } diff --git a/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java b/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java index ed9f820..8c4a326 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 { this.deobfuscator = new MappingTranslator(obfToDeobf, obfResolver); - this.validator = new MappingValidator(obfToDeobf, deobfuscator, obfResolver); + this.validator = new MappingValidator(obfToDeobf, deobfuscator, jarIndex); } 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 9be48c3..a20c502 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 @@ package cuchaz.enigma.translation.mapping; +import cuchaz.enigma.analysis.index.InheritanceIndex; +import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.Entry; import java.util.Collection; +import java.util.HashSet; import java.util.stream.Collectors; public class MappingValidator { private final EntryTree obfToDeobf; private final Translator deobfuscator; - private final EntryResolver entryResolver; + private final JarIndex index; - public MappingValidator(EntryTree obfToDeobf, Translator deobfuscator, EntryResolver entryResolver) { + public MappingValidator(EntryTree obfToDeobf, Translator deobfuscator, JarIndex index) { this.obfToDeobf = obfToDeobf; this.deobfuscator = deobfuscator; - this.entryResolver = entryResolver; + this.index = index; } public void validateRename(Entry entry, String name) throws IllegalNameException { - Collection> equivalentEntries = entryResolver.resolveEquivalentEntries(entry); + Collection> equivalentEntries = index.getEntryResolver().resolveEquivalentEntries(entry); for (Entry equivalentEntry : equivalentEntries) { equivalentEntry.validateName(name); validateUnique(equivalentEntry, name); @@ -28,19 +32,38 @@ public class MappingValidator { } private void validateUnique(Entry entry, String name) { - Entry translatedEntry = deobfuscator.translate(entry); - Collection> translatedSiblings = obfToDeobf.getSiblings(entry).stream() - .map(deobfuscator::translate) - .collect(Collectors.toList()); + ClassEntry containingClass = entry.getContainingClass(); + Collection relatedClasses = getRelatedClasses(containingClass); - if (!isUnique(translatedEntry, translatedSiblings, name)) { - throw new IllegalNameException(name, "Name is not unique in " + translatedEntry.getParent() + "!"); + for (ClassEntry relatedClass : relatedClasses) { + Entry relatedEntry = entry.replaceAncestor(containingClass, relatedClass); + Entry translatedEntry = deobfuscator.translate(relatedEntry); + + Collection> translatedSiblings = obfToDeobf.getChildren(relatedClass).stream() + .filter(e -> !entry.equals(e)) + .map(deobfuscator::translate) + .collect(Collectors.toList()); + + if (!isUnique(translatedEntry, translatedSiblings, name)) { + throw new IllegalNameException(name, "Name is not unique in " + translatedEntry.getParent() + "!"); + } } } + private Collection getRelatedClasses(ClassEntry classEntry) { + InheritanceIndex inheritanceIndex = index.getInheritanceIndex(); + + Collection relatedClasses = new HashSet<>(); + relatedClasses.add(classEntry); + relatedClasses.addAll(inheritanceIndex.getChildren(classEntry)); + relatedClasses.addAll(inheritanceIndex.getAncestors(classEntry)); + + return relatedClasses; + } + private boolean isUnique(Entry entry, Collection> siblings, String name) { - for (Entry child : siblings) { - if (entry.canConflictWith(child) && child.getName().equals(name)) { + for (Entry sibling : siblings) { + if (entry.canConflictWith(sibling) && sibling.getName().equals(name)) { return false; } } 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 255fa5f..d8b1f50 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 implements EntryTree { return delegate.getChildren(entry); } - @Override - public Collection> getSiblings(Entry entry) { - return delegate.getSiblings(entry); - } - @Nullable @Override public EntryTreeNode 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 daaefcc..f919a39 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; public interface EntryTree extends EntryMap, Iterable>, Translatable { Collection> getChildren(Entry entry); - Collection> getSiblings(Entry entry); - @Nullable EntryTreeNode findNode(Entry entry); 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 bb21de6..02f2c04 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java @@ -72,22 +72,6 @@ public class HashEntryTree implements EntryTree { return leaf.getChildren(); } - @Override - public Collection> getSiblings(Entry entry) { - List> path = computePath(entry, false); - if (path.size() <= 1) { - return getSiblings(entry, root.keySet()); - } - HashTreeNode parent = path.get(path.size() - 2); - return getSiblings(entry, parent.getChildren()); - } - - private Collection> getSiblings(Entry entry, Collection> children) { - Set> siblings = new HashSet<>(children); - siblings.remove(entry); - return siblings; - } - @Override @Nullable public HashTreeNode findNode(Entry target) { -- cgit v1.2.3