private void determineDetailedFunctionConflicts(ExternalLocation[] externalLocations,
			TaskMonitor monitor) throws CancelledException {

		Function[] functions = new Function[4];
		functions[RESULT] = externalLocations[RESULT].getFunction();
		functions[LATEST] = externalLocations[LATEST].getFunction();
		functions[MY] = externalLocations[MY].getFunction();
		functions[ORIGINAL] =
			(externalLocations[ORIGINAL] != null) ? externalLocations[ORIGINAL].getFunction()
					: null;
		boolean noLatestFunction = (functions[LATEST] == null);
		boolean noMyFunction = (functions[MY] == null);
		boolean noOriginalFunction = (functions[ORIGINAL] == null);

		// If both removed it then the function should already be auto-merged.
		if (noLatestFunction && noMyFunction) {
			throw new AssertException("Shouldn't be here! Something is wrong.");
		}

		// If one removed it and one changed it, then save a remove function conflict.
		if (!noOriginalFunction && (noLatestFunction != noMyFunction)) {
			long originalID = externalLocations[ORIGINAL].getSymbol().getID();
			saveExternalRemoveFunctionConflict(originalID);
			return;
		}

		// Determine function conflicts and auto-merge changes that aren't in conflict.
		determineFunctionConflicts(functions, true, monitor);

		// If only one added then the function should already be auto-merged.
		if (noOriginalFunction && (noLatestFunction || noMyFunction)) {
			throw new AssertException(
				"Shouldn't be here! It looks like only Latest or My added the function.");
		}
	}
<CODE>replaceExternalDataType</CODE> replaces the data type of the
external label in program1 with the data type of the external label in program2
at the specified external space address.
@param resultExternalLocation
@param fromExternalLocation
@param monitor the task monitor for notifying the user of this merge's progress.
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalFunctionMerger.java