Avoid creating services in APIs used by the monaco-editor repo itself (#187881)

Fixes #169268: Avoid creating services in APIs used by the monaco-editor repo itself
This commit is contained in:
Alexandru Dima
2023-07-13 16:04:15 -07:00
committed by GitHub
parent c0d560ed49
commit 52d462293d
2 changed files with 44 additions and 18 deletions
@@ -54,16 +54,18 @@ export function getEncodedLanguageId(languageId: string): number {
* @event
*/
export function onLanguage(languageId: string, callback: () => void): IDisposable {
const languageService = StandaloneServices.get(ILanguageService);
const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {
if (encounteredLanguageId === languageId) {
// stop listening
disposable.dispose();
// invoke actual listener
callback();
}
return StandaloneServices.withServices(() => {
const languageService = StandaloneServices.get(ILanguageService);
const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {
if (encounteredLanguageId === languageId) {
// stop listening
disposable.dispose();
// invoke actual listener
callback();
}
});
return disposable;
});
return disposable;
}
/**
@@ -72,16 +74,18 @@ export function onLanguage(languageId: string, callback: () => void): IDisposabl
* @event
*/
export function onLanguageEncountered(languageId: string, callback: () => void): IDisposable {
const languageService = StandaloneServices.get(ILanguageService);
const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {
if (encounteredLanguageId === languageId) {
// stop listening
disposable.dispose();
// invoke actual listener
callback();
}
return StandaloneServices.withServices(() => {
const languageService = StandaloneServices.get(ILanguageService);
const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {
if (encounteredLanguageId === languageId) {
// stop listening
disposable.dispose();
// invoke actual listener
callback();
}
});
return disposable;
});
return disposable;
}
/**
@@ -1128,6 +1128,7 @@ export module StandaloneServices {
}
let initialized = false;
const onDidInitialize = new Emitter<void>();
export function initialize(overrides: IEditorOverrideServices): IInstantiationService {
if (initialized) {
return instantiationService;
@@ -1163,6 +1164,27 @@ export module StandaloneServices {
}
}
onDidInitialize.fire();
return instantiationService;
}
/**
* Executes callback once services are initialized.
*/
export function withServices(callback: () => IDisposable): IDisposable {
if (initialized) {
return callback();
}
const disposable = new DisposableStore();
const listener = disposable.add(onDidInitialize.event(() => {
listener.dispose();
disposable.add(callback());
}));
return disposable;
}
}