Skip to content

Commit

Permalink
joh/issue145374 (#154360)
Browse files Browse the repository at this point in the history
* enroll more places into `snippetWorkspaceEdit` proposal,

#145374

* tweak API proposal for snippet edits, make this `WorkspaceEdit` only, remove old proposal bit

#145374
  • Loading branch information
jrieken authored Jul 7, 2022
1 parent 6cf558d commit e5f5a16
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1157,17 +1157,14 @@ suite('vscode API - workspace', () => {
assert.ok(edt === vscode.window.activeTextEditor);

const we = new vscode.WorkspaceEdit();
we.set(document.uri, [{ range: new vscode.Range(0, 0, 0, 0), newText: '', newText2: new vscode.SnippetString('${1:foo}${2:bar}') }]);
we.replace(document.uri, 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();
}

assert.ok(success);
assert.strictEqual(document.getText(), 'foobarhello\nworld');
assert.deepStrictEqual(edt.selections, [new vscode.Selection(0, 0, 0, 3)]);

});
});
11 changes: 6 additions & 5 deletions src/vs/workbench/api/common/extHostFileSystemEventService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { FileOperation } from 'vs/platform/files/common/files';
import { CancellationToken } from 'vs/base/common/cancellation';
import { ILogService } from 'vs/platform/log/common/log';
import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace';
import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions';

class FileSystemWatcher implements vscode.FileSystemWatcher {

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

const extensionNames = new Set<string>();
const edits: WorkspaceEdit[] = [];
const edits: [IExtensionDescription, WorkspaceEdit][] = [];

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

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

// concat all WorkspaceEdits collected via waitUntil-call and send them over to the renderer
const dto: IWorkspaceEditDto = { edits: [] };
for (const edit of edits) {
for (const [extension, edit] of edits) {
const { edits } = typeConverter.WorkspaceEdit.from(edit, {
getTextDocumentVersion: uri => this._extHostDocumentsAndEditors.getDocument(uri)?.version,
getNotebookDocumentVersion: () => undefined,
});
}, isProposedApiEnabled(extension, 'snippetWorkspaceEdit'));
dto.edits = dto.edits.concat(edits);
}
return { edit: dto, extensionNames: Array.from(extensionNames) };
Expand Down
8 changes: 4 additions & 4 deletions src/vs/workbench/api/common/extHostLanguageFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ class CodeActionAdapter {
title: candidate.title,
command: candidate.command && this._commands.toInternal(candidate.command, disposables),
diagnostics: candidate.diagnostics && candidate.diagnostics.map(typeConvert.Diagnostic.from),
edit: candidate.edit && typeConvert.WorkspaceEdit.from(candidate.edit),
edit: candidate.edit && typeConvert.WorkspaceEdit.from(candidate.edit, undefined, isProposedApiEnabled(this._extension, 'snippetWorkspaceEdit')),
kind: candidate.kind && candidate.kind.value,
isPreferred: candidate.isPreferred,
disabled: candidate.disabled?.reason
Expand All @@ -467,7 +467,7 @@ class CodeActionAdapter {
}
const resolvedItem = (await this._provider.resolveCodeAction(item, token)) ?? item;
return resolvedItem?.edit
? typeConvert.WorkspaceEdit.from(resolvedItem.edit)
? typeConvert.WorkspaceEdit.from(resolvedItem.edit, undefined, isProposedApiEnabled(this._extension, 'snippetWorkspaceEdit'))
: undefined;
}

Expand Down Expand Up @@ -522,7 +522,7 @@ class DocumentPasteEditProvider {

return {
insertText: typeof edit.insertText === 'string' ? edit.insertText : { snippet: edit.insertText.value },
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit) : undefined,
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit, undefined, true) : undefined,
};
}
}
Expand Down Expand Up @@ -1808,7 +1808,7 @@ class DocumentOnDropEditAdapter {
}
return {
insertText: typeof edit.insertText === 'string' ? edit.insertText : { snippet: edit.insertText.value },
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit) : undefined,
additionalEdit: edit.additionalEdit ? typeConvert.WorkspaceEdit.from(edit.additionalEdit, undefined, true) : undefined,
};
}
}
Expand Down
23 changes: 17 additions & 6 deletions src/vs/workbench/api/common/extHostTypeConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -598,17 +598,28 @@ export namespace WorkspaceEdit {

} else if (entry._type === types.FileEditType.Text) {
// text edits
const edit = <languages.IWorkspaceTextEdit>{
result.edits.push(<languages.IWorkspaceTextEdit>{
resource: entry.uri,
textEdit: TextEdit.from(entry.edit),
versionId: !toCreate.has(entry.uri) ? versionInfo?.getTextDocumentVersion(entry.uri) : undefined,
metadata: entry.metadata
};
if (allowSnippetTextEdit && entry.edit.newText2 instanceof types.SnippetString) {
edit.textEdit.insertAsSnippet = true;
edit.textEdit.text = entry.edit.newText2.value;
});
} else if (entry._type === types.FileEditType.Snippet) {
// snippet text edits
if (!allowSnippetTextEdit) {
console.warn(`DROPPING snippet text edit because proposal IS NOT ENABLED`, entry);
continue;
}
result.edits.push(edit);
result.edits.push(<languages.IWorkspaceTextEdit>{
resource: entry.uri,
textEdit: {
range: Range.from(entry.range),
text: entry.edit.value,
insertAsSnippet: true
},
versionId: !toCreate.has(entry.uri) ? versionInfo?.getTextDocumentVersion(entry.uri) : undefined,
metadata: entry.metadata
});

} else if (entry._type === types.FileEditType.Cell) {
// cell edit
Expand Down
20 changes: 16 additions & 4 deletions src/vs/workbench/api/common/extHostTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,6 @@ export class TextEdit {

protected _range: Range;
protected _newText: string | null;
newText2?: string | SnippetString;
protected _newEol?: EndOfLine;

get range(): Range {
Expand Down Expand Up @@ -660,6 +659,7 @@ export const enum FileEditType {
Text = 2,
Cell = 3,
CellReplace = 5,
Snippet = 6,
}

export interface IFileOperation {
Expand All @@ -677,6 +677,14 @@ export interface IFileTextEdit {
metadata?: vscode.WorkspaceEditEntryMetadata;
}

export interface IFileSnippetTextEdit {
_type: FileEditType.Snippet;
uri: URI;
range: vscode.Range;
edit: vscode.SnippetString;
metadata?: vscode.WorkspaceEditEntryMetadata;
}

export interface IFileCellEdit {
_type: FileEditType.Cell;
uri: URI;
Expand All @@ -695,7 +703,7 @@ export interface ICellEdit {
}


type WorkspaceEditEntry = IFileOperation | IFileTextEdit | IFileCellEdit | ICellEdit;
type WorkspaceEditEntry = IFileOperation | IFileTextEdit | IFileSnippetTextEdit | IFileCellEdit | ICellEdit;

@es5ClassCompat
export class WorkspaceEdit implements vscode.WorkspaceEdit {
Expand Down Expand Up @@ -762,8 +770,12 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {

// --- text

replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void {
this._edits.push({ _type: FileEditType.Text, uri, edit: new TextEdit(range, newText), metadata });
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 });
}
}

insert(resource: URI, position: Position, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void {
Expand Down
7 changes: 3 additions & 4 deletions src/vscode-dts/vscode.proposed.snippetWorkspaceEdit.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ declare module 'vscode' {

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

export interface TextEdit {
interface WorkspaceEdit {

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

0 comments on commit e5f5a16

Please sign in to comment.