src/vs/editor/contrib/hover/browser/contentHover.ts/ContentHoverController/_renderMessages
class ContentHoverController:	private _renderMessages(anchor: HoverAnchor, messages: IHoverPart[]): void {
		const { showAtPosition, showAtRange, highlightRange } = ContentHoverController.computeHoverRanges(anchor.range, messages);

		const disposables = new DisposableStore();
		const statusBar = disposables.add(new EditorHoverStatusBar(this._keybindingService));
		const fragment = document.createDocumentFragment();

		let colorPicker: IEditorHoverColorPickerWidget | null = null;
		const context: IEditorHoverRenderContext = {
			fragment,
			statusBar,
			setColorPicker: (widget) => colorPicker = widget,
			onContentsChanged: () => this._widget.onContentsChanged(),
			hide: () => this.hide()
		};

		for (const participant of this._participants) {
			const hoverParts = messages.filter(msg => msg.owner === participant);
			if (hoverParts.length > 0) {
				disposables.add(participant.renderHoverParts(context, hoverParts));
			}
		}
		if (statusBar.hasContent) {
			fragment.appendChild(statusBar.hoverElement);
		}

		if (fragment.hasChildNodes()) {
			if (highlightRange) {
				const highlightDecoration = this._editor.createDecorationsCollection();
				try {
					this._isChangingDecorations = true;
					highlightDecoration.set([{
						range: highlightRange,
						options: ContentHoverController._DECORATION_OPTIONS
					}]);
				} finally {
					this._isChangingDecorations = false;
				}
				disposables.add(toDisposable(() => {
					try {
						this._isChangingDecorations = true;
						highlightDecoration.clear();
					} finally {
						this._isChangingDecorations = false;
					}
				}));
			}

			this._widget.showAt(fragment, new ContentHoverVisibleData(
				colorPicker,
				showAtPosition,
				showAtRange,
				this._editor.getOption(EditorOption.hover).above,
				this._computer.shouldFocus,
				disposables
			));
		} else {
			disposables.dispose();
		}
	}