From c21734fd30e334803d8c5cb38c5517af9a3ec684 Mon Sep 17 00:00:00 2001 From: Joel Day Date: Wed, 18 Jan 2017 10:13:56 -0800 Subject: [PATCH] Snippet insertion extension API changes - Basing snippet insertion failure on a new `_codeEditor` null-check. - Now returns `Thenable`. - Removed vscode.proposed.d.ts copy of the `TextEditor` change. - Removing empty options interface. --- .vscode/launch.json | 1 + extensions/vscode-api-tests/src/editor.test.ts | 10 ++++------ extensions/vscode-api-tests/src/typings/ref.d.ts | 1 - src/vs/vscode.d.ts | 3 ++- src/vs/vscode.proposed.d.ts | 11 ----------- src/vs/workbench/api/node/extHost.protocol.ts | 4 ++-- src/vs/workbench/api/node/extHostEditors.ts | 6 +++--- src/vs/workbench/api/node/mainThreadEditors.ts | 7 +++---- .../workbench/api/node/mainThreadEditorsTracker.ts | 12 +++++++----- 9 files changed, 22 insertions(+), 33 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 948bb4f25dc51..1959b27e80d70 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -68,6 +68,7 @@ "name": "VS Code API Tests", "runtimeExecutable": "${execPath}", "args": [ + "${workspaceRoot}", "${workspaceRoot}/extensions/vscode-api-tests/testWorkspace", "--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-api-tests", "--extensionTestsPath=${workspaceRoot}/extensions/vscode-api-tests/out" diff --git a/extensions/vscode-api-tests/src/editor.test.ts b/extensions/vscode-api-tests/src/editor.test.ts index 54806f0b92acd..1eafbc2353060 100644 --- a/extensions/vscode-api-tests/src/editor.test.ts +++ b/extensions/vscode-api-tests/src/editor.test.ts @@ -41,9 +41,8 @@ suite('editor tests', () => { .appendText(' snippet'); return withRandomFileEditor('', (editor, doc) => { - editor.edit(snippetString); - - return editor.edit(() => {}).then(() => { + return editor.edit(snippetString).then(inserted => { + assert.ok(inserted); assert.equal(doc.getText(), 'This is a placeholder snippet'); assert.ok(doc.isDirty); }); @@ -60,9 +59,8 @@ suite('editor tests', () => { new Position(0, 12) ); - editor.edit(snippetString); - - return editor.edit(() => {}).then(() => { + return editor.edit(snippetString).then(inserted => { + assert.ok(inserted); assert.equal(doc.getText(), 'This has been replaced'); assert.ok(doc.isDirty); }); diff --git a/extensions/vscode-api-tests/src/typings/ref.d.ts b/extensions/vscode-api-tests/src/typings/ref.d.ts index f6348236853a1..ca060f566a91f 100644 --- a/extensions/vscode-api-tests/src/typings/ref.d.ts +++ b/extensions/vscode-api-tests/src/typings/ref.d.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/// /// /// /// diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 71d937c190723..11890b9d64cbd 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -941,8 +941,9 @@ declare module 'vscode' { * * @param snippet The snippet to insert in this edit. * @param options The undo/redo behaviour around this edit. By default, undo stops will be created before and after this edit. + * @return A promise that resolves with a value indicating if the snippet could be inserted. */ - edit(snippet: SnippetString, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): void; + edit(snippet: SnippetString, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; /** * Adds a set of decorations to the text editor. If a set of decorations already exists with diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b6fcae6961898..8202bdb750fef 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -108,17 +108,6 @@ declare module 'vscode' { getClickCommand?(node: T): string; } - export interface TextEditor { - /** - * Enters snippet mode in the editor with the specified snippet. - * - * @param snippet The snippet to insert in this edit. - * @param options The undo/redo behaviour around this edit. By default, undo stops will be created before and after this edit. - */ - edit(snippet: SnippetString, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): void; - - } - export interface SCMResourceThemableDecorations { readonly iconPath?: string | Uri; } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index c3b4b79e787af..77ad888610262 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -34,7 +34,7 @@ import { IWorkspaceConfigurationValues } from 'vs/workbench/services/configurati import { IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; -import { IApplyEditsOptions, IInsertSnippetOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditorsTracker'; +import { IApplyEditsOptions, IUndoStopOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditorsTracker'; import { InternalTreeExplorerNodeContent } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; @@ -137,7 +137,7 @@ export abstract class MainThreadEditorsShape { $tryRevealRange(id: string, range: editorCommon.IRange, revealType: TextEditorRevealType): TPromise { throw ni(); } $trySetSelections(id: string, selections: editorCommon.ISelection[]): TPromise { throw ni(); } $tryApplyEdits(id: string, modelVersionId: number, edits: editorCommon.ISingleEditOperation[], opts: IApplyEditsOptions): TPromise { throw ni(); } - $tryInsertSnippet(id: string, template: string, opts: IInsertSnippetOptions): TPromise { throw ni(); } + $tryInsertSnippet(id: string, template: string, opts: IUndoStopOptions): TPromise { throw ni(); } } export abstract class MainThreadTreeExplorersShape { diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index d81a46e5e7552..3a65e8da293cd 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -596,11 +596,11 @@ class ExtHostTextEditor implements vscode.TextEditor { // ---- editing edit(callback: (edit: TextEditorEdit) => void, options: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; - edit(snippet: SnippetString, options: { undoStopBefore: boolean; undoStopAfter: boolean; }): void; + edit(snippet: SnippetString, options: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; - edit(callbackOrSnippet: ((edit: TextEditorEdit) => void) | SnippetString, options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable | void { + edit(callbackOrSnippet: ((edit: TextEditorEdit) => void) | SnippetString, options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Thenable { if (SnippetString.isSnippetString(callbackOrSnippet)) { - this._proxy.$tryInsertSnippet(this._id, callbackOrSnippet.value, options); + return this._proxy.$tryInsertSnippet(this._id, callbackOrSnippet.value, options); } else { let edit = new TextEditorEdit(this._documentData.document, options); callbackOrSnippet(edit); diff --git a/src/vs/workbench/api/node/mainThreadEditors.ts b/src/vs/workbench/api/node/mainThreadEditors.ts index 3b5f54e6b6666..7061f854f3afb 100644 --- a/src/vs/workbench/api/node/mainThreadEditors.ts +++ b/src/vs/workbench/api/node/mainThreadEditors.ts @@ -14,7 +14,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { MainThreadEditorsTracker, TextEditorRevealType, MainThreadTextEditor, IApplyEditsOptions, IInsertSnippetOptions, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditorsTracker'; +import { MainThreadEditorsTracker, TextEditorRevealType, MainThreadTextEditor, IApplyEditsOptions, IUndoStopOptions, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditorsTracker'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals as arrayEquals } from 'vs/base/common/arrays'; import { equals as objectEquals } from 'vs/base/common/objects'; @@ -293,12 +293,11 @@ export class MainThreadEditors extends MainThreadEditorsShape { return TPromise.as(this._textEditorsMap[id].applyEdits(modelVersionId, edits, opts)); } - $tryInsertSnippet(id: string, template: string, opts: IInsertSnippetOptions): TPromise { + $tryInsertSnippet(id: string, template: string, opts: IUndoStopOptions): TPromise { if (!this._textEditorsMap[id]) { return TPromise.wrapError('TextEditor disposed'); } - this._textEditorsMap[id].insertSnippet(template, opts); - return TPromise.as(null); + return TPromise.as(this._textEditorsMap[id].insertSnippet(template, opts)); } $registerTextEditorDecorationType(key: string, options: IDecorationRenderOptions): void { diff --git a/src/vs/workbench/api/node/mainThreadEditorsTracker.ts b/src/vs/workbench/api/node/mainThreadEditorsTracker.ts index 389f6a9076ad9..127ff1c937319 100644 --- a/src/vs/workbench/api/node/mainThreadEditorsTracker.ts +++ b/src/vs/workbench/api/node/mainThreadEditorsTracker.ts @@ -68,10 +68,6 @@ export interface IApplyEditsOptions extends IUndoStopOptions { setEndOfLine: EndOfLine; } -export interface IInsertSnippetOptions extends IUndoStopOptions { - -} - /** * Text Editor that is permanently bound to the same model. * It can be bound or not to a CodeEditor. @@ -392,9 +388,13 @@ export class MainThreadTextEditor { return false; } - insertSnippet(template: string, opts: IInsertSnippetOptions) { + insertSnippet(template: string, opts: IUndoStopOptions) { const snippetController = SnippetController.get(this._codeEditor); + if (!this._codeEditor) { + return false; + } + this._codeEditor.focus(); if (opts.undoStopBefore) { @@ -406,6 +406,8 @@ export class MainThreadTextEditor { if (opts.undoStopAfter) { this._codeEditor.pushUndoStop(); } + + return true; } }