private DataType resolveDataTypeWithSource(DataType dataType) {

		SourceArchive sourceArchive = dataType.getSourceArchive();

		// Do we have that dataType already resolved and associated with the source archive?
		DataType existingDataType = getDataType(sourceArchive, dataType.getUniversalID());
		if (existingDataType != null) {
			if (!DataTypeDB.isEquivalent(existingDataType, dataType, currentHandler) &&
				currentHandler.shouldUpdate(dataType, existingDataType)) {
				existingDataType.replaceWith(dataType);
				existingDataType.setLastChangeTime(dataType.getLastChangeTime());
			}
			return existingDataType;
		}

		if (sourceArchive.getSourceArchiveID().equals(getUniversalID())) {
			// Avoid conflict handling for types with a source which matches
			// this archive, although a conflict name may still be used.  
			// This can occur when a semi-mirrored archive instance is used
			// such as the CompositeViewerDataTypeManager or Program Merge 
			// which uses the same Archive UniversalID.
			return createConflictDataType(dataType, sourceArchive);
		}

		// If we have the same path name and the existing data type is a local data type
		// and is equivalent to this one, then associate it with the source archive
		existingDataType = findEquivalentDataTypeSameLocation(dataType);
		if (existingDataType != null) {
			if (isLocalSource(existingDataType)) {
				// If we have an equivalent local data type associate it with the source archive
				replaceEquivalentLocalWithSourceDataType(dataType, sourceArchive, existingDataType);
			}
			return existingDataType;
		}

		return resolveNoEquivalentFound(dataType, sourceArchive);
	}
Perform datatype resolution for types originating from a source archive (excludes
programs and built-in datatypes).

@param dataType the dataType for which to return an equivalent dataType in
                this manager
@return resolved datatype
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java