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,
getWorker: WorkerAccessor,
defaults: languages.yaml.LanguageServiceDefaults,
): IDisposable {
let disposables: IDisposable[] = [];
): void {
const listeners: Record<string, IDisposable> = Object.create(null);
const resetSchema = async (resource: Uri): Promise<void> => {
@ -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 ------

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';
export interface WorkerManager extends IDisposable {
getLanguageServiceWorker: (...resources: Uri[]) => Promise<YAMLWorker>;
}
// 2min
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000;
export function createWorkerManager(
defaults: languages.yaml.LanguageServiceDefaults,
): WorkerManager {
): WorkerAccessor {
let worker: editor.MonacoWebWorker<YAMLWorker>;
let client: Promise<YAMLWorker>;
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<YAMLWorker> => {
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;
};
}

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 {
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<YAMLWorker> =>
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);
}