From ef8bdf506c48d7c9d2bd1f97030d123015c3ae44 Mon Sep 17 00:00:00 2001 From: Adrian Siekierka Date: Sun, 9 Dec 2018 12:38:11 +0100 Subject: add option to view calls to a method in general, not just the specific instance of the method --- src/main/java/cuchaz/enigma/analysis/JarIndex.java | 16 +++++++++++++++- .../cuchaz/enigma/analysis/MethodReferenceTreeNode.java | 7 ++++++- src/main/java/cuchaz/enigma/gui/Gui.java | 5 +++-- src/main/java/cuchaz/enigma/gui/GuiController.java | 4 ++-- .../java/cuchaz/enigma/gui/elements/PopupMenuBar.java | 12 +++++++++++- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index 820ecbbf..361c8e73 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java @@ -447,8 +447,22 @@ public class JarIndex { return this.methodsReferencingClasses.get(classEntry); } + @Deprecated public Collection> getMethodsReferencing(MethodEntry methodEntry) { - return this.methodsReferencing.get(methodEntry); + return getMethodsReferencing(methodEntry, false); + } + + public Collection> getMethodsReferencing(MethodEntry methodEntry, boolean recurse) { + if (!recurse) { + return this.methodsReferencing.get(methodEntry); + } + + List> references = new ArrayList<>(); + Set methodEntries = getRelatedMethodImplementations(methodEntry); + for (MethodEntry entry : methodEntries) { + references.addAll(getMethodsReferencing(entry, false)); + } + return references; } public Collection getReferencedMethods(MethodDefEntry methodEntry) { diff --git a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java index 0eae5cc4..ac05acdc 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java @@ -63,9 +63,14 @@ public class MethodReferenceTreeNode extends DefaultMutableTreeNode return this.deobfuscatingTranslator.getTranslatedMethod(this.entry).getName(); } + @Deprecated public void load(JarIndex index, boolean recurse) { + load(index, recurse, false); + } + + public void load(JarIndex index, boolean recurse, boolean recurseMethod) { // get all the child nodes - for (EntryReference reference : index.getMethodsReferencing(this.entry)) { + for (EntryReference reference : index.getMethodsReferencing(this.entry, recurseMethod)) { add(new MethodReferenceTreeNode(this.deobfuscatingTranslator, reference, index.getAccessFlags(this.entry))); } diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 8ec58f9e..53500aa4 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -537,6 +537,7 @@ public class Gui { this.popupMenu.showInheritanceMenu.setEnabled(isClassEntry || isMethodEntry || isConstructorEntry); this.popupMenu.showImplementationsMenu.setEnabled(isClassEntry || isMethodEntry); this.popupMenu.showCallsMenu.setEnabled(isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry); + this.popupMenu.showCallsSpecificMenu.setEnabled(isMethodEntry); this.popupMenu.openEntryMenu.setEnabled(isInJar && (isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry)); this.popupMenu.openPreviousMenu.setEnabled(this.controller.hasPreviousLocation()); this.popupMenu.toggleMappingMenu.setEnabled(isRenameable); @@ -694,7 +695,7 @@ public class Gui { redraw(); } - public void showCalls() { + public void showCalls(boolean recurse) { if (reference == null) { return; } @@ -706,7 +707,7 @@ public class Gui { FieldReferenceTreeNode node = this.controller.getFieldReferences((FieldEntry) reference.entry); callsTree.setModel(new DefaultTreeModel(node)); } else if (reference.entry instanceof MethodEntry) { - MethodReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) reference.entry); + MethodReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) reference.entry, recurse); callsTree.setModel(new DefaultTreeModel(node)); } diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index acb0ebbb..69aefe58 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -209,10 +209,10 @@ public class GuiController { return rootNode; } - public MethodReferenceTreeNode getMethodReferences(MethodEntry deobfMethodEntry) { + public MethodReferenceTreeNode getMethodReferences(MethodEntry deobfMethodEntry, boolean recursive) { MethodEntry obfMethodEntry = this.deobfuscator.obfuscateEntry(deobfMethodEntry); MethodReferenceTreeNode rootNode = new MethodReferenceTreeNode(this.deobfuscator.getTranslator(TranslationDirection.DEOBFUSCATING), obfMethodEntry); - rootNode.load(this.deobfuscator.getJarIndex(), true); + rootNode.load(this.deobfuscator.getJarIndex(), true, recursive); return rootNode; } diff --git a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java index 2f6d96c4..32f91729 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java @@ -3,6 +3,7 @@ package cuchaz.enigma.gui.elements; import cuchaz.enigma.gui.Gui; import javax.swing.*; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; public class PopupMenuBar extends JPopupMenu { @@ -11,6 +12,7 @@ public class PopupMenuBar extends JPopupMenu { public final JMenuItem showInheritanceMenu; public final JMenuItem showImplementationsMenu; public final JMenuItem showCallsMenu; + public final JMenuItem showCallsSpecificMenu; public final JMenuItem openEntryMenu; public final JMenuItem openPreviousMenu; public final JMenuItem toggleMappingMenu; @@ -42,12 +44,20 @@ public class PopupMenuBar extends JPopupMenu { } { JMenuItem menu = new JMenuItem("Show Calls"); - menu.addActionListener(event -> gui.showCalls()); + menu.addActionListener(event -> gui.showCalls(true)); menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0)); menu.setEnabled(false); this.add(menu); this.showCallsMenu = menu; } + { + JMenuItem menu = new JMenuItem("Show Calls (Specific)"); + menu.addActionListener(event -> gui.showCalls(false)); + menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.SHIFT_DOWN_MASK)); + menu.setEnabled(false); + this.add(menu); + this.showCallsSpecificMenu = menu; + } { JMenuItem menu = new JMenuItem("Go to Declaration"); menu.addActionListener(event -> gui.navigateTo(gui.reference.entry)); -- cgit v1.2.3