private Symbol createSymbol(String name, SymbolType type, Address address,
			Namespace parentNamespace, SourceType source)
			throws DuplicateNameException, InvalidInputException {
		Symbol symbol = null;
		if (type == SymbolType.LABEL) {
			if (address.isExternalAddress()) {
// FIXME Should this be passing the Namespace?
				ExternalManagerDB extMgr = (ExternalManagerDB) toProgram.getExternalManager();
				ExternalLocation addExtLocation =
					extMgr.addExtLocation(parentNamespace.getName(), name, address, source);
				return addExtLocation.getSymbol();
			}
			symbol = toSymbolTable.createLabel(address, name, parentNamespace, source);
		}
//		else if (type == SymbolType.EXTERNAL) {
//			ExternalManagerDB extMgr = (ExternalManagerDB) toProgram.getExternalManager();
//			extMgr.addExtLocation(parentNamespace.getName(), name, address, source);
//			symbol = toSymbolTable.getSymbol(name, parentNamespace);
//		}
		else if (type == SymbolType.CLASS) {
			GhidraClass newGhidraClass = toSymbolTable.createClass(parentNamespace, name, source);
			symbol = newGhidraClass.getSymbol();
		}
		else if (type == SymbolType.NAMESPACE) {
			Namespace newNamespace = toSymbolTable.createNameSpace(parentNamespace, name, source);
			symbol = newNamespace.getSymbol();
		}
		else if (type == SymbolType.LIBRARY) {
			ExternalManager fromExtMgr = fromProgram.getExternalManager();
			String path = fromExtMgr.getExternalLibraryPath(name);

			ExternalManagerDB extMgr = (ExternalManagerDB) toProgram.getExternalManager();
			extMgr.setExternalPath(name, path, source == SourceType.USER_DEFINED);
			symbol = toSymbolTable.getLibrarySymbol(name);
		}
		else if (type == SymbolType.FUNCTION) {
			FunctionManager fromFunctionMgr = fromProgram.getFunctionManager();
			AddressSetView body = fromFunctionMgr.getFunctionAt(address).getBody();
			FunctionManager functionMgr = toProgram.getFunctionManager();
			try {
				functionMgr.createFunction(name, parentNamespace, address, body, source);
			}
			catch (OverlappingFunctionException e) {
				throw new InvalidInputException(e.getMessage());
			}
			symbol = toSymbolTable.getSymbol(name, address, parentNamespace);
		}
		return symbol;
	}
Creates a new symbol of the indicated type along with its associated Object in the "to" program.
<br>This method will throw an exception if the symbol can't be created.
<br>Note: It will not create a symbol with a conflict name.
@param name the name for the symbol
@param type the symbol type for this symbol
@param address the address for this symbol
This address should be derived from the "to" program.
@param parentNamespace the parent namespace of this symbol that is in the "to" program
@param source the source of this symbol.
@return a new symbol. Returns null if it can't create a symbol of the indicated type..
@throws DuplicateNameException if the symbol and Object couldn't be created
because of an unresolvable name conflict.
@throws InvalidInputException if the symbol and Object couldn't be created
because of an invalid name.
Ghidra/Features/Base/src/main/java/ghidra/program/util/SymbolMerge.java