GP-3377 - Symbol Table - Updated the 'Name Only' filter to also search the 'Original Imported Name'; added a 'Simplified Name' column

This commit is contained in:
dragonmacher 2024-07-01 19:19:02 -04:00
parent c1f8312c56
commit cfa1fc93e9
2 changed files with 57 additions and 5 deletions

View file

@ -21,6 +21,7 @@ import docking.widgets.table.*;
import ghidra.app.cmd.function.DeleteFunctionCmd;
import ghidra.app.cmd.label.DeleteLabelCmd;
import ghidra.app.cmd.label.RenameLabelCmd;
import ghidra.app.util.template.TemplateSimplifier;
import ghidra.docking.settings.Settings;
import ghidra.framework.cmd.CompoundCmd;
import ghidra.framework.plugintool.PluginTool;
@ -80,6 +81,7 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
descriptor.addHiddenColumn(new PinnedTableColumn());
descriptor.addHiddenColumn(new UserTableColumn());
descriptor.addHiddenColumn(new OriginalNameColumn());
descriptor.addHiddenColumn(new SimplifiedNameColumn());
return descriptor;
}
@ -648,7 +650,7 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
}
private class OriginalNameColumn
class OriginalNameColumn
extends AbstractProgramBasedDynamicTableColumn<SymbolRowObject, String> {
@Override
@ -684,7 +686,35 @@ public abstract class AbstractSymbolTableModel extends AddressBasedTableModel<Sy
}
return null;
}
}
private class SimplifiedNameColumn
extends AbstractProgramBasedDynamicTableColumn<SymbolRowObject, String> {
private TemplateSimplifier simplifier = new TemplateSimplifier();
@Override
public String getColumnName() {
return "Simplified Name";
}
@Override
public String getColumnDescription() {
return "The symbol name with less complicated template arguments";
}
@Override
public String getValue(SymbolRowObject rowObject, Settings settings, Program p,
ServiceProvider svcProvider) throws IllegalArgumentException {
Symbol symbol = rowObject.getSymbol();
if (symbol == null || symbol.isDeleted()) {
return null;
}
String name = symbol.getName();
return simplifier.simplify(name);
}
}
}

View file

@ -22,12 +22,14 @@ import java.util.List;
import javax.swing.*;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import org.jdom.Element;
import docking.widgets.checkbox.GCheckBox;
import docking.widgets.table.DefaultRowFilterTransformer;
import docking.widgets.table.RowFilterTransformer;
import ghidra.app.plugin.core.symtable.AbstractSymbolTableModel.OriginalNameColumn;
import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.PluginTool;
import ghidra.program.model.symbol.Symbol;
@ -119,11 +121,11 @@ class SymbolPanel extends JPanel {
}
protected RowFilterTransformer<SymbolRowObject> updateRowDataTransformer(boolean nameOnly) {
TableColumnModel columnModel = symTable.getColumnModel();
if (nameOnly) {
return new NameOnlyRowTransformer();
return new NameOnlyRowTransformer(tableModel, columnModel);
}
return new DefaultRowFilterTransformer<>(tableModel, symTable.getColumnModel());
return new DefaultRowFilterTransformer<>(tableModel, columnModel);
}
void dispose() {
@ -201,8 +203,16 @@ class SymbolPanel extends JPanel {
// Inner Classes
//==================================================================================================
private static class NameOnlyRowTransformer implements RowFilterTransformer<SymbolRowObject> {
private static class NameOnlyRowTransformer
extends DefaultRowFilterTransformer<SymbolRowObject> {
private List<String> list = new ArrayList<>();
private SymbolTableModel symbolTableModel;
NameOnlyRowTransformer(SymbolTableModel symbolTableModel, TableColumnModel columnModel) {
super(symbolTableModel, columnModel);
this.symbolTableModel = symbolTableModel;
}
@Override
public List<String> transform(SymbolRowObject rowObject) {
@ -211,10 +221,22 @@ class SymbolPanel extends JPanel {
// The toString() returns the name for the symbol, which may be cached. Calling
// toString() will also avoid locking for cached values.
list.add(rowObject.toString());
// Add the 'Original Imported Name' value as well, which may feel intuitive to the
// user when filtering on the name.
addOriginalName(rowObject);
}
return list;
}
private void addOriginalName(SymbolRowObject rowObject) {
int index = symbolTableModel.getColumnIndex(OriginalNameColumn.class);
String originalName = getStringValue(rowObject, index);
if (originalName != null) {
list.add(originalName);
}
}
@Override
public int hashCode() {
// not meant to put in hashing structures; the data for equals may change over time