GP-5654 - Data Type Manager - Speed improvements for deleting data types

This commit is contained in:
dragonmacher 2025-05-13 14:27:17 -04:00
parent 0ebc4c9608
commit 404191cdaa
41 changed files with 381 additions and 233 deletions

View file

@ -132,7 +132,7 @@ public class DBTraceDataTypeManagerTest extends AbstractGhidraHeadlessIntegratio
assertEquals(mine.toString(), got.toString()); // TODO: Eww
try (Transaction tx = trace.openTransaction("To Undo")) {
dtm.remove(got, new ConsoleTaskMonitor());
dtm.remove(got);
}
assertNull(got = dtm.getDataType(minePath));

View file

@ -688,7 +688,7 @@ public class DataTypeMergeManager implements MergeResolver {
// remove the Latest that was added.
DataType latestDt3 = dtms[RESULT].getDataType(sourceArchive, dataTypeID);
long resultId3 = dtms[RESULT].getID(latestDt3);
if (dtms[RESULT].remove(latestDt3, currentMonitor)) {
if (dtms[RESULT].remove(latestDt3)) {
latestResolvedDts.put(resultId3, null);
}
break;
@ -807,7 +807,7 @@ public class DataTypeMergeManager implements MergeResolver {
// remove the data type if it was already added
DataType dt = myResolvedDts.get(id);
if (dt != null) {
dtms[RESULT].remove(dt, currentMonitor);
dtms[RESULT].remove(dt);
origResolvedDts.remove(id);
myResolvedDts.remove(id);
}
@ -818,7 +818,7 @@ public class DataTypeMergeManager implements MergeResolver {
case OPTION_MY:
if (myDt == null) {
if (latestDt != null) {
dtms[RESULT].remove(latestDt, currentMonitor);
dtms[RESULT].remove(latestDt);
}
}
else {
@ -3003,7 +3003,7 @@ public class DataTypeMergeManager implements MergeResolver {
// My deleted data types will be in the result unless the latest already deleted it.
if (myDt != null) {
// If it's still in the result remove it.
dtms[RESULT].remove(myDt, currentMonitor);
dtms[RESULT].remove(myDt);
}
}
}

View file

@ -88,13 +88,13 @@ public class ClearCmd extends BackgroundCommand<Program> {
public boolean applyTo(Program p, TaskMonitor taskMonitor) {
this.monitor = taskMonitor;
this.program = p;
boolean wasEabled = program.isSendingEvents();
boolean wasEnabled = program.isSendingEvents();
try {
program.setEventsEnabled(sendIndividualEvents);
return doApplyTo();
}
finally {
program.setEventsEnabled(wasEabled);
program.setEventsEnabled(wasEnabled);
program = null;
monitor = null;
}

View file

@ -1329,7 +1329,7 @@ public abstract class CompEditorModel<T extends Composite> extends CompositeEdit
}
viewDTM.withTransaction("Removed Dependency", () -> {
viewDTM.clearUndoOnChange();
viewDTM.remove(dataType, TaskMonitor.DUMMY);
viewDTM.remove(dataType);
});
fireTableDataChanged();
componentDataChanged();

View file

@ -265,7 +265,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
}
@Override
public boolean remove(DataType existingViewDt, TaskMonitor monitor) {
public boolean remove(DataType existingViewDt) {
if (existingViewDt.getDataTypeManager() != this) {
throw new IllegalArgumentException("datatype is not from this manager");
@ -275,7 +275,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
dataTypeIDMap.remove(getID(existingViewDt));
}
return super.remove(existingViewDt, monitor);
return super.remove(existingViewDt);
}
/**
@ -311,7 +311,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
DataType originalDt = originalDTM.getDataType(originalId);
if (originalDt == null) {
changed = true;
remove(dt, TaskMonitor.DUMMY);
remove(dt);
continue;
}
@ -406,7 +406,7 @@ public class CompositeViewerDataTypeManager<T extends Composite> extends StandAl
orphanIds.addAll(getChildIds(id));
// Remove orphan DB datatype
remove(dt, TaskMonitor.DUMMY);
remove(dt);
if (cleanupIdMaps) {
dataTypeIDMap.remove(id);

View file

@ -309,6 +309,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void categoryAdded(DataTypeManager dtm, CategoryPath path) {
if (!isLoaded()) {
return;
}
Category newCategory = dtm.getCategory(path);
if (newCategory == null) {
return;
@ -326,6 +330,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void categoryMoved(DataTypeManager dtm, CategoryPath oldPath, CategoryPath newPath) {
if (!isLoaded()) {
return;
}
Category newCategory = dtm.getCategory(newPath);
Category oldParent = dtm.getCategory(oldPath.getParent());
CategoryNode categoryNode = findCategoryNode(oldParent);
@ -340,6 +348,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void categoryRemoved(DataTypeManager dtm, CategoryPath path) {
if (!isLoaded()) {
return;
}
Category parentCategory = dtm.getCategory(path.getParent());
CategoryNode categoryNode = findCategoryNode(parentCategory);
if (categoryNode != null) {
@ -350,6 +362,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void categoryRenamed(DataTypeManager dtm, CategoryPath oldPath,
CategoryPath newPath) {
if (!isLoaded()) {
return;
}
if (oldPath.getParent() == null) { // root has no parent
ArchiveNode.this.fireNodeChanged(); // fire that the root changed
return;
@ -365,6 +381,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void dataTypeAdded(DataTypeManager dtm, DataTypePath path) {
if (!isLoaded()) {
return;
}
Category parentCategory = dtm.getCategory(path.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(parentCategory);
if (categoryNode != null) {
@ -379,6 +399,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void favoritesChanged(DataTypeManager dtm, DataTypePath path, boolean isFavorite) {
if (!isLoaded()) {
return;
}
DataType dataType = dtm.getDataType(path);
Category category = dtm.getCategory(path.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(category);
@ -399,6 +423,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void dataTypeChanged(DataTypeManager dtm, DataTypePath path) {
if (!isLoaded()) {
return;
}
Category dtmCategory = dtm.getCategory(path.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(dtmCategory);
if (categoryNode != null) {
@ -413,6 +441,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void dataTypeMoved(DataTypeManager dtm, DataTypePath oldPath, DataTypePath newPath) {
if (!isLoaded()) {
return;
}
Category oldParent = dtm.getCategory(oldPath.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(oldParent);
if (categoryNode != null) {
@ -433,6 +465,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void dataTypeRemoved(DataTypeManager dtm, DataTypePath path) {
if (!isLoaded()) {
return;
}
Category oldParent = dtm.getCategory(path.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(oldParent);
if (categoryNode != null) {
@ -443,6 +479,10 @@ public class ArchiveNode extends CategoryNode {
@Override
public void dataTypeRenamed(DataTypeManager dtm, DataTypePath oldPath,
DataTypePath newPath) {
if (!isLoaded()) {
return;
}
Category dtmCategory = dtm.getCategory(newPath.getCategoryPath());
CategoryNode categoryNode = findCategoryNode(dtmCategory);
if (categoryNode != null) {

View file

@ -51,6 +51,7 @@ public class CategoryNode extends DataTypeTreeNode {
if (category == null) {
return Collections.emptyList();
}
Category[] subCategories = category.getCategories();
DataType[] dataTypes = category.getDataTypes();
List<GTreeNode> list = new ArrayList<>(subCategories.length + dataTypes.length);

View file

@ -156,6 +156,10 @@ public class DataTypeTreeCopyMoveTask extends Task {
int n = errors.size();
if (n > 1) {
message = "Encountered " + n + " errors copying/moving. See the log for details";
for (int i = 0; i < 10; i++) {
Msg.error(this, errors.get(i));
}
}
Msg.showError(this, gTree, "Encountered Errors Copying/Moving", message);

View file

@ -25,6 +25,8 @@ import ghidra.app.plugin.core.datamgr.DataTypesProvider;
import ghidra.app.plugin.core.datamgr.archive.Archive;
import ghidra.app.plugin.core.datamgr.tree.*;
import ghidra.program.model.data.*;
import ghidra.program.model.listing.Program;
import ghidra.util.Swing;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.Task;
import ghidra.util.task.TaskMonitor;
@ -38,6 +40,8 @@ public class DataTypeTreeDeleteTask extends Task {
private DataTypeManagerPlugin plugin;
private int nodeCount;
private boolean hasClosedCategories = false;
public DataTypeTreeDeleteTask(DataTypeManagerPlugin plugin, List<GTreeNode> nodes) {
super("Delete Nodes", true, true, true);
this.plugin = plugin;
@ -48,15 +52,19 @@ public class DataTypeTreeDeleteTask extends Task {
}
private Map<ArchiveNode, List<GTreeNode>> groupNodeByArchive(List<GTreeNode> nodes) {
Map<ArchiveNode, List<GTreeNode>> archiveNodeMap = new HashMap<>();
Map<ArchiveNode, List<GTreeNode>> archiveNodeMap = new HashMap<>();
for (GTreeNode node : nodes) {
ArchiveNode archiveNode = ((DataTypeTreeNode) node).getArchiveNode();
List<GTreeNode> archiveNodeList = archiveNodeMap.get(archiveNode);
if (archiveNodeList == null) {
archiveNodeList = new ArrayList<>();
archiveNodeMap.put(archiveNode, archiveNodeList);
List<GTreeNode> archiveNodeList = archiveNodeMap.computeIfAbsent(archiveNode,
n -> new ArrayList<>());
if (node instanceof CategoryNode) {
if (!node.isLoaded()) {
hasClosedCategories = true;
}
}
archiveNodeList.add(node);
}
return archiveNodeMap;
@ -95,6 +103,7 @@ public class DataTypeTreeDeleteTask extends Task {
for (List<GTreeNode> list : nodesByArchive.values()) {
total += list.size();
}
monitor.initialize(total);
//
@ -108,8 +117,14 @@ public class DataTypeTreeDeleteTask extends Task {
DataTypesProvider provider = plugin.getProvider();
DataTypeArchiveGTree tree = provider.getGTree();
GTreeState treeState = tree.getTreeState();
boolean collapseTree = nodeCount > NODE_COUNT_FOR_COLLAPSING_TREE || hasClosedCategories;
Program program = plugin.getProgram();
boolean wereEventsEnabled = program.isSendingEvents();
try {
if (nodeCount > NODE_COUNT_FOR_COLLAPSING_TREE) {
program.setEventsEnabled(false);
if (collapseTree) {
monitor.setIndeterminate(true);
collapseArchives(tree);
}
@ -124,9 +139,18 @@ public class DataTypeTreeDeleteTask extends Task {
// nothing to report
}
finally {
// Allow any events to go out before we restore the tree state so that the tree does
// not have to process any events it is not concerned with.
program.flushEvents();
program.getDataTypeManager().flushEvents();
program.setEventsEnabled(wereEventsEnabled);
if (collapseTree) {
Swing.allowSwingToProcessEvents();
tree.restoreTreeState(treeState);
}
}
}
private void collapseArchives(DataTypeArchiveGTree tree) {
GTreeNode root = tree.getModelRoot();
@ -140,18 +164,14 @@ public class DataTypeTreeDeleteTask extends Task {
throws CancelledException {
Archive archive = archiveNode.getArchive();
DataTypeManager dataTypeManager = archive.getDataTypeManager();
int transactionID = dataTypeManager.startTransaction("Delete Category/DataType");
try {
DataTypeManager dtm = archive.getDataTypeManager();
dtm.withTransaction("Delete Category/DataType", () -> {
for (GTreeNode node : list) {
monitor.checkCancelled();
removeNode(node, monitor);
monitor.incrementProgress(1);
}
}
finally {
dataTypeManager.endTransaction(transactionID, true);
}
});
}
private void removeNode(GTreeNode node, TaskMonitor monitor) {
@ -159,7 +179,7 @@ public class DataTypeTreeDeleteTask extends Task {
DataTypeNode dataTypeNode = (DataTypeNode) node;
DataType dataType = dataTypeNode.getDataType();
DataTypeManager dataTypeManager = dataType.getDataTypeManager();
dataTypeManager.remove(dataType, monitor);
dataTypeManager.remove(dataType);
}
else {
CategoryNode categoryNode = (CategoryNode) node;

View file

@ -1099,7 +1099,7 @@ public class StackEditorModel extends CompositeEditorModel<StackFrameDataType> {
}
OffsetPairs offsetSelection = getRelOffsetSelection();
viewDTM.remove(dataType, TaskMonitor.DUMMY);
viewDTM.remove(dataType);
fireTableDataChanged();
componentDataChanged();
setRelOffsetSelection(offsetSelection);

View file

@ -379,7 +379,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(-1);
@ -409,7 +409,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
CategoryPath path = new CategoryPath("/Category1/Category2/Category3");
Structure s = new StructureDataType(path, "my_struct", 5);
DataType dt = dtm.addDataType(s, DataTypeConflictHandler.DEFAULT_HANDLER);
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(-1);
@ -442,7 +442,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(DataTypeMergeManager.OPTION_MY);
@ -475,7 +475,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category5"),
"FloatStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(DataTypeMergeManager.OPTION_LATEST);
@ -496,7 +496,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -526,7 +526,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -578,7 +578,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -588,7 +588,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(-1);
@ -772,7 +772,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
// /Category1/Category2/Category3
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
});
executeMerge(DataTypeMergeManager.OPTION_MY);
@ -792,7 +792,7 @@ public class DataTypeMerge1Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override

View file

@ -32,7 +32,6 @@ import ghidra.program.model.symbol.SourceType;
import ghidra.program.model.symbol.Symbol;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
/**
* Tests for merging data types.
@ -1010,7 +1009,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1105,11 +1104,11 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
DataType word = dtm.getDataType(new CategoryPath("/"), "word");
// remove Bar and word from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(word, TaskMonitor.DUMMY);
dtm.remove(bar);
dtm.remove(word);
}
@Override
@ -1220,7 +1219,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
.getDataType(new CategoryPath("/MISC"), "MyFunctionDef");
fd.setReturnType(bar);
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
}
@Override
@ -1273,7 +1272,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
fd.setVarArgs(true);
fd.setNoReturn(true);
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
}
@Override
@ -1328,7 +1327,7 @@ public class DataTypeMerge2Test extends AbstractDataTypeMergeTest {
fd.setVarArgs(true);
fd.setNoReturn(true);
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
}
@Override

View file

@ -24,7 +24,6 @@ import ghidra.program.database.*;
import ghidra.program.model.data.*;
import ghidra.program.model.data.Enum;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
/**
* More data type merge tests.
@ -41,7 +40,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// 2 components should get removed from CoolUnion
}
@ -113,7 +112,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// 2 components should be bad in CoolUnion
}
@ -181,7 +180,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// 2 components should get removed from CoolUnion
}
@ -502,7 +501,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -562,7 +561,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// causes Bar to be marked as changed
}
@ -621,7 +620,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "Structure_1");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// causes Bar to be marked as changed
}
@ -700,7 +699,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
Structure a = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "ArrayStruct");
Structure ms = (Structure) dtm.getDataType(new CategoryPath("/Category1/Category2"),
"MyStruct");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
Structure s1 = new StructureDataType(
new CategoryPath("/Category1/Category2/Category5"), "s1", 0);
s1.add(ms);
@ -811,7 +810,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
DataType dt = dtm.getDataType(new CategoryPath("/Category1/Category2"), "BF");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1127,7 +1126,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
dtm.replaceDataType(td, new TypedefDataType("NewBF", IntegerDataType.dataType),
true);
DataType dt = dtm.getDataType("/MISC/FooTypedef");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
DataType dt1 = dtm.getDataType("/BF");
assertNull(dt1);
@ -1200,7 +1199,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// 2 components should get removed from CoolUnion
}
@ -1278,7 +1277,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// 2 components should get removed from CoolUnion
}
@ -1364,10 +1363,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1436,10 +1435,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1518,10 +1517,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1590,10 +1589,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1693,10 +1692,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1779,10 +1778,10 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -1888,7 +1887,7 @@ public class DataTypeMerge3Test extends AbstractDataTypeMergeTest {
try {
DataType enumm = dtm.getDataType(new CategoryPath("/Category1"), "XYZ");
dtm.remove(enumm, TaskMonitor.DUMMY);
dtm.remove(enumm);
Union union = (Union) dtm.getDataType(new CategoryPath("/Category1/Category2"),
"CoolUnion");

View file

@ -29,7 +29,6 @@ import ghidra.program.database.ProgramModifierListener;
import ghidra.program.model.data.*;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
/**
* More data type merge tests.
@ -425,7 +424,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
// change ArrayStruct
DataTypeManager dtm = program.getDataTypeManager();
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
}
@Override
@ -617,7 +616,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
// delete Bar from Foo
fs.delete(3);
// add Foo to Bar
dtm.remove(bs, TaskMonitor.DUMMY);
dtm.remove(bs);
// Add s1, s2, s3
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
@ -705,7 +704,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
// delete Bar from Foo
foo.delete(3);
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
// Add s1, s2, s3
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
@ -801,7 +800,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
// delete Bar from Foo
fs.delete(3);
// remove Bar from the data type manager
dtm.remove(bs, TaskMonitor.DUMMY);
dtm.remove(bs);
// Add s1, s2, s3
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
@ -945,7 +944,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
// delete Foo from the data type manager
dtm.remove(fs, TaskMonitor.DUMMY);
dtm.remove(fs);
}
@Override
@ -954,7 +953,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
Structure foo = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// delete Foo from the data type manager
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
// Add s1, s2, s3
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
@ -1023,7 +1022,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure fs = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Foo");
// delete Foo from the data type manager
dtm.remove(fs, TaskMonitor.DUMMY);
dtm.remove(fs);
}
@Override
@ -1033,7 +1032,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// delete Foo from the data type manager
dtm.remove(foo, TaskMonitor.DUMMY);
dtm.remove(foo);
// Add s1, s2, s3
Structure s1 = new StructureDataType(new CategoryPath("/MISC"), "S1", 0);
@ -1181,7 +1180,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1296,7 +1295,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1409,7 +1408,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1482,7 +1481,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1579,7 +1578,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1670,7 +1669,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1756,7 +1755,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override
@ -1838,7 +1837,7 @@ public class DataTypeMerge4Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure bar = (Structure) dtm.getDataType(new CategoryPath("/MISC"), "Bar");
// remove Bar from the data type manager
dtm.remove(bar, TaskMonitor.DUMMY);
dtm.remove(bar);
}
@Override

View file

@ -29,7 +29,6 @@ import ghidra.program.model.data.*;
import ghidra.program.model.data.Enum;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
/**
*
@ -48,10 +47,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -126,10 +125,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -227,10 +226,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
}
@Override
@ -336,10 +335,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
public void modifyLatest(ProgramDB program) {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// edit FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
@ -459,14 +458,14 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// delete FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
dtm.remove(enumm, TaskMonitor.DUMMY);
dtm.remove(enumm);
}
@Override
@ -579,14 +578,14 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// delete FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
dtm.remove(enumm, TaskMonitor.DUMMY);
dtm.remove(enumm);
}
@Override
@ -710,10 +709,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// edit FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
@ -834,10 +833,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// edit FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
@ -968,10 +967,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// edit FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");
@ -1479,10 +1478,10 @@ public class DataTypeMerge5Test extends AbstractDataTypeMergeTest {
DataTypeManager dtm = program.getDataTypeManager();
Structure s = (Structure) dtm.getDataType(CategoryPath.ROOT, "DLL_Table");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
DataType dt =
dtm.getDataType(new CategoryPath("/Category1/Category2"), "CoolUnion");
dtm.remove(dt, TaskMonitor.DUMMY);
dtm.remove(dt);
// edit FavoriteColors
Enum enumm = (Enum) dtm.getDataType(new CategoryPath("/MISC"), "FavoriteColors");

View file

@ -21,7 +21,6 @@ import org.junit.Test;
import ghidra.program.database.*;
import ghidra.program.model.data.*;
import ghidra.util.task.TaskMonitor;
/**
* Data type merge tests for aligned data types.
@ -654,7 +653,7 @@ public class DataTypeMerge6Test extends AbstractDataTypeMergeTest {
Structure s =
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"),
"IntStruct");
dtm.remove(s, TaskMonitor.DUMMY);
dtm.remove(s);
// Offsets change to 0,2,4,8.
Structure intStruct =

View file

@ -26,7 +26,6 @@ import ghidra.framework.main.*;
import ghidra.program.database.OriginalProgramModifierListener;
import ghidra.program.database.ProgramDB;
import ghidra.program.model.data.*;
import ghidra.util.task.TaskMonitor;
/**
* More data type merge tests.
@ -90,7 +89,7 @@ public class DataTypeMerge8Test extends AbstractDataTypeMergeTest {
abc.replace(0, new CharDataType(), 1);
// Remove the XYZ data type.
dtm.remove(xyz, TaskMonitor.DUMMY);
dtm.remove(xyz);
}
@Override

View file

@ -22,7 +22,6 @@ import org.junit.Test;
import ghidra.program.database.OriginalProgramModifierListener;
import ghidra.program.database.ProgramDB;
import ghidra.program.model.data.*;
import ghidra.util.task.TaskMonitor;
/**
* Data type merge tests with fixup for data types added in My program.
@ -73,7 +72,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
// Remove inner struct
dtm.remove(inner, TaskMonitor.DUMMY);
dtm.remove(inner);
}
@Override
@ -211,7 +210,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
// Remove inner struct
dtm.remove(inner, TaskMonitor.DUMMY);
dtm.remove(inner);
}
@Override
@ -303,7 +302,7 @@ public class DataTypeMergeFixupTest extends AbstractDataTypeMergeTest {
Structure inner = (Structure) dtm.getDataType(rootPath, "inner");
// Remove inner struct
dtm.remove(inner, TaskMonitor.DUMMY);
dtm.remove(inner);
}
@Override

View file

@ -22,7 +22,6 @@ import org.junit.Test;
import ghidra.program.database.ProgramDB;
import ghidra.program.database.ProgramModifierListener;
import ghidra.program.model.data.*;
import ghidra.util.task.TaskMonitor;
/**
* Tests for merging data types.
@ -88,7 +87,7 @@ public class DataTypeMergeUseForAllTest extends AbstractDataTypeMergeTest {
"CharStruct");
intStruct.add(new ByteDataType());// Change data type.
dtm.remove(coolUnion, TaskMonitor.DUMMY);// Remove the data type.
dtm.remove(coolUnion);// Remove the data type.
charStruct.add(new FloatDataType());
}
@ -106,7 +105,7 @@ public class DataTypeMergeUseForAllTest extends AbstractDataTypeMergeTest {
(Structure) dtm.getDataType(new CategoryPath("/Category1/Category2/Category4"),
"CharStruct");
dtm.remove(intStruct, TaskMonitor.DUMMY);// Remove the data type.
dtm.remove(intStruct);// Remove the data type.
coolUnion.delete(2);
charStruct.add(new CharDataType());
}

View file

@ -23,7 +23,6 @@ import org.junit.Test;
import ghidra.program.model.data.DataTypeManager;
import ghidra.program.model.data.Structure;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
public class StructureEditorLockedEnablementTest extends AbstractStructureEditorTest {
@ -33,7 +32,7 @@ public class StructureEditorLockedEnablementTest extends AbstractStructureEditor
Structure desiredEmptyStructure = emptyStructure;
int txID = program.startTransaction("Removing emptyStruct from DTM.");
try {
programDTM.remove(emptyStructure, TaskMonitor.DUMMY);
programDTM.remove(emptyStructure);
if (emptyStructure.getDataTypeManager() != catDTM) {
desiredEmptyStructure = (Structure) emptyStructure.copy(catDTM);
desiredEmptyStructure.setCategoryPath(pgmTestCat.getCategoryPath());

View file

@ -36,7 +36,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
public void setUp() throws Exception {
super.setUp();
// Create overlapping trasnaction to handle all changes
// Create overlapping transaction to handle all changes
persistentTxId = program.startTransaction("Modify Program");
}
@ -88,7 +88,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
assertEquals("complexStructure *", dataType10.getDisplayName());
assertEquals(4, getLength(10));
programDTM.remove(complexStructure, TaskMonitor.DUMMY);
programDTM.remove(complexStructure);
programDTM.getCategory(pgmRootCat.getCategoryPath())
.removeCategory("Temp", TaskMonitor.DUMMY);
@ -505,7 +505,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
assertEquals(0x145, model.getLength());
runSwing(
() -> complexStructure.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
() -> complexStructure.getDataTypeManager().remove(simpleUnion));
waitForSwing();
assertEquals(23, model.getNumComponents());
assertTrue(dt3.isEquivalent(getDataType(3)));
@ -536,7 +536,7 @@ public class StructureEditorNotifiedTest extends AbstractStructureEditorTest {
assertTrue(simpleStructure.isEquivalent(getDataType(0)));
runSwing(
() -> simpleStructure.getDataTypeManager().remove(simpleStructure, TaskMonitor.DUMMY));
() -> simpleStructure.getDataTypeManager().remove(simpleStructure));
waitForSwing();
assertEquals(1, model.getNumComponents());// component becomes BadDataType

View file

@ -115,7 +115,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
DataType dt18 = getDataType(18).clone(programDTM);
DataType dt20 = getDataType(20).clone(programDTM);
SwingUtilities.invokeLater(() -> {
programDTM.remove(complexUnion, TaskMonitor.DUMMY);
programDTM.remove(complexUnion);
programDTM.getCategory(pgmRootCat.getCategoryPath())
.removeCategory("Temp", TaskMonitor.DUMMY);
});
@ -319,7 +319,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
assertEquals(0x57, model.getLength());
SwingUtilities.invokeLater(
() -> complexUnion.getDataTypeManager().remove(simpleStructure, TaskMonitor.DUMMY));
() -> complexUnion.getDataTypeManager().remove(simpleStructure));
waitForSwing();
assertEquals(21, model.getNumComponents());
@ -362,7 +362,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
assertEquals(8, model.getLength());
SwingUtilities.invokeLater(
() -> simpleUnion.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
() -> simpleUnion.getDataTypeManager().remove(simpleUnion));
waitForSwing();
assertEquals(1, model.getNumComponents());
@ -387,7 +387,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
Union refUnion = (Union) dtm.getDataType("/testCat/refUnion");
assertNotNull(refUnion);
SwingUtilities.invokeLater(() -> dtm.remove(refUnion, TaskMonitor.DUMMY)); // remove refUnion
SwingUtilities.invokeLater(() -> dtm.remove(refUnion)); // remove refUnion
waitForSwing();
// refUnion* gets removed
@ -403,7 +403,7 @@ public class UnionEditorNotifiedTest extends AbstractUnionEditorTest {
assertTrue(dt20.isEquivalent(getDataType(20)));
SwingUtilities.invokeLater(
() -> simpleUnion.getDataTypeManager().remove(simpleUnion, TaskMonitor.DUMMY));
() -> simpleUnion.getDataTypeManager().remove(simpleUnion));
waitForSwing();
assertEquals(len, model.getLength());

View file

@ -607,7 +607,7 @@ public class EnumEditor1Test extends AbstractGhidraHeadedIntegrationTest {
DataTypeManager dtm = program.getDataTypeManager();
int transactionID = program.startTransaction("Test");
dtm.remove(enummDt, TaskMonitor.DUMMY);
dtm.remove(enummDt);
program.endTransaction(transactionID, true);
program.flushEvents();
waitForSwing();

View file

@ -117,7 +117,7 @@ public class ArrayTest extends AbstractGhidraHeadedIntegrationTest {
listing.getDataAt(addr(0x100));
CategoryPath path = dt.getCategoryPath();
assertNotNull(path);
dt.getDataTypeManager().remove(dt, TaskMonitor.DUMMY);
dt.getDataTypeManager().remove(dt);
assertTrue(array.isDeleted());
assertNull(dt.getDataTypeManager().getDataType(path, name));

View file

@ -17,8 +17,7 @@ package ghidra.program.database.data;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.*;
import org.junit.*;
@ -28,7 +27,6 @@ import ghidra.program.model.data.*;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.InvalidNameException;
import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter;
public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
private ProgramDB program;
@ -274,7 +272,7 @@ public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
assertTrue(p.isEquivalent(dataMgr.getDataType("/ByteTypedef *32")));
assertTrue(ptr.isEquivalent(dataMgr.getDataType("/ByteTypedef *32 *32")));
DataType bdt = dataMgr.getDataType("/byte");
dataMgr.remove(bdt, new TaskMonitorAdapter());
dataMgr.remove(bdt);
assertNull(dataMgr.getDataType("/byte"));
assertNull(dataMgr.getDataType("/byte[5]"));
assertNull(dataMgr.getDataType("/ByteTypedef"));
@ -294,11 +292,31 @@ public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest {
DataType bdt = td.getDataType();
long byteID = dataMgr.getResolvedID(bdt);
dataMgr.remove(td, new TaskMonitorAdapter());
dataMgr.remove(td);
assertNull(ptr.getDataType());
assertNotNull(dataMgr.getDataType(byteID));
}
@Test
public void testRemoveDataTypes() throws Exception {
Array array = new ArrayDataType(new ByteDataType(), 5, 1);
List<DataType> toDelete = new ArrayList<>();
// Use a number that will trigger the 'chunking' behavior of the DataTypeManagerDB
for (int i = 0; i < 2500; i++) {
TypeDef td = new TypedefDataType("ByteTypedef" + (i + 1), array);
DataType dt = dataMgr.resolve(td, null);
toDelete.add(dt);
}
dataMgr.remove(toDelete, TaskMonitor.DUMMY);
for (DataType dt : toDelete) {
assertFalse(dataMgr.contains(dt));
}
}
// public void testSave() throws Exception {
//
// Array array = new ArrayDataType(new ByteDataType(), 5);

View file

@ -517,7 +517,7 @@ public class SettingsTest extends AbstractGhidraHeadedIntegrationTest {
endTransaction();
startTransaction();
dataMgr.remove(td, TaskMonitor.DUMMY);
dataMgr.remove(td);
endTransaction();
// make sure accessing the settings does not blow up
assertTrue(td.isDeleted());

View file

@ -1296,7 +1296,7 @@ public class FunctionDBTest extends AbstractGhidraHeadedIntegrationTest
// delete the typedef data type
localTransactionID = program.startTransaction("test");
try {
program.getDataTypeManager().remove(td, TaskMonitor.DUMMY);
program.getDataTypeManager().remove(td);
}
finally {
program.endTransaction(localTransactionID, true);

View file

@ -4251,7 +4251,7 @@ public class RecoveredClassHelper {
DataType dataType = dataTypeManager.getDataType(folderPath, structureName);
if (extendedFlatAPI.isEmptyStructure(dataType)) {
dataTypeManager.remove(dataType, monitor);
dataTypeManager.remove(dataType);
Category classCategory = dataTypeManager.getCategory(folderPath);
Category parentCategory = classCategory.getParent();
boolean tryToRemove = true;

View file

@ -314,7 +314,7 @@ public class ProjectDataTypeManager extends StandAloneDataTypeManager
}
@Override
public void close() {
public synchronized void close() {
// do nothing - cannot close a project data type manager
// dispose should be invoked by the owner of the instance
}

View file

@ -2707,20 +2707,18 @@ public class CodeManager implements ErrorHandler, ManagerDB {
public void clearData(Set<Long> dataTypeIDs, TaskMonitor monitor) throws CancelledException {
lock.acquire();
try {
List<Address> addrs = new ArrayList<>();
List<Address> toClear = new ArrayList<>();
RecordIterator it = dataAdapter.getRecords();
while (it.hasNext()) {
monitor.checkCancelled();
DBRecord rec = it.next();
long id = rec.getLongValue(DataDBAdapter.DATA_TYPE_ID_COL);
for (long dataTypeID : dataTypeIDs) {
if (id == dataTypeID) {
addrs.add(addrMap.decodeAddress(rec.getKey()));
break;
if (dataTypeIDs.contains(id)) {
toClear.add(addrMap.decodeAddress(rec.getKey()));
}
}
}
for (Address addr : addrs) {
for (Address addr : toClear) {
monitor.checkCancelled();
clearCodeUnits(addr, addr, false, monitor);
}

View file

@ -27,8 +27,7 @@ import ghidra.program.model.data.*;
import ghidra.program.model.data.DataTypeConflictHandler.ConflictResult;
import ghidra.util.InvalidNameException;
import ghidra.util.Lock;
import ghidra.util.exception.AssertException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor;
/**
@ -308,9 +307,6 @@ class CategoryDB extends DatabaseObject implements Category {
return null;
}
/**
* @see ghidra.program.model.data.Category#removeCategory(java.lang.String, ghidra.util.task.TaskMonitor)
*/
@Override
public boolean removeCategory(String categoryName, TaskMonitor monitor) {
mgr.lock.acquire();
@ -320,6 +316,7 @@ class CategoryDB extends DatabaseObject implements Category {
if (c == null) {
return false;
}
Category[] cats = c.getCategories();
for (Category cat : cats) {
if (monitor.isCancelled()) {
@ -327,13 +324,16 @@ class CategoryDB extends DatabaseObject implements Category {
}
c.removeCategory(cat.getName(), monitor);
}
DataType[] dts = c.getDataTypes();
for (DataType dt : dts) {
if (monitor.isCancelled()) {
List<DataType> dtList = Arrays.asList(dts);
try {
mgr.remove(dtList, monitor);
}
catch (CancelledException e) {
return false;
}
mgr.remove(dt, monitor);
}
try {
mgr.getCategoryDBAdapter().removeCategory(c.getKey());
subcategoryMap.remove(categoryName);
@ -565,7 +565,7 @@ class CategoryDB extends DatabaseObject implements Category {
throw new IllegalArgumentException(
"can't remove dataType from category that its not a member of!");
}
return mgr.remove(type, monitor);
return mgr.remove(type);
}
/**

View file

@ -164,7 +164,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
*/
private Set<Long> blockedRemovalsByID;
// TODO: idsToDataTypeMap may have issue since there could be a one to many mapping
// Note: idsToDataTypeMap may have issue since there could be a one to many mapping
// (e.g., type with same UniversalID could be in multiple categories unless specifically
// prevented during resolve)
private IdsToDataTypeMap idsToDataTypeMap = new IdsToDataTypeMap();
@ -172,7 +172,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
private ThreadLocal<EquivalenceCache> equivalenceCache = new ThreadLocal<>();
private IdentityHashMap<DataType, DataType> resolveCache;
private TreeSet<ResolvePair> resolveQueue; // TODO: is TreeSet really needed?
private TreeSet<ResolvePair> resolveQueue; // Note: is TreeSet really needed?
private LinkedList<DataType> conflictQueue = new LinkedList<>();
private boolean isBulkRemoving;
@ -1421,14 +1421,14 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
if (!(dataType instanceof Enum)) {
return false;
}
// TODO: implement doReplaceWith
// DT: implement doReplaceWith
existingDataType.replaceWith(dataType);
}
else if (existingDataType instanceof TypedefDB) {
if (!(dataType instanceof TypeDef)) {
return false;
}
// TODO: implement doReplaceWith
// DT: implement doReplaceWith
existingDataType.replaceWith(dataType);
}
else {
@ -1733,7 +1733,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
catch (DataTypeDependencyException e) {
// new type refers to old type - fallthrough to RENAME_AND_ADD
// TODO: alternatively we could throw an exception
}
case RENAME_AND_ADD: // default handler behavior
@ -1760,7 +1759,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
private void replaceEquivalentLocalWithSourceDataType(DataType dataType,
SourceArchive sourceArchive, DataType existingDataType) {
// Since it's equivalent, set its source, ID, and replace its components.
// TODO: Need a better way to do this.
existingDataType.setSourceArchive(sourceArchive);
((DataTypeDB) existingDataType).setUniversalID(dataType.getUniversalID());
existingDataType.replaceWith(dataType);
@ -1786,9 +1784,9 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
lock.acquire();
boolean isEquivalenceCacheOwner = activateEquivalenceCache();
boolean isResolveCacheOwner = activateResolveCache();
// TODO: extended hold time on lock may cause the GUI to become
// unresponsive. Consider releasing lock between resolves, although
// this exposes risk of having active resolve queue/cache without lock
// Note: extended hold time on lock may cause the GUI to become unresponsive. Consider
// releasing lock between resolves, although this exposes risk of having active resolve
// queue/cache without lock.
try {
monitor.setMessage("Adding datatypes...");
monitor.setMaximum(dataTypes.size());
@ -1879,7 +1877,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
@Override
public DataType replaceDataType(DataType existingDt, DataType replacementDt,
boolean updateCategoryPath) throws DataTypeDependencyException {
// TODO: we should probably disallow replacementDt to be an instanceof
// Note: we should probably disallow replacementDt to be an instanceof
// Dynamic or FactoryDataType
lock.acquire();
try {
@ -2342,11 +2340,30 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
if (id <= 0) { // removal of certain special types not permitted
return false;
}
idsToDelete.add(id);
removeQueuedDataTypes();
return true;
}
private void removeInternal(List<DataType> dataTypes) {
for (DataType dt : dataTypes) {
if (!contains(dt)) {
continue;
}
long id = getID(dt);
if (id <= 0) { // removal of certain special types not permitted
continue;
}
idsToDelete.add(id);
}
removeQueuedDataTypes();
}
private void removeQueuedDataTypes() {
// collect all datatype to be removed and notify children which may also get queued
@ -2358,7 +2375,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
deletedIds.add(id);
}
// perform any neccessary external use removals
// perform any necessary external use removals
deleteDataTypesUsed(deletedIds);
// perform actual database updates (e.g., record removal, change notifications, etc.)
@ -2375,7 +2392,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
/**
* Allow extensions to perform any neccessary fixups for all datatype removals listed.
* Allow extensions to perform any necessary fixups for all datatype removals listed.
* @param deletedIds list of IDs for all datatypes which are getting removed.
*/
protected abstract void deleteDataTypesUsed(Set<Long> deletedIds);
@ -2399,7 +2416,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
@Override
public boolean remove(DataType dataType, TaskMonitor monitor) {
public boolean remove(DataType dataType) {
lock.acquire();
try {
return removeInternal(dataType);
@ -2409,6 +2426,32 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
}
@Override
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
lock.acquire();
try {
// perform the delete in chunks so an excessively large list will still be cancellable
int n = dataTypes.size();
int chunk = 1000;
int chunkEnd = n < chunk ? n : chunk;
int start = 0;
while (start < chunkEnd) {
monitor.checkCancelled();
List<DataType> subList = dataTypes.subList(start, chunkEnd);
removeInternal(subList);
start = chunkEnd;
int nextChunk = chunkEnd + chunk;
chunkEnd = n < nextChunk ? n : nextChunk;
}
}
finally {
lock.release();
}
}
@Override
public void associateDataTypeWithArchive(DataType datatype, SourceArchive archive) {
if (!contains(datatype)) {
@ -2846,7 +2889,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
CategoryPath catPath = catDB.getCategoryPath();
String classPath = record.getString(BuiltinDBAdapter.BUILT_IN_CLASSNAME_COL);
String name = record.getString(BuiltinDBAdapter.BUILT_IN_NAME_COL);
try { // TODO: !! Can we look for alternate constructor which takes DTM argument
try {
Class<?> c;
try {
c = Class.forName(classPath);
@ -4110,7 +4153,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
try {
// Initialization of dataOrganization may never have been established
// if either an architecture has never been specified or a language
// error occured during initializtion. In such cases the stored
// error occurred during initialization. In such cases the stored
// data organization should be used if available.
dataOrganization = readDataOrganization();
}
@ -4212,7 +4255,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
private TreeSet<String> buildDefinedCallingConventionSet() {
// Include all calling conventions defined by associated architecure compiler spec
// Include all calling conventions defined by associated architecture compiler spec
TreeSet<String> nameSet = new TreeSet<>();
ProgramArchitecture arch = getProgramArchitecture();
if (arch != null) {
@ -4536,8 +4579,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
}
private record DedupedConflicts(int processCnt, int replaceCnt) {
}
private record DedupedConflicts(int processCnt, int replaceCnt) {}
private DedupedConflicts doDedupeConflicts(DataType dataType) {
@ -4761,7 +4803,6 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
resolvedDt.postPointerResolve(resolvePair.definitionDt, handler);
}
}
// TODO: catch exceptions if needed
finally {
resolvedDt.resolving = false;
resolvedDt.pointerPostResolveRequired = false;

View file

@ -435,7 +435,7 @@ public abstract class ProgramBasedDataTypeManagerDB extends DataTypeManagerDB
Address addr = data.getAddress();
for (Data parent = data.getParent(); parent != null; parent = parent.getParent()) {
DataType dataType = parent.getDataType();
if (!(dataType instanceof Array a)) {
if (!(dataType instanceof Array)) {
break;
}
addr = parent.getAddress();

View file

@ -266,6 +266,10 @@ public class ProgramDataTypeManager extends ProgramBasedDataTypeManagerDB implem
// use could be an issue.
try {
// TODO: Should use replacement type instead of clearing
// Note: use of DUMMY here is intentional, since we do not want to interrupt the
// deleting of these types, as they may have a relationship that we wish to preserve.
// All need to be deleted to remain in a consistent state.
program.getCodeManager().clearData(deletedIds, TaskMonitor.DUMMY);
}
catch (CancelledException e) {

View file

@ -210,7 +210,7 @@ public final class BuiltInDataTypeManager extends StandAloneDataTypeManager {
}
@Override
public boolean remove(DataType dataType, TaskMonitor monitor) {
public boolean remove(DataType dataType) {
throw new UnsupportedOperationException();
}

View file

@ -90,9 +90,9 @@ public interface DataTypeManager {
public boolean containsCategory(CategoryPath path);
/**
* Returns a unique name not currently used by any other dataType or category
* Returns a unique name not currently used by any other data type or category
* with the same baseName. This does not produce a conflict name and is intended
* to be used when generating an artifical datatype name only (e.g., {@code temp_1},
* to be used when generating an artificial data type name only (e.g., {@code temp_1},
* {@code temp_2}; for {@code baseName="temp"}.
*
* @param path the path of the name
@ -102,12 +102,11 @@ public interface DataTypeManager {
public String getUniqueName(CategoryPath path, String baseName);
/**
* Returns a dataType that is "in" (ie suitable implementation) this
* Manager, creating a new one if necessary. Also the returned dataType
* will be in a category in this dataTypeManager that is equivalent to the
* category of the passed in dataType.
* Returns a data type that is "in" this Manager, creating a new one if necessary. Also the
* returned data type will be in a category in this manager that is equivalent to the
* category of the passed in data type.
* @param dataType the dataType to be resolved.
* @param handler used to resolve conflicts with existing dataTypes.
* @param handler used to resolve conflicts with existing data types.
* @return an equivalent dataType that "belongs" to this dataTypeManager.
*/
public DataType resolve(DataType dataType, DataTypeConflictHandler handler);
@ -315,16 +314,42 @@ public interface DataTypeManager {
* converted to the {@link DataType#DEFAULT default 'undefined' datatype}. Any use within
* a {@link Structure} or {@link Union} will be converted to the {@link BadDataType} as
* a placeholder to retain the component's field name and length (the comment will be prefixed
* with a message indicating the remval of the old datatype.
* with a message indicating the removal of the old datatype.
*
* @param dataType the dataType to be removed
* @param monitor the task monitor
* @param dataType the data type to be removed
* @return true if the data type existed and was removed
*/
public boolean remove(DataType dataType, TaskMonitor monitor);
public boolean remove(DataType dataType);
/**
* Return true if the given dataType exists in this data type manager
* Deprecated. Use {@link #remove(DataType)}.
* @param dataType the data type
* @param monitor the monitor
* @return true if the data type existed and was removed
* @deprecated use {@link #remove(DataType)}
*/
@Deprecated(since = "10.4", forRemoval = true)
public default boolean remove(DataType dataType, TaskMonitor monitor) {
return remove(dataType);
}
/**
* Remove the given data types from this manager.
* <br>
* NOTE: Any use of the specified data types within a {@link FunctionDefinition} will be
* converted to the {@link DataType#DEFAULT default 'undefined' datatype}. Any use within
* a {@link Structure} or {@link Union} will be converted to the {@link BadDataType} as
* a placeholder to retain the component's field name and length (the comment will be prefixed
* with a message indicating the removal of the old datatype.
*
* @param dataTypes the data types to be removed
* @param monitor the monitor
* @throws CancelledException if the user cancels
*/
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException;
/**
* Return true if the given data type exists in this data type manager
*
* @param dataType the type
* @return true if the type is in this manager

View file

@ -26,7 +26,6 @@ import ghidra.program.model.symbol.*;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.InvalidInputException;
import ghidra.util.task.TaskMonitor;
public class DataTypeSymbol {
private Symbol sym; // Traditional symbol object
@ -151,7 +150,7 @@ public class DataTypeSymbol {
}
// remove unused override signature
program.getDataTypeManager().remove(getDataType(), TaskMonitor.DUMMY);
program.getDataTypeManager().remove(getDataType());
}
public static DataTypeSymbol readSymbol(String cat, Symbol s) {

View file

@ -27,8 +27,6 @@ import generic.test.AbstractGenericTest;
import ghidra.program.model.data.*;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter;
public class StructureDBTest extends AbstractGenericTest {
@ -65,7 +63,7 @@ public class StructureDBTest extends AbstractGenericTest {
private void transitionToBigEndian() {
Structure structClone = struct.clone(null);
dataMgr.remove(struct, TaskMonitor.DUMMY);
dataMgr.remove(struct);
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
dataOrg.setBigEndian(true);
@ -1167,7 +1165,7 @@ public class StructureDBTest extends AbstractGenericTest {
"Length: 8 Alignment: 1", struct);
//@formatter:on
dataMgr.remove(dataMgr.resolve(IntegerDataType.dataType, null), TaskMonitor.DUMMY);
dataMgr.remove(dataMgr.resolve(IntegerDataType.dataType, null));
//@formatter:off
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
@ -1208,7 +1206,7 @@ public class StructureDBTest extends AbstractGenericTest {
"Length: 11 Alignment: 1", struct);
//@formatter:on
dataMgr.remove(td, TaskMonitor.DUMMY);
dataMgr.remove(td);
//@formatter:off
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +
@ -1841,7 +1839,7 @@ public class StructureDBTest extends AbstractGenericTest {
"Length: 13 Alignment: 1", struct);
//@formatter:on
dt.getDataTypeManager().remove(dt, new TaskMonitorAdapter());
dt.getDataTypeManager().remove(dt);
//@formatter:off
CompositeTestUtils.assertExpectedComposite(this, "/Test\n" +

View file

@ -23,7 +23,6 @@ import com.google.common.collect.Sets;
import generic.test.AbstractGenericTest;
import ghidra.program.model.data.*;
import ghidra.util.task.TaskMonitor;
public class UnionDBTest extends AbstractGenericTest {
@ -59,7 +58,7 @@ public class UnionDBTest extends AbstractGenericTest {
private void transitionToBigEndian() {
Union unionClone = union.clone(null);
dataMgr.remove(union, TaskMonitor.DUMMY);
dataMgr.remove(union);
DataOrganizationImpl dataOrg = (DataOrganizationImpl) dataMgr.getDataOrganization();
dataOrg.setBigEndian(true);
@ -272,7 +271,7 @@ public class UnionDBTest extends AbstractGenericTest {
"Length: 4 Alignment: 1", union);
//@formatter:on
dataMgr.remove(td, TaskMonitor.DUMMY);
dataMgr.remove(td);
//@formatter:off
CompositeTestUtils.assertExpectedComposite(this, "/TestUnion\n" +

View file

@ -191,7 +191,12 @@ public class TestDoubleDataTypeManager implements DataTypeManager {
}
@Override
public boolean remove(DataType dataType, TaskMonitor monitor) {
public boolean remove(DataType dataType) {
throw new UnsupportedOperationException();
}
@Override
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
throw new UnsupportedOperationException();
}

View file

@ -190,11 +190,16 @@ public class TestDummyDataTypeManager implements DataTypeManager {
}
@Override
public boolean remove(DataType dataType, TaskMonitor monitor) {
public boolean remove(DataType dataType) {
// stub
return false;
}
@Override
public void remove(List<DataType> dataTypes, TaskMonitor monitor) throws CancelledException {
// stub
}
@Override
public boolean contains(DataType dataType) {
// stub