private void mergeExternalDetail(int type, ExternalLocation resultExternalLocation,
			ExternalLocation fromExternalLocation, TaskMonitor monitor) throws CancelledException {

		monitor.checkCancelled();

		// See if both changed to same value.
		switch (type) {
			case EXTERNAL_NAMESPACE:
				replaceNamespace(resultExternalLocation, fromExternalLocation, monitor);
				return;
			case EXTERNAL_LABEL:
				// TODO: The order of detail merge could be problematic since we can't set 
				// default label if EXTERNAL_ADDRESS is currently null.  
				String fromLabel = fromExternalLocation.getLabel();
				SourceType resultSource = resultExternalLocation.getSource();
				SourceType fromSource = fromExternalLocation.getSource();
				// If both are DEFAULT then no name to merge.
				if (resultSource == SourceType.DEFAULT && fromSource == SourceType.DEFAULT) {
					return; // Just return since default names may not match each other by their text.
				}
				try {
					resultExternalLocation.getSymbol().setName(fromLabel, fromSource);
				}
				catch (DuplicateNameException e) {
					throw new AssertException("Can't happen now that duplicates are allowed");
				}
				catch (InvalidInputException e) {
					Msg.error(this,
						"Couldn't merge external location name '" + fromLabel + "'. " + e);
					return;
				}
				return;
			case EXTERNAL_ADDRESS:
				// TODO: The order of detail merge could be problematic since we can't set 
				// null address if EXTERNAL_LABEL is currently null/default.
				Address address = fromExternalLocation.getAddress();
				try {
					resultExternalLocation.setAddress(address);
				}
				catch (InvalidInputException e) {
					String message = "Couldn't set memory address " +
						(address != null ? address.toString(true) : "(null)") + " for external '" +
						resultExternalLocation.getLabel() + "'.";
					errorBuf.append(message);
					Msg.error(this, message, e);
				}
				return;
			case EXTERNAL_DATA_TYPE:
				replaceExternalDataType(resultExternalLocation, fromExternalLocation, monitor);
				return;
//				// Source Type is handled by the Label.
//			case EXTERNAL_SOURCE_TYPE:
//				SourceType source = fromExternalLocation.getSource();
//				try {
//					toExternalLocation.setLocation(toExternalLocation.getLabel(),
//						toExternalLocation.getAddress(), source);
//				}
//				catch (DuplicateNameException e) {
//					e.printStackTrace();
//				}
//				catch (InvalidInputException e) {
//					e.printStackTrace();
//				}
//				return;
		}
	}
@param entry
@param type (FUNC_RETURN_TYPE, FUNC_RETURN_ADDRESS_OFFSET,
FUNC_PARAMETER_OFFSET, FUNC_LOCAL_SIZE, FUNC_STACK_PURGE_SIZE, FUNC_NAME, FUNC_INLINE,
FUNC_NO_RETURN, FUNC_CALLING_CONVENTION)
@param latestMyChanges
@param originalLatestChanges
@param originalMyChanges
@param monitor
@return
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalFunctionMerger.java