diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/DefaultDataTypeManagerService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/DefaultDataTypeManagerService.java index 90bea47e2b..e1c6a94776 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/DefaultDataTypeManagerService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/DefaultDataTypeManagerService.java @@ -25,6 +25,7 @@ import ghidra.app.plugin.core.datamgr.archive.DefaultDataTypeArchiveService; import ghidra.app.services.DataTypeManagerService; import ghidra.program.model.data.*; import ghidra.util.HelpLocation; +import ghidra.util.task.TaskMonitor; // FIXME!! TESTING public class DefaultDataTypeManagerService extends DefaultDataTypeArchiveService @@ -64,6 +65,26 @@ public class DefaultDataTypeManagerService extends DefaultDataTypeArchiveService throw new UnsupportedOperationException(); } + @Override + public List getDataTypesByPath(DataTypePath path) { + throw new UnsupportedOperationException(); + } + + @Override + public DataType getProgramDataTypeByPath(DataTypePath path) { + throw new UnsupportedOperationException(); + } + + @Override + public DataType promptForDataType(String filterText) { + throw new UnsupportedOperationException(); + } + + @Override + public List findDataTypes(String name, TaskMonitor monitor) { + throw new UnsupportedOperationException(); + } + @Override public DataType getDataType(TreePath selectedTreeNode) { if (selectedTreeNode == null) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java index 75e3480668..a84032e2ea 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java @@ -84,7 +84,7 @@ import ghidra.util.task.TaskMonitor; description = "Provides the window for managing and categorizing dataTypes. " + "The datatype display shows all built-in datatypes, datatypes in the " + "current program, and datatypes in all open archives.", - servicesProvided = { DataTypeManagerService.class, DataTypeArchiveService.class } + servicesProvided = { DataTypeManagerService.class, DataTypeQueryService.class, DataTypeArchiveService.class } ) //@formatter:on public class DataTypeManagerPlugin extends ProgramPlugin @@ -519,6 +519,59 @@ public class DataTypeManagerPlugin extends ProgramPlugin @Override public DataType getDataType(String filterText) { + return promptForDataType(filterText); + } + + @Override + public List findDataTypes(String dtName, TaskMonitor monitor) { + List results = new ArrayList<>(); + DataTypeManager[] managers = getDataTypeManagers(); + + // we put the program's data types at the front of the list so clients can tell if the + // types we have found already exist in the program + DataTypeManager pdtm = getProgramDataTypeManager(); + pdtm.findDataTypes(dtName, results); + for (DataTypeManager manager : managers) { + if (!(manager instanceof ProgramDataTypeManager)) { + manager.findDataTypes(dtName, results); + } + } + return results; + } + + @Override + public List getDataTypesByPath(DataTypePath path) { + List results = new ArrayList<>(); + DataTypeManager[] managers = getDataTypeManagers(); + for (DataTypeManager manager : managers) { + DataType dt = manager.getDataType(path); + if (dt == null) { + continue; + } + + if (manager instanceof ProgramDataTypeManager) { + // we put the program's data type at the front of the list so clients can tell if + // the types we have found already exist in the program + results.add(0, dt); + } + else { + results.add(dt); + } + } + return results; + } + + @Override + public DataType getProgramDataTypeByPath(DataTypePath path) { + DataTypeManager pdtm = getProgramDataTypeManager(); + if (pdtm == null) { + return null; + } + return pdtm.getDataType(path); + } + + @Override + public DataType promptForDataType(String filterText) { DataTypeChooserDialog dialog = new DataTypeChooserDialog(this); if (!StringUtils.isBlank(filterText)) { dialog.showPrepopulatedDialog(tool, filterText); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeArchiveService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeArchiveService.java index 3da219b6f6..f6969e1b02 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeArchiveService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeArchiveService.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -31,8 +31,7 @@ import ghidra.util.exception.VersionException; import ghidra.util.task.TaskMonitor; /** - * A service that manages a set of data type archives, allowing re-use of already open - * archives. + * A service that manages a set of data type archives, allowing re-use of already open archives. */ //@formatter:off @ServiceInfo( @@ -95,12 +94,12 @@ public interface DataTypeArchiveService { * Opens the specified project-located data type archive. * * @param domainFile archive file located in the current project - * @param monitor {@link TaskMonitor} to display progess during the opening + * @param monitor {@link TaskMonitor} to display progress during the opening * @return the data type archive * @throws IOException if an i/o error occurs opening the data type archive * @throws DuplicateIdException if another archive with the same ID is already open - * @throws VersionException - * @throws CancelledException + * @throws VersionException if there is a version exception + * @throws CancelledException if the user cancels */ public DataTypeManager openArchive(DomainFile domainFile, TaskMonitor monitor) throws VersionException, CancelledException, IOException, DuplicateIdException; @@ -128,5 +127,4 @@ public interface DataTypeArchiveService { public Archive openArchive(File file, boolean acquireWriteLock) throws IOException, DuplicateIdException; - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeQueryService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeQueryService.java index c4a93a03ea..ee3ac22f16 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeQueryService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/services/DataTypeQueryService.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,11 +17,16 @@ package ghidra.app.services; import java.util.List; +import ghidra.program.database.data.DataTypeUtilities; import ghidra.program.model.data.*; +import ghidra.util.task.TaskMonitor; /** - * Simplified datatype service interface to provide query capabilities - * to a set of open datatype managers + * Simplified datatype service interface to provide query capabilities to a set of open datatype + * managers. + * + * @see DataTypeUtilities + * @see DataTypeManagerService */ public interface DataTypeQueryService { @@ -36,16 +41,59 @@ public interface DataTypeQueryService { public List getSortedDataTypeList(); /** - * Obtain the preferred datatype which corresponds to the specified - * datatype specified by filterText. A tool-based service provider - * may prompt the user to select a datatype if more than one possibility - * exists. + * This method simply calls {@link #promptForDataType(String)} + * @deprecated use {@link #promptForDataType(String)} + */ + @SuppressWarnings("javadoc") + @Deprecated(since = "11.5", forRemoval = true) + public DataType getDataType(String filterText); + + /** + * Prompts the user for a data type. The optional filter text will be used to filter the tree + * of available types. * * @param filterText If not null, this text filters the visible data types to only show those * that start with the given text * @return the preferred data type (e.g., chosen by the user) or null if no match found * or selection was cancelled by user. */ - public DataType getDataType(String filterText); + public DataType promptForDataType(String filterText); + + /** + * Finds all data types matching the given name. This method will search all open data type + * archives. + *

+ * Unlike {@link DataTypeManagerService#findDataTypes(String, TaskMonitor)}, this method will + * not return {@code .conflict} data types. If you need those types, then you must call each + * data type manager directly. + *

+ * In the list of types returned, the program data type manager's types will be in the list + * before types from other archives. + * + * @param name the data type name to find + * @param monitor the task monitor + * @return the data types + * @see DataTypeManagerService#getDataTypeManagers() + */ + public List findDataTypes(String name, TaskMonitor monitor); + + /** + * Get the data type for the given data type path. + *

+ * This method will check each open data type manager for a data type that matches the path. + *

+ * If a type is in the program data type manager, then it will be first in the returned list. + * + * @param path the path + * @return the data type + */ + public List getDataTypesByPath(DataTypePath path); + + /** + * Get the data type for the given data type path from the program's data type manager. + * @param path the path + * @return the data type; null if the type does not exist + */ + public DataType getProgramDataTypeByPath(DataTypePath path); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java index 0cc409fc72..0474f0fed0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java @@ -379,17 +379,13 @@ public class DemangledDataType extends DemangledType { static DataType findDataType(DataTypeManager dataTypeManager, Demangled namespace, String dtName) { - // TODO: add support for use of Program.getPreferredRootNamespaceCategoryPath when - // searching for datatypes - List list = new ArrayList<>(); dataTypeManager.findDataTypes(dtName, list); if (list.isEmpty()) { return null; } - //use the datatype that exists in the root category, - //otherwise just pick the first one... + // use the datatype that exists in the root category, otherwise just pick the first one DataType anyDt = null; DataType preferredDataType = null; for (DataType existingDT : list) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/parser/FunctionSignatureParser.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/parser/FunctionSignatureParser.java index fc311a53bf..63f631d3ce 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/parser/FunctionSignatureParser.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/parser/FunctionSignatureParser.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,6 +28,7 @@ import ghidra.program.model.listing.FunctionSignature; import ghidra.util.data.DataTypeParser; import ghidra.util.data.DataTypeParser.AllowedDataTypes; import ghidra.util.exception.CancelledException; +import ghidra.util.task.TaskMonitor; /** * Class for parsing function signatures. This class attempts to be much more @@ -353,9 +354,14 @@ public class FunctionSignatureParser { @Override public DataType getDataType(String filterText) { + return promptForDataType(filterText); + } + + @Override + public DataType promptForDataType(String filterText) { DataType dt = dtCache.get(filterText); if (dt == null) { - dt = service.getDataType(filterText); + dt = service.promptForDataType(filterText); if (dt != null) { dtCache.put(filterText, dt); } @@ -363,5 +369,19 @@ public class FunctionSignatureParser { return dt; } + @Override + public List getDataTypesByPath(DataTypePath path) { + return service.getDataTypesByPath(path); + } + + @Override + public DataType getProgramDataTypeByPath(DataTypePath path) { + return service.getProgramDataTypeByPath(path); + } + + @Override + public List findDataTypes(String name, TaskMonitor monitor) { + return service.findDataTypes(name, monitor); + } } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/util/data/DataTypeParser.java b/Ghidra/Features/Base/src/main/java/ghidra/util/data/DataTypeParser.java index a4c0f7dbd2..e78b1fcd17 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/util/data/DataTypeParser.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/util/data/DataTypeParser.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -379,7 +379,6 @@ public class DataTypeParser { // give up and ask the user return proptUserForType(baseName); - } private DataType proptUserForType(String baseName) throws CancelledException { @@ -388,7 +387,7 @@ public class DataTypeParser { return null; } - DataType dt = dataTypeManagerService.getDataType(baseName); + DataType dt = dataTypeManagerService.promptForDataType(baseName); if (dt == null) { throw new CancelledException(); } @@ -483,7 +482,8 @@ public class DataTypeParser { continue; } - char n = nextIndex + 1 < dataTypeString.length() ? dataTypeString.charAt(nextIndex + 1) : '\0'; + char n = nextIndex + 1 < dataTypeString.length() ? dataTypeString.charAt(nextIndex + 1) + : '\0'; if (c == ':' && n == ':') { nextIndex += 2; continue; diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/datamgr/FavoritesAndMiscTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/datamgr/FavoritesAndMiscTest.java index 4924687ec2..0e4d6134e7 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/datamgr/FavoritesAndMiscTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/datamgr/FavoritesAndMiscTest.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -181,8 +181,8 @@ public class FavoritesAndMiscTest extends AbstractGhidraHeadedIntegrationTest { List dts = changeListener.getFavoriteDts(); boolean found = false; - for (int i = 0; i < dts.size(); i++) { - if (dts.get(i).getName().equals("PascalUnicode")) { + for (DataType dt : dts) { + if (dt.getName().equals("PascalUnicode")) { found = true; break; } @@ -198,8 +198,8 @@ public class FavoritesAndMiscTest extends AbstractGhidraHeadedIntegrationTest { waitForSwing(); dts = changeListener.getFavoriteDts(); - for (int i = 0; i < dts.size(); i++) { - if (dts.get(i).getName().equals("MBCString")) { + for (DataType dt : dts) { + if (dt.getName().equals("MBCString")) { Assert.fail("Should not have found MBCString as a favorite!"); } } @@ -338,7 +338,7 @@ public class FavoritesAndMiscTest extends AbstractGhidraHeadedIntegrationTest { program.flushEvents(); waitForSwing(); - runSwing(() -> plugin.getDataType("ArrayStruct"), false); + runSwing(() -> plugin.promptForDataType("ArrayStruct"), false); DataTypeChooserDialog d = waitForDialogComponent(DataTypeChooserDialog.class); diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/util/parser/FunctionSignatureParserTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/util/parser/FunctionSignatureParserTest.java index 3c50b0a372..3bcf031939 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/util/parser/FunctionSignatureParserTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/util/parser/FunctionSignatureParserTest.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -66,6 +66,11 @@ public class FunctionSignatureParserTest extends AbstractGhidraHeadedIntegration @Override public DataType getDataType(String filterText) { + return promptForDataType(filterText); + } + + @Override + public DataType promptForDataType(String filterText) { // method only called if no results or multiple results were found. // Tool based implementation will prompt user, test will pick last one ArrayList list = new ArrayList<>(); diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/program/database/data/DataManagerTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/program/database/data/DataManagerTest.java index 883c4980c3..2cd724917c 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/program/database/data/DataManagerTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/program/database/data/DataManagerTest.java @@ -26,6 +26,7 @@ import ghidra.program.database.ProgramDB; import ghidra.program.model.data.*; import ghidra.test.AbstractGhidraHeadedIntegrationTest; import ghidra.util.InvalidNameException; +import ghidra.util.Msg; import ghidra.util.task.TaskMonitor; public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest { @@ -98,11 +99,17 @@ public class DataManagerTest extends AbstractGhidraHeadedIntegrationTest { dataMgr.resolve(new EnumDataType(s3.getCategoryPath(), "Enum", 2), null); dataMgr.resolve(new EnumDataType(s3.getCategoryPath(), "Enum", 2), null); - ArrayList list = new ArrayList(); - dataMgr.findDataTypes("Enum", list); + dataMgr.resolve(new EnumDataType(s3.getCategoryPath(), "zEnum", 2), null); + dataMgr.resolve(new EnumDataType(s3.getCategoryPath(), "zEnum2", 2), null); + List list = new ArrayList(); + dataMgr.findDataTypes("Enum", list); assertEquals(3, list.size()); + list.clear(); + dataMgr.findDataTypes("Enum1", list); + Msg.debug(this, "dts: " + list); + Category c1 = root.createCategory("c1"); dataMgr.resolve(new EnumDataType(c1.getCategoryPath(), "Enum", 2), null); diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/services/TestDoubleDataTypeManagerService.java b/Ghidra/Features/Base/src/test/java/ghidra/app/services/TestDoubleDataTypeManagerService.java index 2894899d7f..e092b68769 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/services/TestDoubleDataTypeManagerService.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/services/TestDoubleDataTypeManagerService.java @@ -54,6 +54,26 @@ public class TestDoubleDataTypeManagerService implements DataTypeManagerService throw new UnsupportedOperationException(); } + @Override + public DataType promptForDataType(String filterText) { + throw new UnsupportedOperationException(); + } + + @Override + public List getDataTypesByPath(DataTypePath path) { + throw new UnsupportedOperationException(); + } + + @Override + public DataType getProgramDataTypeByPath(DataTypePath path) { + throw new UnsupportedOperationException(); + } + + @Override + public List findDataTypes(String name, TaskMonitor monitor) { + throw new UnsupportedOperationException(); + } + @Override public DataTypeManager getBuiltInDataTypesManager() { throw new UnsupportedOperationException(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/ServiceInterfaceImplementationPair.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/ServiceInterfaceImplementationPair.java index f518646f63..8ab8b8341f 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/ServiceInterfaceImplementationPair.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/ServiceInterfaceImplementationPair.java @@ -1,13 +1,12 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,11 +15,19 @@ */ package ghidra.framework.plugintool; +import generic.json.Json; + public class ServiceInterfaceImplementationPair { public Class interfaceClass; public Object provider; + public ServiceInterfaceImplementationPair(Class interfaceClass, Object provider) { this.interfaceClass = interfaceClass; this.provider = provider; } + + @Override + public String toString() { + return Json.toString(this); + } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java index 81127cc1f0..aa54528a73 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java @@ -25,6 +25,8 @@ import java.util.regex.Pattern; import javax.help.UnsupportedOperationException; +import org.apache.commons.lang3.StringUtils; + import db.*; import db.util.ErrorHandler; import generic.jar.ResourceFile; @@ -2098,32 +2100,37 @@ abstract public class DataTypeManagerDB implements DataTypeManager { @Override public void findDataTypes(String name, List list) { - if (name == null || name.length() == 0) { + if (StringUtils.isBlank(name)) { return; } if (name.equals(DataType.DEFAULT.getName())) { list.add(DataType.DEFAULT); return; } + // ignore .conflict in both name and result matches lock.acquire(); try { buildSortedDataTypeList(); // Use exemplar datatype in root category without .conflict to position at start // of possible matches - name = DataTypeUtilities.getNameWithoutConflict(name); + String baseName = DataTypeUtilities.getNameWithoutConflict(name); DataType compareDataType = - new TypedefDataType(CategoryPath.ROOT, name, DataType.DEFAULT, this); + new TypedefDataType(CategoryPath.ROOT, baseName, DataType.DEFAULT, this); int index = Collections.binarySearch(sortedDataTypes, compareDataType, nameComparator); if (index < 0) { + // this allows us to find foo.conflict types index = -index - 1; } + // add all matches to list while (index < sortedDataTypes.size()) { DataType dt = sortedDataTypes.get(index); - if (!name.equals(DataTypeUtilities.getNameWithoutConflict(dt, false))) { - break; + String baseDtName = DataTypeUtilities.getNameWithoutConflict(dt, false); + if (!baseName.equals(baseDtName)) { + break; // not foo or foo.conflict } + list.add(dt); ++index; } @@ -2143,9 +2150,9 @@ abstract public class DataTypeManagerDB implements DataTypeManager { list.add(DataType.DEFAULT); return; } - if (monitor == null) { - monitor = TaskMonitor.DUMMY; - } + + monitor = TaskMonitor.dummyIfNull(monitor); + Pattern regexp = UserSearchUtils.createSearchPattern(name, caseSensitive); lock.acquire(); try { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeUtilities.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeUtilities.java index ec2754177e..86a47cf0d8 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeUtilities.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeUtilities.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -698,7 +698,7 @@ public class DataTypeUtilities { * @param dtName datatype name * @param classConstraint type of datatype by its interface class (e.g., {@link Structure}). * @param parentNamespacePreferred if true matching on parent namespace is - * enabled and preferred over match on actual namespace. This is relavent for + * enabled and preferred over match on actual namespace. This is relevant for * class structure searching. * @return preferred datatype match if found */ diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManager.java index 79311bd1e7..da1629d454 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataTypeManager.java @@ -169,11 +169,10 @@ public interface DataTypeManager { public Iterator getAllFunctionDefinitions(); /** - * Begin searching at the root category for all data types with the - * given name. Places all the data types in this data type manager - * with the given name into the list. Presence of {@code .conflict} - * extension will be ignored for both specified name and returned - * results. + * Begin searching at the root category for all data types with the given name. Places all the + * data types in this data type manager with the given name into the list. The presence of + * {@code .conflict} extension will be ignored and thus included in the results. + * * @param name name of the data type (wildcards are not supported and will be treated * as explicit search characters) * @param list list that will be populated with matching DataType objects @@ -181,9 +180,13 @@ public interface DataTypeManager { public void findDataTypes(String name, List list); /** - * Begin searching at the root category for all data types with names - * that match the given name that may contain wildcards using familiar globbing - * characters '*' and '?'. + * Begin searching at the root category for all data types with names that match the given name + * that may contain wildcards using familiar globbing characters '*' and '?'. + *

+ * Unlike {@link #findDataTypes(String, List)}, data types with a {@code .conflict} extension + * will not be included in the results of this method unless they explicitly match the provided + * name. + * * @param name name to match; may contain wildcards * @param list list that will be populated with matching DataType objects * @param caseSensitive true if the match is case sensitive @@ -421,7 +424,7 @@ public interface DataTypeManager { * transaction is ended. *

* NOTE: Use of rollback ({@code commit=false} should be avoided unless absolutely - * neccessary since it will incur overhead to revert changes and may rollback multiple + * necessary since it will incur overhead to revert changes and may rollback multiple * concurrent transactions if they exist. *

* NOTE: If this manager is part of a larger {@link DomainObject} its transactions may become @@ -630,7 +633,7 @@ public interface DataTypeManager { public SourceArchive getLocalSourceArchive(); /** - * Change the given data type and its dependencies so thier source archive is set to + * Change the given data type and its dependencies so their source archive is set to * given archive. Only those data types not already associated with a source archive * will be changed. *