Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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