mirror of
https://github.com/danbulant/monaco-yaml
synced 2026-06-19 22:41:39 +00:00
Merge pull request #99 from remcohaszing/remove-disposables
Remove logic for unloading the language
This commit is contained in:
commit
f101c2fc1d
3 changed files with 41 additions and 88 deletions
|
|
@ -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 ------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue