From c01a61606256c220f7ad32ee553191744671556a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 23 Mar 2017 09:53:19 +0100 Subject: [PATCH] debt - allow to somewhat work with a closed editor --- .../workbench/api/node/extHostTextEditor.ts | 41 +++++++++++++------ .../test/node/api/extHostTextEditor.test.ts | 32 ++++++++++++++- 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTextEditor.ts b/src/vs/workbench/api/node/extHostTextEditor.ts index b4e4488fa83..98eedfcbce5 100644 --- a/src/vs/workbench/api/node/extHostTextEditor.ts +++ b/src/vs/workbench/api/node/extHostTextEditor.ts @@ -5,6 +5,7 @@ 'use strict'; +import { ok } from 'vs/base/common/assert'; import { readonly, illegalArgument } from 'vs/base/common/errors'; import { IdGenerator } from 'vs/base/common/idGenerator'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -308,19 +309,18 @@ export class ExtHostTextEditorOptions implements vscode.TextEditorOptions { warnOnError(this._proxy.$trySetOptions(this._id, bulkConfigurationUpdate)); } } - - } export class ExtHostTextEditor implements vscode.TextEditor { - private _proxy: MainThreadEditorsShape; - private _id: string; + private readonly _proxy: MainThreadEditorsShape; + private readonly _id: string; + private readonly _documentData: ExtHostDocumentData; - private _documentData: ExtHostDocumentData; private _selections: Selection[]; private _options: ExtHostTextEditorOptions; private _viewColumn: vscode.ViewColumn; + private _disposed: boolean = false; constructor(proxy: MainThreadEditorsShape, id: string, document: ExtHostDocumentData, selections: Selection[], options: IResolvedTextEditorConfiguration, viewColumn: vscode.ViewColumn) { this._proxy = proxy; @@ -332,7 +332,8 @@ export class ExtHostTextEditor implements vscode.TextEditor { } dispose() { - this._documentData = null; + ok(!this._disposed); + this._disposed = true; } @deprecated('TextEditor.show') show(column: vscode.ViewColumn) { @@ -346,9 +347,7 @@ export class ExtHostTextEditor implements vscode.TextEditor { // ---- the document get document(): vscode.TextDocument { - return this._documentData - ? this._documentData.document - : undefined; + return this._documentData.document; } set document(value) { @@ -362,10 +361,13 @@ export class ExtHostTextEditor implements vscode.TextEditor { } set options(value: vscode.TextEditorOptions) { - this._options.assign(value); + if (!this._disposed) { + this._options.assign(value); + } } _acceptOptions(options: IResolvedTextEditorConfiguration): void { + ok(!this._disposed); this._options._accept(options); } @@ -380,6 +382,7 @@ export class ExtHostTextEditor implements vscode.TextEditor { } _acceptViewColumn(value: vscode.ViewColumn) { + ok(!this._disposed); this._viewColumn = value; } @@ -437,18 +440,22 @@ export class ExtHostTextEditor implements vscode.TextEditor { } _acceptSelections(selections: Selection[]): void { + ok(!this._disposed); this._selections = selections; } // ---- editing edit(callback: (edit: TextEditorEdit) => void, options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable { + if (this._disposed) { + return TPromise.wrapError('TextEditor#edit not possible on closed editors'); + } let edit = new TextEditorEdit(this._documentData.document, options); callback(edit); return this._applyEdit(edit); } - _applyEdit(editBuilder: TextEditorEdit): TPromise { + private _applyEdit(editBuilder: TextEditorEdit): TPromise { let editData = editBuilder.finalize(); // prepare data for serialization @@ -468,7 +475,9 @@ export class ExtHostTextEditor implements vscode.TextEditor { } insertSnippet(snippet: SnippetString, where?: Position | Position[] | Range | Range[], options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable { - + if (this._disposed) { + return TPromise.wrapError('TextEditor#insertSnippet not possible on closed editors'); + } let ranges: IRange[]; if (!where || (Array.isArray(where) && where.length === 0)) { @@ -498,6 +507,14 @@ export class ExtHostTextEditor implements vscode.TextEditor { // ---- util private _runOnProxy(callback: () => TPromise, silent: boolean): TPromise { + if (this._disposed) { + if (!silent) { + return TPromise.wrapError(silent); + } else { + console.warn('TextEditor is closed/disposed'); + return TPromise.as(undefined); + } + } return callback().then(() => this, err => { if (!silent) { return TPromise.wrapError(silent); diff --git a/src/vs/workbench/test/node/api/extHostTextEditor.test.ts b/src/vs/workbench/test/node/api/extHostTextEditor.test.ts index 8e2148999b5..87e55295017 100644 --- a/src/vs/workbench/test/node/api/extHostTextEditor.test.ts +++ b/src/vs/workbench/test/node/api/extHostTextEditor.test.ts @@ -10,7 +10,37 @@ import { TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { TextEditorCursorStyle } from 'vs/editor/common/editorCommon'; import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditor'; import { MainThreadEditorsShape } from 'vs/workbench/api/node/extHost.protocol'; -import { ExtHostTextEditorOptions } from 'vs/workbench/api/node/extHostTextEditor'; +import { ExtHostTextEditorOptions, ExtHostTextEditor } from 'vs/workbench/api/node/extHostTextEditor'; +import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; +import URI from 'vs/base/common/uri'; + +suite('ExtHostTextEditor', () => { + + let editor: ExtHostTextEditor; + + setup(() => { + let doc = new ExtHostDocumentData(undefined, URI.file(''), [ + 'aaaa bbbb+cccc abc' + ], '\n', 'text', 1, false); + editor = new ExtHostTextEditor(null, 'fake', doc, [], { cursorStyle: 0, insertSpaces: true, lineNumbers: 1, tabSize: 4 }, 1); + }); + + test('disposed editor', () => { + + assert.ok(editor.document); + editor._acceptViewColumn(3); + assert.equal(3, editor.viewColumn); + + editor.dispose(); + + assert.throws(() => editor._acceptViewColumn(2)); + assert.equal(3, editor.viewColumn); + + assert.ok(editor.document); + assert.throws(() => editor._acceptOptions(null)); + assert.throws(() => editor._acceptSelections([])); + }); +}); suite('ExtHostTextEditorOptions', () => { -- GitLab