private DataType getHighestPriorityDataType(DataType fromDataType, DataType toDataType,
			boolean onlyReplaceUndefineds) {
		// Priority from highest to lowest is Defined, Undefined with size, Default.
		boolean fromIsDefault = fromDataType == DataType.DEFAULT;
		boolean toIsDefault = toDataType == DataType.DEFAULT;
		boolean fromIsUndefined = Undefined.isUndefined(fromDataType);
		boolean toIsUndefined = Undefined.isUndefined(toDataType);
		if (fromIsDefault) {
			return toDataType;
		}
		if (fromIsUndefined) {
			if (toIsDefault || (toIsUndefined && !onlyReplaceUndefineds)) {
				return fromDataType;
			}
			return toDataType;
		}
		// fromDataType is defined.
		if (toIsDefault || toIsUndefined || !onlyReplaceUndefineds) {
			return fromDataType;
		}
		return toDataType;
	}
@param toFunction the function whose signature we are setting.
@param markupOptions the options indicate what parts of the function signature to apply.
@param forceApply true indicates that the function signature should be applied even if the
function signature, return type, parameter data type or parameter name options are set
to "do not apply".
@throws VersionTrackingApplyException if all desired parts of the function signature couldn't be applied.
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/stringable/FunctionSignatureStringable.java