summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar gegy10002019-02-24 11:02:59 +0200
committerGravatar gegy10002019-02-24 11:02:59 +0200
commit809052b4ed5cf77d073617912878691f865d855f (patch)
tree43a042350672a33a35a1a817553552e04bc57874 /src
parentFix #110 and remap indices with matched bridge method names (diff)
downloadenigma-809052b4ed5cf77d073617912878691f865d855f.tar.gz
enigma-809052b4ed5cf77d073617912878691f865d855f.tar.xz
enigma-809052b4ed5cf77d073617912878691f865d855f.zip
Fix #81 -- validate renames across related classes
Diffstat (limited to 'src')
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java6
-rw-r--r--src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java2
-rw-r--r--src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java47
-rw-r--r--src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java5
-rw-r--r--src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java2
-rw-r--r--src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java16
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 @@
1package cuchaz.enigma.translation.mapping; 1package cuchaz.enigma.translation.mapping;
2 2
3import cuchaz.enigma.analysis.index.InheritanceIndex;
4import cuchaz.enigma.analysis.index.JarIndex;
3import cuchaz.enigma.throwables.IllegalNameException; 5import cuchaz.enigma.throwables.IllegalNameException;
4import cuchaz.enigma.translation.Translator; 6import cuchaz.enigma.translation.Translator;
5import cuchaz.enigma.translation.mapping.tree.EntryTree; 7import cuchaz.enigma.translation.mapping.tree.EntryTree;
8import cuchaz.enigma.translation.representation.entry.ClassEntry;
6import cuchaz.enigma.translation.representation.entry.Entry; 9import cuchaz.enigma.translation.representation.entry.Entry;
7 10
8import java.util.Collection; 11import java.util.Collection;
12import java.util.HashSet;
9import java.util.stream.Collectors; 13import java.util.stream.Collectors;
10 14
11public class MappingValidator { 15public 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;
14public interface EntryTree<T> extends EntryMap<T>, Iterable<EntryTreeNode<T>>, Translatable { 14public 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();