mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-5654 - Data Type Manager - Speed improvements for deleting data types
This commit is contained in:
parent
0ebc4c9608
commit
404191cdaa
41 changed files with 381 additions and 233 deletions
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ public interface DataTypeManager {
|
|||
|
||||
/**
|
||||
* Get the program architecture information which has been associated with this
|
||||
* datatype manager. If {@link #getProgramArchitecture()} returns null this method
|
||||
* data type manager. If {@link #getProgramArchitecture()} returns null this method
|
||||
* may still return information if the program architecture was set on an archive but unable
|
||||
* to properly instantiate.
|
||||
* @return program architecture summary if it has been set
|
||||
|
@ -83,16 +83,16 @@ public interface DataTypeManager {
|
|||
public String getProgramArchitectureSummary();
|
||||
|
||||
/**
|
||||
* Returns true if the given category path exists in this datatype manager
|
||||
* Returns true if the given category path exists in this data type manager
|
||||
* @param path the path
|
||||
* @return true if the given category path exists in this datatype manager
|
||||
* @return true if the given category path exists in this data type manager
|
||||
*/
|
||||
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);
|
||||
|
@ -309,22 +308,48 @@ public interface DataTypeManager {
|
|||
public void removeInvalidatedListener(InvalidatedListener listener);
|
||||
|
||||
/**
|
||||
* Remove the given datatype from this manager.
|
||||
* Remove the given data type from this manager.
|
||||
* <br>
|
||||
* NOTE: Any use of the specified datatype 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 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
|
||||
|
@ -727,7 +752,7 @@ public interface DataTypeManager {
|
|||
public Collection<String> getDefinedCallingConventionNames();
|
||||
|
||||
/**
|
||||
* Get the default calling convention's prototype model in this datatype manager if known.
|
||||
* Get the default calling convention's prototype model in this data type manager if known.
|
||||
*
|
||||
* @return the default calling convention prototype model or null.
|
||||
*/
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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" +
|
||||
|
|
|
@ -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" +
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue