vscode/src/vs/workbench/services/languageStatus/common/languageStatusService.ts

77 lines
2.6 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { CancellationToken } from 'vs/base/common/cancellation';
import { Event } from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
import Severity from 'vs/base/common/severity';
import { compare } from 'vs/base/common/strings';
import { ITextModel } from 'vs/editor/common/model';
import { Command } from 'vs/editor/common/modes';
import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry';
import { LanguageSelector } from 'vs/editor/common/modes/languageSelector';
import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
export interface ILanguageStatus {
readonly id: string;
readonly name: string;
readonly selector: LanguageSelector;
readonly severity: Severity;
readonly label: string;
readonly detail: string;
readonly busy: boolean;
readonly source: string;
readonly command: Command | undefined;
readonly accessibilityInfo: IAccessibilityInformation | undefined;
}
export interface ILanguageStatusProvider {
provideLanguageStatus(langId: string, token: CancellationToken): Promise<ILanguageStatus | undefined>
}
export const ILanguageStatusService = createDecorator<ILanguageStatusService>('ILanguageStatusService');
export interface ILanguageStatusService {
_serviceBrand: undefined;
onDidChange: Event<void>;
addStatus(status: ILanguageStatus): IDisposable;
getLanguageStatus(model: ITextModel): ILanguageStatus[];
}
class LanguageStatusServiceImpl implements ILanguageStatusService {
declare _serviceBrand: undefined;
private readonly _provider = new LanguageFeatureRegistry<ILanguageStatus>();
readonly onDidChange: Event<any> = this._provider.onDidChange;
addStatus(status: ILanguageStatus): IDisposable {
return this._provider.register(status.selector, status);
}
getLanguageStatus(model: ITextModel): ILanguageStatus[] {
return this._provider.ordered(model).sort((a, b) => {
let res = b.severity - a.severity;
if (res === 0) {
res = compare(a.source, b.source);
}
if (res === 0) {
res = compare(a.id, b.id);
}
return res;
});
}
}
registerSingleton(ILanguageStatusService, LanguageStatusServiceImpl, true);