77 lines
2.6 KiB
TypeScript
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);
|