diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 575e7448869..804349ee484 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -306,7 +306,7 @@ export class MainThreadDocumentsAndEditors { private readonly _toDispose = new DisposableStore(); private readonly _proxy: ExtHostDocumentsAndEditorsShape; - private _textEditors = <{ [id: string]: MainThreadTextEditor }>Object.create(null); + private readonly _textEditors = new Map(); private _onTextEditorAdd = new Emitter(); private _onTextEditorRemove = new Emitter(); @@ -368,16 +368,16 @@ export class MainThreadDocumentsAndEditors { const mainThreadEditor = new MainThreadTextEditor(apiEditor.id, apiEditor.editor.getModel(), apiEditor.editor, { onGainedFocus() { }, onLostFocus() { } }, this._modelService); - this._textEditors[apiEditor.id] = mainThreadEditor; + this._textEditors.set(apiEditor.id, mainThreadEditor); addedEditors.push(mainThreadEditor); } // removed editors for (const { id } of delta.removedEditors) { - const mainThreadEditor = this._textEditors[id]; + const mainThreadEditor = this._textEditors.get(id); if (mainThreadEditor) { mainThreadEditor.dispose(); - delete this._textEditors[id]; + this._textEditors.delete(id); removedEditors.push(id); } } @@ -448,16 +448,16 @@ export class MainThreadDocumentsAndEditors { return undefined; } - findTextEditorIdFor(editor: IWorkbenchEditor): string | undefined { - for (const id in this._textEditors) { - if (this._textEditors[id].matches(editor)) { + findTextEditorIdFor(inputEditor: IWorkbenchEditor): string | undefined { + for (const [id, editor] of this._textEditors) { + if (editor.matches(inputEditor)) { return id; } } return undefined; } - getEditor(id: string): MainThreadTextEditor { - return this._textEditors[id]; + getEditor(id: string): MainThreadTextEditor | undefined { + return this._textEditors.get(id); } } diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index 25f4a8e1e9c..c63aa1bb7a6 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -160,52 +160,58 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { } $trySetSelections(id: string, selections: ISelection[]): Promise { - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - this._documentsAndEditors.getEditor(id).setSelections(selections); + editor.setSelections(selections); return Promise.resolve(undefined); } $trySetDecorations(id: string, key: string, ranges: IDecorationOptions[]): Promise { key = `${this._instanceId}-${key}`; - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - this._documentsAndEditors.getEditor(id).setDecorations(key, ranges); + editor.setDecorations(key, ranges); return Promise.resolve(undefined); } $trySetDecorationsFast(id: string, key: string, ranges: number[]): Promise { key = `${this._instanceId}-${key}`; - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - this._documentsAndEditors.getEditor(id).setDecorationsFast(key, ranges); + editor.setDecorationsFast(key, ranges); return Promise.resolve(undefined); } $tryRevealRange(id: string, range: IRange, revealType: TextEditorRevealType): Promise { - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - this._documentsAndEditors.getEditor(id).revealRange(range, revealType); + editor.revealRange(range, revealType); return Promise.resolve(); } $trySetOptions(id: string, options: ITextEditorConfigurationUpdate): Promise { - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - this._documentsAndEditors.getEditor(id).setConfiguration(options); + editor.setConfiguration(options); return Promise.resolve(undefined); } $tryApplyEdits(id: string, modelVersionId: number, edits: ISingleEditOperation[], opts: IApplyEditsOptions): Promise { - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - return Promise.resolve(this._documentsAndEditors.getEditor(id).applyEdits(modelVersionId, edits, opts)); + return Promise.resolve(editor.applyEdits(modelVersionId, edits, opts)); } $tryApplyWorkspaceEdit(dto: WorkspaceEditDto): Promise { @@ -214,10 +220,11 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { } $tryInsertSnippet(id: string, template: string, ranges: readonly IRange[], opts: IUndoStopOptions): Promise { - if (!this._documentsAndEditors.getEditor(id)) { + const editor = this._documentsAndEditors.getEditor(id); + if (!editor) { return Promise.reject(disposed(`TextEditor(${id})`)); } - return Promise.resolve(this._documentsAndEditors.getEditor(id).insertSnippet(template, ranges, opts)); + return Promise.resolve(editor.insertSnippet(template, ranges, opts)); } $registerTextEditorDecorationType(key: string, options: IDecorationRenderOptions): void {