src/vs/editor/contrib/hover/markdownHoverParticipant.ts/MarkdownHoverParticipant/computeAsync
class MarkdownHoverParticipant:	public async computeAsync(anchor: HoverAnchor, lineDecorations: IModelDecoration[], token: CancellationToken): Promise<MarkdownHover[]> {
		if (!this._editor.hasModel() || anchor.type !== HoverAnchorType.Range) {
			return Promise.resolve([]);
		}

		const model = this._editor.getModel();

		if (!HoverProviderRegistry.has(model)) {
			return Promise.resolve([]);
		}

		const hovers = await getHover(model, new Position(
			anchor.range.startLineNumber,
			anchor.range.startColumn
		), token);

		const result: MarkdownHover[] = [];
		for (const hover of hovers) {
			if (isEmptyMarkdownString(hover.contents)) {
				continue;
			}
			const rng = hover.range ? Range.lift(hover.range) : anchor.range;
			result.push(new MarkdownHover(this, rng, hover.contents));
		}
		return result;
	}