diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts index a6b277c57a1..ac9e4bc9edc 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts @@ -1159,7 +1159,7 @@ suite('vscode API - workspace', () => { assert.ok(edt === vscode.window.activeTextEditor); const we = new vscode.WorkspaceEdit(); - we.replace(document.uri, new vscode.Range(0, 0, 0, 0), new vscode.SnippetString('${1:foo}${2:bar}')); + we.set(document.uri, [new vscode.SnippetTextEdit(new vscode.Range(0, 0, 0, 0), new vscode.SnippetString('${1:foo}${2:bar}'))]); const success = await vscode.workspace.applyEdit(we); if (edt !== vscode.window.activeTextEditor) { return this.skip(); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 6729f902156..1d5ea634ddd 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1287,6 +1287,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TerminalProfile: extHostTypes.TerminalProfile, TextDocumentSaveReason: extHostTypes.TextDocumentSaveReason, TextEdit: extHostTypes.TextEdit, + SnippetTextEdit: extHostTypes.SnippetTextEdit, TextEditorCursorStyle: TextEditorCursorStyle, TextEditorLineNumbersStyle: extHostTypes.TextEditorLineNumbersStyle, TextEditorRevealType: extHostTypes.TextEditorRevealType, diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 238a0be8e0b..6f221cce9c6 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -655,6 +655,29 @@ export class NotebookEdit implements vscode.NotebookEdit { } } +export class SnippetTextEdit implements vscode.SnippetTextEdit { + + static isSnippetTextEdit(thing: any): thing is SnippetTextEdit { + if (thing instanceof SnippetTextEdit) { + return true; + } + if (!thing) { + return false; + } + return Range.isRange((thing).range) + && SnippetString.isSnippetString((thing).snippet); + } + + range: Range; + + snippet: SnippetString; + + constructor(range: Range, snippet: SnippetString) { + this.range = range; + this.snippet = snippet; + } +} + export interface IFileOperationOptions { overwrite?: boolean; ignoreIfExists?: boolean; @@ -758,12 +781,8 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { // --- text - replace(uri: URI, range: Range, newText: string | vscode.SnippetString, metadata?: vscode.WorkspaceEditEntryMetadata): void { - if (typeof newText === 'string') { - this._edits.push({ _type: FileEditType.Text, uri, edit: new TextEdit(range, newText), metadata }); - } else { - this._edits.push({ _type: FileEditType.Snippet, uri, range, edit: newText, metadata }); - } + replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void { + this._edits.push({ _type: FileEditType.Text, uri, edit: new TextEdit(range, newText), metadata }); } insert(resource: URI, position: Position, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void { @@ -792,7 +811,7 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { coalesceInPlace(this._edits); } else { // append edit to the end - for (const edit of edits as TextEdit[] | NotebookEdit[]) { + for (const edit of edits as TextEdit[] | NotebookEdit[] | SnippetTextEdit[]) { if (edit) { if (NotebookEdit.isNotebookCellEdit(edit)) { if (edit.newCellMetadata) { @@ -802,6 +821,9 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { } else { this.replaceNotebookCells(uri, edit.range, edit.newCells); } + } else if (SnippetTextEdit.isSnippetTextEdit(edit)) { + this._edits.push({ _type: FileEditType.Snippet, uri, range: edit.range, edit: edit.snippet }); + } else { this._edits.push({ _type: FileEditType.Text, uri, edit }); } diff --git a/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts b/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts index 46c485216c2..81d9be445df 100644 --- a/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts +++ b/src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts @@ -7,9 +7,38 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/145374 + // TODO@API - WorkspaceEditEntryMetadata + + export class SnippetTextEdit { + + /** + * The range this edit applies to. + */ + range: Range; + + /** + * The {@link SnippetString snippet} this edit will perform. + */ + snippet: SnippetString; + + /** + * Create a new snippet edit. + * + * @param range A range. + * @param snippet A snippet string. + */ + constructor(range: Range, snippet: SnippetString); + } + interface WorkspaceEdit { - // todo@API have a SnippetTextEdit and allow to set that? - replace(uri: Uri, range: Range, newText: string | SnippetString, metadata?: WorkspaceEditEntryMetadata): void; + /** + * Set (and replace) edits for a resource. + * + * @param uri A resource identifier. + * @param edits An array of edits. + */ + // TODO@API we support mixed edits of TextEdit and SnippetTextEdit + set(uri: Uri, edits: TextEdit[] | SnippetTextEdit[] | NotebookEdit[]): void; } }