Skip to content

Commit

Permalink
debt - allow to somewhat work with a closed editor
Browse files Browse the repository at this point in the history
  • Loading branch information
jrieken committed Mar 23, 2017
1 parent 6b4e856 commit c01a616
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 13 deletions.
41 changes: 29 additions & 12 deletions src/vs/workbench/api/node/extHostTextEditor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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);
}

Expand All @@ -380,6 +382,7 @@ export class ExtHostTextEditor implements vscode.TextEditor {
}

_acceptViewColumn(value: vscode.ViewColumn) {
ok(!this._disposed);
this._viewColumn = value;
}

Expand Down Expand Up @@ -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<boolean> {
if (this._disposed) {
return TPromise.wrapError<boolean>('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<boolean> {
private _applyEdit(editBuilder: TextEditorEdit): TPromise<boolean> {
let editData = editBuilder.finalize();

// prepare data for serialization
Expand All @@ -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<boolean> {

if (this._disposed) {
return TPromise.wrapError<boolean>('TextEditor#insertSnippet not possible on closed editors');
}
let ranges: IRange[];

if (!where || (Array.isArray(where) && where.length === 0)) {
Expand Down Expand Up @@ -498,6 +507,14 @@ export class ExtHostTextEditor implements vscode.TextEditor {
// ---- util

private _runOnProxy(callback: () => TPromise<any>, silent: boolean): TPromise<ExtHostTextEditor> {
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);
Expand Down
32 changes: 31 additions & 1 deletion src/vs/workbench/test/node/api/extHostTextEditor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {

Expand Down

0 comments on commit c01a616

Please sign in to comment.