Merge pull request #99 from remcohaszing/remove-disposables

Remove logic for unloading the language
This commit is contained in:
Remco Haszing 2021-09-02 09:21:56 +02:00 committed by GitHub
commit f101c2fc1d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 88 deletions

View file

@ -51,8 +51,7 @@ export function createDiagnosticsAdapter(
languageId: string, languageId: string,
getWorker: WorkerAccessor, getWorker: WorkerAccessor,
defaults: languages.yaml.LanguageServiceDefaults, defaults: languages.yaml.LanguageServiceDefaults,
): IDisposable { ): void {
let disposables: IDisposable[] = [];
const listeners: Record<string, IDisposable> = Object.create(null); const listeners: Record<string, IDisposable> = Object.create(null);
const resetSchema = async (resource: Uri): Promise<void> => { const resetSchema = async (resource: Uri): Promise<void> => {
@ -95,43 +94,26 @@ export function createDiagnosticsAdapter(
} }
}; };
disposables.push( editor.onDidCreateModel(onModelAdd);
editor.onDidCreateModel(onModelAdd), editor.onWillDisposeModel((model) => {
editor.onWillDisposeModel((model) => { onModelRemoved(model);
onModelRemoved(model); resetSchema(model.uri);
resetSchema(model.uri); });
}), editor.onDidChangeModelLanguage((event) => {
editor.onDidChangeModelLanguage((event) => { onModelRemoved(event.model);
onModelRemoved(event.model); onModelAdd(event.model);
onModelAdd(event.model); resetSchema(event.model.uri);
resetSchema(event.model.uri); });
}), defaults.onDidChange(() => {
defaults.onDidChange(() => { for (const model of editor.getModels()) {
editor.getModels().forEach((model) => { if (model.getModeId() === languageId) {
if (model.getModeId() === languageId) { onModelRemoved(model);
onModelRemoved(model); onModelAdd(model);
onModelAdd(model); }
} }
}); });
}),
{
dispose: () => {
editor.getModels().forEach(onModelRemoved);
for (const disposable of Object.values(listeners)) {
disposable.dispose();
}
},
},
);
editor.getModels().forEach(onModelAdd); editor.getModels().forEach(onModelAdd);
return {
dispose() {
disposables.forEach((d) => d && d.dispose());
disposables = [];
},
};
} }
// --- completion ------ // --- completion ------

View file

@ -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'; import { YAMLWorker } from './yamlWorker';
export interface WorkerManager extends IDisposable {
getLanguageServiceWorker: (...resources: Uri[]) => Promise<YAMLWorker>;
}
// 2min // 2min
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000;
export function createWorkerManager( export function createWorkerManager(
defaults: languages.yaml.LanguageServiceDefaults, defaults: languages.yaml.LanguageServiceDefaults,
): WorkerManager { ): WorkerAccessor {
let worker: editor.MonacoWebWorker<YAMLWorker>; let worker: editor.MonacoWebWorker<YAMLWorker>;
let client: Promise<YAMLWorker>; let client: Promise<YAMLWorker>;
let lastUsedTime = 0; let lastUsedTime = 0;
const stopWorker = (): void => { setInterval(() => {
if (worker) {
worker.dispose();
worker = null;
}
client = null;
};
const idleCheckInterval = setInterval(() => {
if (!worker) { if (!worker) {
return; return;
} }
const timePassedSinceLastUsed = Date.now() - lastUsedTime; const timePassedSinceLastUsed = Date.now() - lastUsedTime;
if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) { if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
stopWorker(); worker.dispose();
worker = undefined;
client = undefined;
} }
}, 30 * 1000); }, 30 * 1000);
const configChangeListener = defaults.onDidChange(() => stopWorker());
const getClient = (): Promise<YAMLWorker> => { const getClient = (): Promise<YAMLWorker> => {
lastUsedTime = Date.now(); lastUsedTime = Date.now();
@ -62,17 +51,9 @@ export function createWorkerManager(
return client; return client;
}; };
return { return async (...resources) => {
dispose() { const client = await getClient();
clearInterval(idleCheckInterval); await worker.withSyncedResources(resources);
configChangeListener.dispose(); return client;
stopWorker();
},
async getLanguageServiceWorker(...resources) {
const client = await getClient();
await worker.withSyncedResources(resources);
return client;
},
}; };
} }

View file

@ -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 { import {
createCompletionItemProvider, createCompletionItemProvider,
@ -7,10 +7,8 @@ import {
createDocumentSymbolProvider, createDocumentSymbolProvider,
createHoverProvider, createHoverProvider,
createLinkProvider, createLinkProvider,
WorkerAccessor,
} from './languageFeatures'; } from './languageFeatures';
import { createWorkerManager } from './workerManager'; import { createWorkerManager } from './workerManager';
import { YAMLWorker } from './yamlWorker';
const richEditConfiguration: languages.LanguageConfiguration = { const richEditConfiguration: languages.LanguageConfiguration = {
comments: { comments: {
@ -45,26 +43,18 @@ const richEditConfiguration: languages.LanguageConfiguration = {
}; };
export function setupMode(defaults: languages.yaml.LanguageServiceDefaults): void { export function setupMode(defaults: languages.yaml.LanguageServiceDefaults): void {
const disposables: IDisposable[] = []; const worker = createWorkerManager(defaults);
const client = createWorkerManager(defaults);
disposables.push(client);
const worker: WorkerAccessor = (...uris: Uri[]): Promise<YAMLWorker> =>
client.getLanguageServiceWorker(...uris);
const { languageId } = defaults; const { languageId } = defaults;
disposables.push( languages.registerCompletionItemProvider(languageId, createCompletionItemProvider(worker));
languages.registerCompletionItemProvider(languageId, createCompletionItemProvider(worker)), languages.registerHoverProvider(languageId, createHoverProvider(worker));
languages.registerHoverProvider(languageId, createHoverProvider(worker)), languages.registerDocumentSymbolProvider(languageId, createDocumentSymbolProvider(worker));
languages.registerDocumentSymbolProvider(languageId, createDocumentSymbolProvider(worker)), languages.registerDocumentFormattingEditProvider(
languages.registerDocumentFormattingEditProvider( languageId,
languageId, createDocumentFormattingEditProvider(worker),
createDocumentFormattingEditProvider(worker),
),
languages.registerLinkProvider(languageId, createLinkProvider(worker)),
createDiagnosticsAdapter(languageId, worker, defaults),
languages.setLanguageConfiguration(languageId, richEditConfiguration),
); );
languages.registerLinkProvider(languageId, createLinkProvider(worker));
createDiagnosticsAdapter(languageId, worker, defaults);
languages.setLanguageConfiguration(languageId, richEditConfiguration);
} }