private void createData(Address address, DataType dataType, int dataTypeLength) {

		// Ensure that we do not clear previously established code and data
		Data existingData = null;
		CodeUnit cu = applicator.getProgram().getListing().getCodeUnitContaining(address);
		if (cu != null) {
			if ((cu instanceof Instruction) || !address.equals(cu.getAddress())) {
				applicator.appendLogMsg("Warning: Did not create data type \"" +
					dataType.getName() + "\" at address " + address + " due to conflict");
				return;
			}
			Data d = (Data) cu;
			if (d.isDefined()) {
				existingData = d;
			}
		}

		if (dataType == null) {
			return;
		}
		if (dataType.getLength() <= 0 && dataTypeLength <= 0) {
			applicator.appendLogMsg("Unknown dataTypeLength specified at address " + address +
				" for " + dataType.getName());
			return;
		}

		// TODO: This is really bad logic and should be refactored
		// All conflicting data, not just the one containing address,
		// needs to be considered and not blindly cleared.

		if (existingData != null) {
			DataType existingDataType = existingData.getDataType();
			if (isEquivalent(existingData, existingData.getLength(), dataType)) {
				return;
			}
			if (isEquivalent2(existingDataType, dataType)) {
				return;
			}
			if (existingDataType.isEquivalent(dataType)) {
				return;
			}
		}
		if (existingData == null) {
			try {
				applicator.getProgram()
						.getListing()
						.clearCodeUnits(address, address.add(dataTypeLength - 1), false);
				if (dataType.getLength() == -1) {
					applicator.getProgram()
							.getListing()
							.createData(address, dataType, dataTypeLength);
				}
				else {
					applicator.getProgram().getListing().createData(address, dataType);
				}
			}
			catch (CodeUnitInsertionException e) {
				applicator.appendLogMsg("Unable to create " + dataType.getDisplayName() + " at 0x" +
					address + ": " + e.getMessage());
			}
		}
		else if (isDataReplaceable(existingData)) {
			try {
				applicator.getProgram()
						.getListing()
						.clearCodeUnits(address, address.add(dataTypeLength - 1), false);
				applicator.getProgram().getListing().createData(address, dataType, dataTypeLength);
			}
			catch (CodeUnitInsertionException e) {
				applicator.appendLogMsg("Unable to replace " + dataType.getDisplayName() +
					" at 0x" + address + ": " + e.getMessage());
			}
		}
		else {
			DataType existingDataType = existingData.getDataType();
			String existingDataTypeString =
				existingDataType == null ? "null" : existingDataType.getDisplayName();
			applicator.appendLogMsg("Warning: Did not create data type \"" +
				dataType.getDisplayName() + "\" at address " + address +
				".  Preferring existing datatype \"" + existingDataTypeString + "\"");
		}
	}
Constructor
@param applicator the {@link DefaultPdbApplicator} for which we are working.
@param symbol the symbol for this applier
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/DataSymbolApplier.java