public DataType getDataType(DataTypeManager dataTypeManager) {
		String name = getName();
		if (name == null) {
			return DataType.DEFAULT;
		}

		DataType dt = null;

		if (namespace == null) {
			dt = getBuiltInType(dataTypeManager);
		}

		if (dt == null) {
			dt = findDataType(dataTypeManager, namespace, name);

			DataType baseType = dt;
			if (dt instanceof TypeDef) {
				baseType = ((TypeDef) dt).getBaseDataType();
			}

			if (isStruct()) {
				if (baseType == null || !(baseType instanceof Structure)) {
					// Fill it with nonsense
					dt = createPlaceHolderStructure(name, getNamespace());
				}
			}
			else if (isUnion()) {
				if (baseType == null || !(baseType instanceof Union)) {
					dt = new UnionDataType(getDemanglerCategoryPath(getNamespace()), name);
				}
			}
			else if (isEnum()) {
				if (baseType == null || !(baseType instanceof Enum)) {

					if (enumType == null || INT.equals(enumType) || UNSIGNED_INT.equals(enumType)) {
						// Can't tell how big an enum is, just use the size of a pointer
						dt = new EnumDataType(getDemanglerCategoryPath(getNamespace()), name,
							dataTypeManager.getDataOrganization().getIntegerSize());
					}
					else if (CHAR.equals(enumType) || UNSIGNED_CHAR.equals(enumType)) {
						dt = new EnumDataType(getDemanglerCategoryPath(getNamespace()), name,
							dataTypeManager.getDataOrganization().getCharSize());

					}
					else if (SHORT.equals(enumType) || UNSIGNED_SHORT.equals(enumType)) {
						dt = new EnumDataType(getDemanglerCategoryPath(getNamespace()), name,
							dataTypeManager.getDataOrganization().getShortSize());

					}
					else if (LONG.equals(enumType) || UNSIGNED_LONG.equals(enumType)) {
						dt = new EnumDataType(getDemanglerCategoryPath(getNamespace()), name,
							dataTypeManager.getDataOrganization().getLongSize());
					}
					else {
						dt = new EnumDataType(getDemanglerCategoryPath(getNamespace()), name,
							dataTypeManager.getDataOrganization().getIntegerSize());
					}
				}
			}
			else if (isClass() || name.equals(STRING)) {
				if (baseType == null || !(baseType instanceof Structure)) {
					// try creating empty structures for unknown types instead.
					dt = createPlaceHolderStructure(name, getNamespace());
				}
			}
			else if (dt == null) {

				// I don't know what this is
				// If it isn't pointed to, or isn't a referent, then assume undefined typedef.
				if (!(isReference() || isPointer())) { // Unknown type
					dt = new TypedefDataType(getDemanglerCategoryPath(getNamespace()), name,
						DataType.DEFAULT);
				}
				else {
					// try creating empty structures for unknown types instead.
					dt = createPlaceHolderStructure(name, getNamespace());
				}
			}

		}

		int numPointers = getPointerLevels();

		for (int i = 0; i < numPointers; ++i) {
			dt = PointerDataType.getPointer(dt, dataTypeManager);
		}

		if (isLValueReference()) {
			// Placeholder in prep for more lref work
			dt = PointerDataType.getPointer(dt, dataTypeManager);
		}
		else if (isRValueReference()) {
			// Placeholder in prep for more rref work
			dt = PointerDataType.getPointer(dt, dataTypeManager);
		}

		return dt;
	}
Converts this demangled datatype into the corresponding Ghidra datatype
@param dataTypeManager the manager to search and whose data organization should be used
@return the Ghidra datatype corresponding to the demangled datatype
Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java