mirror of
https://github.com/danbulant/monaco-yaml
synced 2026-07-06 11:30:46 +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,
|
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 ------
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue