private void navigate(DomainFile programFile, SymbolPath symbolPath, Navigatable navigatable,
			ServiceProvider serviceProvider) {

		GoToService goToService = serviceProvider.getService(GoToService.class);
		if (goToService == null) {
			// shouldn't happen
			Msg.showWarn(this, null, "Service Missing",
				"This annotation requires the GoToService to be enabled");
			return;
		}

		ProgramManager programManager = serviceProvider.getService(ProgramManager.class);
		Program program = programManager.openProgram(programFile, DomainFile.DEFAULT_VERSION,
			ProgramManager.OPEN_HIDDEN);
		if (program == null) {
			return; // cancelled
		}

		if (symbolPath == null) { // no symbol; just open and go to the program
			Address start = program.getMemory().getMinAddress();
			goToService.goTo(navigatable, new ProgramLocation(program, start), program);
			return;
		}

		// try any symbols(s) first
		List<Symbol> symbols = NamespaceUtils.getSymbols(symbolPath.getPath(), program);
		if (goToSymbol(symbols, navigatable, program, goToService)) {
			return;
		}

		String symbolName = symbolPath.getName();
		Address address = getAddress(symbolName, program);
		if (goToAddress(address, program, navigatable, goToService)) {
			return;
		}

		Msg.showInfo(getClass(), null, "No Symbol: " + symbolName,
			"Unable to navigate to '" + symbolName + "' in the program '" + programFile.getName() +
				"'.\nMake sure that the given symbol/address exists.");
		if (!programManager.isVisible(program)) {
			// we opened a hidden program, but could not navigate--close the program
			programManager.closeProgram(program, true);
		}
	}
This could return a symbol or an address (or any text really, since it is not checked
Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/ProgramAnnotatedStringHandler.java