src/vs/workbench/api/common/extHostLanguages.ts/ExtHostLanguages/createLanguageStatusItem
class ExtHostLanguages:	createLanguageStatusItem(extension: IExtensionDescription, id: string, selector: vscode.DocumentSelector): vscode.LanguageStatusItem {

		const handle = this._handlePool++;
		const proxy = this._proxy;
		const ids = this._ids;

		// enforce extension unique identifier
		const fullyQualifiedId = `${extension.identifier.value}/${id}`;
		if (ids.has(fullyQualifiedId)) {
			throw new Error(`LanguageStatusItem with id '${id}' ALREADY exists`);
		}
		ids.add(fullyQualifiedId);

		const data: Omit<vscode.LanguageStatusItem, 'dispose'> = {
			selector,
			id,
			name: extension.displayName ?? extension.name,
			severity: LanguageStatusSeverity.Information,
			command: undefined,
			text: '',
			detail: '',
			busy: false
		};

		let soonHandle: IDisposable | undefined;
		let commandDisposables = new DisposableStore();
		const updateAsync = () => {
			soonHandle?.dispose();
			soonHandle = disposableTimeout(() => {
				commandDisposables.clear();
				this._proxy.$setLanguageStatus(handle, {
					id: fullyQualifiedId,
					name: data.name ?? extension.displayName ?? extension.name,
					source: extension.displayName ?? extension.name,
					selector: typeConvert.DocumentSelector.from(data.selector, this._uriTransformer),
					label: data.text,
					detail: data.detail ?? '',
					severity: data.severity === LanguageStatusSeverity.Error ? Severity.Error : data.severity === LanguageStatusSeverity.Warning ? Severity.Warning : Severity.Info,
					command: data.command && this._commands.toInternal(data.command, commandDisposables),
					accessibilityInfo: data.accessibilityInformation,
					busy: data.busy
				});
			}, 0);
		};

		const result: vscode.LanguageStatusItem = {
			dispose() {
				commandDisposables.dispose();
				soonHandle?.dispose();
				proxy.$removeLanguageStatus(handle);
				ids.delete(fullyQualifiedId);
			},
			get id() {
				return data.id;
			},
			get name() {
				return data.name;
			},
			set name(value) {
				data.name = value;
				updateAsync();
			},
			get selector() {
				return data.selector;
			},
			set selector(value) {
				data.selector = value;
				updateAsync();
			},
			get text() {
				return data.text;
			},
			set text(value) {
				data.text = value;
				updateAsync();
			},
			get detail() {
				return data.detail;
			},
			set detail(value) {
				data.detail = value;
				updateAsync();
			},
			get severity() {
				return data.severity;
			},
			set severity(value) {
				data.severity = value;
				updateAsync();
			},
			get accessibilityInformation() {
				return data.accessibilityInformation;
			},
			set accessibilityInformation(value) {
				data.accessibilityInformation = value;
				updateAsync();
			},
			get command() {
				return data.command;
			},
			set command(value) {
				data.command = value;
				updateAsync();
			},
			get busy() {
				return data.busy;
			},
			set busy(value: boolean) {
				data.busy = value;
				updateAsync();
			}
		};
		updateAsync();
		return result;
	}