Skip to content

Commit

Permalink
Merge pull request #330 from TypeFox/make-workspace-disposable
Browse files Browse the repository at this point in the history
Make monaco workspace disposable
  • Loading branch information
kaisalmen committed Apr 8, 2022
2 parents f772b90 + 2ce376e commit de52c2a
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 11 deletions.
11 changes: 8 additions & 3 deletions packages/client/src/monaco-services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { MonacoLanguages } from "./monaco-languages";
import { MonacoWorkspace } from "./monaco-workspace";
import { ConsoleWindow } from "./console-window";
import { Services } from "./services";
import { Disposable, DisposableCollection } from './disposable';

export interface MonacoServices extends Services {
commands: MonacoCommands
Expand All @@ -31,10 +32,14 @@ export namespace MonacoServices {
window: new ConsoleWindow()
}
}
export function install(_monaco: typeof monaco, options: Options = {}): MonacoServices {
export function install(_monaco: typeof monaco, options: Options = {}): Disposable {
const disposableCollection = new DisposableCollection()

const services = create(_monaco, options);
Services.install(services);
return services;
disposableCollection.push(services.workspace)
disposableCollection.push(Services.install(services));

return disposableCollection;
}
export function get(): MonacoServices {
return Services.get() as MonacoServices;
Expand Down
33 changes: 25 additions & 8 deletions packages/client/src/monaco-workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
* ------------------------------------------------------------------------------------------ */
import type * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
import { MonacoToProtocolConverter, ProtocolToMonacoConverter } from './monaco-converter';
import { Workspace, WorkspaceEdit, TextDocumentDidChangeEvent, Event, Emitter } from './services';
import { Workspace, WorkspaceEdit, TextDocumentDidChangeEvent, Event, Emitter, Disposable } from './services';
import { TextDocument } from 'vscode-languageserver-textdocument'
import { DisposableCollection } from './disposable';

export class MonacoWorkspace implements Workspace {
export class MonacoWorkspace implements Workspace, Disposable {

protected readonly disposableCollection = new DisposableCollection()
protected readonly documents = new Map<string, TextDocument>();
protected readonly documentDisposables = new Map<string, Disposable>();
protected readonly onDidOpenTextDocumentEmitter = new Emitter<TextDocument>();
protected readonly onDidCloseTextDocumentEmitter = new Emitter<TextDocument>();
protected readonly onDidChangeTextDocumentEmitter = new Emitter<TextDocumentDidChangeEvent>();
Expand All @@ -22,12 +25,21 @@ export class MonacoWorkspace implements Workspace {
for (const model of this._monaco.editor.getModels()) {
this.addModel(model);
}
this._monaco.editor.onDidCreateModel(model => this.addModel(model));
this._monaco.editor.onWillDisposeModel(model => this.removeModel(model));
this._monaco.editor.onDidChangeModelLanguage((event) => {

this.disposableCollection.push(this._monaco.editor.onDidCreateModel(model => this.addModel(model)));
this.disposableCollection.push(this._monaco.editor.onWillDisposeModel(model => this.removeModel(model)));
this.disposableCollection.push(this._monaco.editor.onDidChangeModelLanguage((event) => {
this.removeModel(event.model);
this.addModel(event.model);
});
}));
}

dispose(): void {
this.disposableCollection.dispose()

for (const model of this._monaco.editor.getModels()) {
this.removeModel(model);
}
}

get rootUri() {
Expand All @@ -41,15 +53,20 @@ export class MonacoWorkspace implements Workspace {
this.documents.delete(uri);
this.onDidCloseTextDocumentEmitter.fire(document);
}
const disposable = this.documentDisposables.get(uri)
if (disposable) {
disposable.dispose()
this.documentDisposables.delete(uri)
}
}

protected addModel(model: monaco.editor.IModel): void {
const uri = model.uri.toString();
const document = this.setModel(uri, model);
this.onDidOpenTextDocumentEmitter.fire(document)
model.onDidChangeContent(event =>
this.documentDisposables.set(uri, model.onDidChangeContent(event =>
this.onDidChangeContent(uri, model, event)
);
));
}

protected onDidChangeContent(uri: string, model: monaco.editor.IModel, event: monaco.editor.IModelContentChangedEvent) {
Expand Down

0 comments on commit de52c2a

Please sign in to comment.