Skip to content

Commit e5f5a16

Browse files
authored
joh/issue145374 (microsoft#154360)
* enroll more places into `snippetWorkspaceEdit` proposal, microsoft#145374 * tweak API proposal for snippet edits, make this `WorkspaceEdit` only, remove old proposal bit microsoft#145374
1 parent 6cf558d commit e5f5a16

File tree

6 files changed

+47
-27
lines changed

6 files changed

+47
-27
lines changed

extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,17 +1157,14 @@ suite('vscode API - workspace', () => {
11571157
assert.ok(edt === vscode.window.activeTextEditor);
11581158

11591159
const we = new vscode.WorkspaceEdit();
1160-
we.set(document.uri, [{ range: new vscode.Range(0, 0, 0, 0), newText: '', newText2: new vscode.SnippetString('${1:foo}${2:bar}') }]);
1160+
we.replace(document.uri, new vscode.Range(0, 0, 0, 0), new vscode.SnippetString('${1:foo}${2:bar}'));
11611161
const success = await vscode.workspace.applyEdit(we);
1162-
1163-
11641162
if (edt !== vscode.window.activeTextEditor) {
11651163
return this.skip();
11661164
}
11671165

11681166
assert.ok(success);
11691167
assert.strictEqual(document.getText(), 'foobarhello\nworld');
11701168
assert.deepStrictEqual(edt.selections, [new vscode.Selection(0, 0, 0, 3)]);
1171-
11721169
});
11731170
});

src/vs/workbench/api/common/extHostFileSystemEventService.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { FileOperation } from 'vs/platform/files/common/files';
1616
import { CancellationToken } from 'vs/base/common/cancellation';
1717
import { ILogService } from 'vs/platform/log/common/log';
1818
import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace';
19+
import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions';
1920

2021
class FileSystemWatcher implements vscode.FileSystemWatcher {
2122

@@ -223,14 +224,14 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
223224
private async _fireWillEvent<E extends IWaitUntil>(emitter: AsyncEmitter<E>, data: IWaitUntilData<E>, timeout: number, token: CancellationToken): Promise<IWillRunFileOperationParticipation | undefined> {
224225

225226
const extensionNames = new Set<string>();
226-
const edits: WorkspaceEdit[] = [];
227+
const edits: [IExtensionDescription, WorkspaceEdit][] = [];
227228

228-
await emitter.fireAsync(data, token, async (thenable, listener) => {
229+
await emitter.fireAsync(data, token, async (thenable: Promise<unknown>, listener) => {
229230
// ignore all results except for WorkspaceEdits. Those are stored in an array.
230231
const now = Date.now();
231232
const result = await Promise.resolve(thenable);
232233
if (result instanceof WorkspaceEdit) {
233-
edits.push(result);
234+
edits.push([(<IExtensionListener<E>>listener).extension, result]);
234235
extensionNames.add((<IExtensionListener<E>>listener).extension.displayName ?? (<IExtensionListener<E>>listener).extension.identifier.value);
235236
}
236237

@@ -249,11 +250,11 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
249250

250251
// concat all WorkspaceEdits collected via waitUntil-call and send them over to the renderer
251252
const dto: IWorkspaceEditDto = { edits: [] };
252-
for (const edit of edits) {
253+
for (const [extension, edit] of edits) {
253254
const { edits } = typeConverter.WorkspaceEdit.from(edit, {
254255
getTextDocumentVersion: uri => this._extHostDocumentsAndEditors.getDocument(uri)?.version,
255256
getNotebookDocumentVersion: () => undefined,
256-
});
257+
}, isProposedApiEnabled(extension, 'snippetWorkspaceEdit'));
257258
dto.edits = dto.edits.concat(edits);
258259
}
259260
return { edit: dto, extensionNames: Array.from(extensionNames) };

src/vs/workbench/api/common/extHostLanguageFeatures.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ class CodeActionAdapter {
446446
title: candidate.title,
447447
command: candidate.command && this._commands.toInternal(candidate.command, disposables),
448448
diagnostics: candidate.diagnostics && candidate.diagnostics.map(typeConvert.Diagnostic.from),
449-
edit: candidate.edit && typeConvert.WorkspaceEdit.from(candidate.edit),
449+
edit: candidate.edit && typeConvert.WorkspaceEdit.from(candidate.edit, undefined, isProposedApiEnabled(this._extension, 'snippetWorkspaceEdit')),
450450
kind: candidate.kind && candidate.kind.value,
451451
isPreferred: candidate.isPreferred,
452452
disabled: candidate.disabled?.reason
@@ -467,7 +467,7 @@ class CodeActionAdapter {
467467
}
468468
const resolvedItem = (await this._provider.resolveCodeAction(item, token)) ?? item;
469469
return resolvedItem?.edit
470-
? typeConvert.WorkspaceEdit.from(resolvedItem.edit)
470+
? typeConvert.WorkspaceEdit.from(resolvedItem.edit, undefined, isProposedApiEnabled(this._extension, 'snippetWorkspaceEdit'))
471471
: undefined;
472472
}
473473

@@ -522,7 +522,7 @@ class DocumentPasteEditProvider {
522522

523523
return {
524524
insertText: typeof edit.insertText === 'string' ? edit.insertText : { snippet: edit.insertText.value },
525-
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit) : undefined,
525+
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit, undefined, true) : undefined,
526526
};
527527
}
528528
}
@@ -1808,7 +1808,7 @@ class DocumentOnDropEditAdapter {
18081808
}
18091809
return {
18101810
insertText: typeof edit.insertText === 'string' ? edit.insertText : { snippet: edit.insertText.value },
1811-
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit) : undefined,
1811+
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit, undefined, true) : undefined,
18121812
};
18131813
}
18141814
}

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -598,17 +598,28 @@ export namespace WorkspaceEdit {
598598

599599
} else if (entry._type === types.FileEditType.Text) {
600600
// text edits
601-
const edit = <languages.IWorkspaceTextEdit>{
601+
result.edits.push(<languages.IWorkspaceTextEdit>{
602602
resource: entry.uri,
603603
textEdit: TextEdit.from(entry.edit),
604604
versionId: !toCreate.has(entry.uri) ? versionInfo?.getTextDocumentVersion(entry.uri) : undefined,
605605
metadata: entry.metadata
606-
};
607-
if (allowSnippetTextEdit && entry.edit.newText2 instanceof types.SnippetString) {
608-
edit.textEdit.insertAsSnippet = true;
609-
edit.textEdit.text = entry.edit.newText2.value;
606+
});
607+
} else if (entry._type === types.FileEditType.Snippet) {
608+
// snippet text edits
609+
if (!allowSnippetTextEdit) {
610+
console.warn(`DROPPING snippet text edit because proposal IS NOT ENABLED`, entry);
611+
continue;
610612
}
611-
result.edits.push(edit);
613+
result.edits.push(<languages.IWorkspaceTextEdit>{
614+
resource: entry.uri,
615+
textEdit: {
616+
range: Range.from(entry.range),
617+
text: entry.edit.value,
618+
insertAsSnippet: true
619+
},
620+
versionId: !toCreate.has(entry.uri) ? versionInfo?.getTextDocumentVersion(entry.uri) : undefined,
621+
metadata: entry.metadata
622+
});
612623

613624
} else if (entry._type === types.FileEditType.Cell) {
614625
// cell edit

src/vs/workbench/api/common/extHostTypes.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,6 @@ export class TextEdit {
549549

550550
protected _range: Range;
551551
protected _newText: string | null;
552-
newText2?: string | SnippetString;
553552
protected _newEol?: EndOfLine;
554553

555554
get range(): Range {
@@ -660,6 +659,7 @@ export const enum FileEditType {
660659
Text = 2,
661660
Cell = 3,
662661
CellReplace = 5,
662+
Snippet = 6,
663663
}
664664

665665
export interface IFileOperation {
@@ -677,6 +677,14 @@ export interface IFileTextEdit {
677677
metadata?: vscode.WorkspaceEditEntryMetadata;
678678
}
679679

680+
export interface IFileSnippetTextEdit {
681+
_type: FileEditType.Snippet;
682+
uri: URI;
683+
range: vscode.Range;
684+
edit: vscode.SnippetString;
685+
metadata?: vscode.WorkspaceEditEntryMetadata;
686+
}
687+
680688
export interface IFileCellEdit {
681689
_type: FileEditType.Cell;
682690
uri: URI;
@@ -695,7 +703,7 @@ export interface ICellEdit {
695703
}
696704

697705

698-
type WorkspaceEditEntry = IFileOperation | IFileTextEdit | IFileCellEdit | ICellEdit;
706+
type WorkspaceEditEntry = IFileOperation | IFileTextEdit | IFileSnippetTextEdit | IFileCellEdit | ICellEdit;
699707

700708
@es5ClassCompat
701709
export class WorkspaceEdit implements vscode.WorkspaceEdit {
@@ -762,8 +770,12 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
762770

763771
// --- text
764772

765-
replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void {
766-
this._edits.push({ _type: FileEditType.Text, uri, edit: new TextEdit(range, newText), metadata });
773+
replace(uri: URI, range: Range, newText: string | vscode.SnippetString, metadata?: vscode.WorkspaceEditEntryMetadata): void {
774+
if (typeof newText === 'string') {
775+
this._edits.push({ _type: FileEditType.Text, uri, edit: new TextEdit(range, newText), metadata });
776+
} else {
777+
this._edits.push({ _type: FileEditType.Snippet, uri, range, edit: newText, metadata });
778+
}
767779
}
768780

769781
insert(resource: URI, position: Position, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void {

src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ declare module 'vscode' {
77

88
// https://github.com/microsoft/vscode/issues/145374
99

10-
export interface TextEdit {
10+
interface WorkspaceEdit {
1111

12-
// will be merged with newText
13-
// will NOT be supported everywhere, only: `workspace.applyEdit`
14-
newText2?: string | SnippetString;
12+
// todo@API have a SnippetTextEdit and allow to set that?
13+
replace(uri: Uri, range: Range, newText: string | SnippetString, metadata?: WorkspaceEditEntryMetadata): void;
1514
}
1615
}

0 commit comments

Comments
 (0)