From 26173cdbad011425f4215d9e134e684d8c097fbc Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 1 Sep 2021 21:23:26 +0200 Subject: [PATCH] Remove logic for unloading the language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s not supported in `monaco-editor` nor is it planned. See https://github.com/microsoft/monaco-editor/issues/2642 --- src/languageFeatures.ts | 56 ++++++++++++++--------------------------- src/workerManager.ts | 41 ++++++++---------------------- src/yamlMode.ts | 32 ++++++++--------------- 3 files changed, 41 insertions(+), 88 deletions(-) diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index aa66541..3444e23 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -51,8 +51,7 @@ export function createDiagnosticsAdapter( languageId: string, getWorker: WorkerAccessor, defaults: languages.yaml.LanguageServiceDefaults, -): IDisposable { - let disposables: IDisposable[] = []; +): void { const listeners: Record = Object.create(null); const resetSchema = async (resource: Uri): Promise => { @@ -95,43 +94,26 @@ export function createDiagnosticsAdapter( } }; - disposables.push( - editor.onDidCreateModel(onModelAdd), - editor.onWillDisposeModel((model) => { - onModelRemoved(model); - resetSchema(model.uri); - }), - editor.onDidChangeModelLanguage((event) => { - onModelRemoved(event.model); - onModelAdd(event.model); - resetSchema(event.model.uri); - }), - defaults.onDidChange(() => { - editor.getModels().forEach((model) => { - if (model.getModeId() === languageId) { - onModelRemoved(model); - onModelAdd(model); - } - }); - }), - { - dispose: () => { - editor.getModels().forEach(onModelRemoved); - for (const disposable of Object.values(listeners)) { - disposable.dispose(); - } - }, - }, - ); + editor.onDidCreateModel(onModelAdd); + editor.onWillDisposeModel((model) => { + onModelRemoved(model); + resetSchema(model.uri); + }); + editor.onDidChangeModelLanguage((event) => { + onModelRemoved(event.model); + onModelAdd(event.model); + resetSchema(event.model.uri); + }); + defaults.onDidChange(() => { + for (const model of editor.getModels()) { + if (model.getModeId() === languageId) { + onModelRemoved(model); + onModelAdd(model); + } + } + }); editor.getModels().forEach(onModelAdd); - - return { - dispose() { - disposables.forEach((d) => d && d.dispose()); - disposables = []; - }, - }; } // --- completion ------ diff --git a/src/workerManager.ts b/src/workerManager.ts index 14fd433..0a5ecb2 100644 --- a/src/workerManager.ts +++ b/src/workerManager.ts @@ -1,41 +1,30 @@ -import { editor, IDisposable, languages, Uri } from 'monaco-editor/esm/vs/editor/editor.api'; +import { editor, languages } from 'monaco-editor/esm/vs/editor/editor.api'; +import { WorkerAccessor } from './languageFeatures'; import { YAMLWorker } from './yamlWorker'; -export interface WorkerManager extends IDisposable { - getLanguageServiceWorker: (...resources: Uri[]) => Promise; -} - // 2min const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; export function createWorkerManager( defaults: languages.yaml.LanguageServiceDefaults, -): WorkerManager { +): WorkerAccessor { let worker: editor.MonacoWebWorker; let client: Promise; let lastUsedTime = 0; - const stopWorker = (): void => { - if (worker) { - worker.dispose(); - worker = null; - } - client = null; - }; - - const idleCheckInterval = setInterval(() => { + setInterval(() => { if (!worker) { return; } const timePassedSinceLastUsed = Date.now() - lastUsedTime; if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) { - stopWorker(); + worker.dispose(); + worker = undefined; + client = undefined; } }, 30 * 1000); - const configChangeListener = defaults.onDidChange(() => stopWorker()); - const getClient = (): Promise => { lastUsedTime = Date.now(); @@ -62,17 +51,9 @@ export function createWorkerManager( return client; }; - return { - dispose() { - clearInterval(idleCheckInterval); - configChangeListener.dispose(); - stopWorker(); - }, - - async getLanguageServiceWorker(...resources) { - const client = await getClient(); - await worker.withSyncedResources(resources); - return client; - }, + return async (...resources) => { + const client = await getClient(); + await worker.withSyncedResources(resources); + return client; }; } diff --git a/src/yamlMode.ts b/src/yamlMode.ts index 901c111..76ca51f 100644 --- a/src/yamlMode.ts +++ b/src/yamlMode.ts @@ -1,4 +1,4 @@ -import { IDisposable, languages, Uri } from 'monaco-editor/esm/vs/editor/editor.api'; +import { languages } from 'monaco-editor/esm/vs/editor/editor.api'; import { createCompletionItemProvider, @@ -7,10 +7,8 @@ import { createDocumentSymbolProvider, createHoverProvider, createLinkProvider, - WorkerAccessor, } from './languageFeatures'; import { createWorkerManager } from './workerManager'; -import { YAMLWorker } from './yamlWorker'; const richEditConfiguration: languages.LanguageConfiguration = { comments: { @@ -45,26 +43,18 @@ const richEditConfiguration: languages.LanguageConfiguration = { }; export function setupMode(defaults: languages.yaml.LanguageServiceDefaults): void { - const disposables: IDisposable[] = []; - - const client = createWorkerManager(defaults); - disposables.push(client); - - const worker: WorkerAccessor = (...uris: Uri[]): Promise => - client.getLanguageServiceWorker(...uris); + const worker = createWorkerManager(defaults); const { languageId } = defaults; - disposables.push( - languages.registerCompletionItemProvider(languageId, createCompletionItemProvider(worker)), - languages.registerHoverProvider(languageId, createHoverProvider(worker)), - languages.registerDocumentSymbolProvider(languageId, createDocumentSymbolProvider(worker)), - languages.registerDocumentFormattingEditProvider( - languageId, - createDocumentFormattingEditProvider(worker), - ), - languages.registerLinkProvider(languageId, createLinkProvider(worker)), - createDiagnosticsAdapter(languageId, worker, defaults), - languages.setLanguageConfiguration(languageId, richEditConfiguration), + languages.registerCompletionItemProvider(languageId, createCompletionItemProvider(worker)); + languages.registerHoverProvider(languageId, createHoverProvider(worker)); + languages.registerDocumentSymbolProvider(languageId, createDocumentSymbolProvider(worker)); + languages.registerDocumentFormattingEditProvider( + languageId, + createDocumentFormattingEditProvider(worker), ); + languages.registerLinkProvider(languageId, createLinkProvider(worker)); + createDiagnosticsAdapter(languageId, worker, defaults); + languages.setLanguageConfiguration(languageId, richEditConfiguration); }