@Override
	public DataType resolve(DataType dataType, DataTypeConflictHandler handler) {

		if (dataType == DataType.DEFAULT) {
			return dataType;
		}

		if (dataType instanceof BitFieldDataType) {
			return resolveBitFieldDataType((BitFieldDataType) dataType, handler);
		}

		lock.acquire();
		DataTypeConflictHandler originalHandler = null;
		boolean isEquivalenceCacheOwner = activateEquivalenceCache();
		boolean isResolveCacheOwner = activateResolveCache();
		DataType resolvedDataType = null;
		try {
			originalHandler = currentHandler;

			if (contains(dataType)) {
				return dataType;
			}

			if (handler != null) {
				currentHandler = handler;
			}
			else if (currentHandler == null) {
				currentHandler = DataTypeConflictHandler.DEFAULT_HANDLER;
			}
			else {
				currentHandler = currentHandler.getSubsequentHandler();
			}

			resolvedDataType = getCachedResolve(dataType);
			if (resolvedDataType == null) {
				SourceArchive sourceArchive = dataType.getSourceArchive();
				if (sourceArchive != null &&
					sourceArchive.getArchiveType() == ArchiveType.BUILT_IN) {
					resolvedDataType = resolveBuiltIn(dataType);
				}
				else if (sourceArchive == null || dataType.getUniversalID() == null) {
					// if the dataType has no source or it has no ID (datatypes with no ID are
					// always local i.e. pointers)
					resolvedDataType = resolveDataTypeNoSource(dataType);
				}
				else if (!sourceArchive.getSourceArchiveID().equals(getUniversalID()) &&
					(sourceArchive.getArchiveType() == ArchiveType.PROGRAM ||
						sourceArchive.getArchiveType() == ArchiveType.TEMPORARY)) {
					// dataTypes from a program or temporary archive don't carry over their identity
					resolvedDataType = resolveDataTypeNoSource(dataType);
				}
				else {
					resolvedDataType = resolveDataTypeWithSource(dataType);
				}
				cacheResolvedDataType(dataType, resolvedDataType);
				if (resolvedDataType instanceof DataTypeDB) {
					setCachedEquivalence((DataTypeDB) resolvedDataType, dataType);
				}
			}
		}
		finally {
			try {
				if (isResolveCacheOwner) {
					// Process resolve queue and allowed resolvedDataType to be replaced
					// during conflict processing
					resolvedDataType = processResolveQueue(true, resolvedDataType);
				}
			}
			finally {
				if (isEquivalenceCacheOwner) {
					clearEquivalenceCache();
				}
				currentHandler = originalHandler;
				lock.release();
			}
		}
		return resolvedDataType;
	}
Get the category for the given ID.

@return null if no category exists with the given ID.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java