add API proposal for workspace edit metadata, #77728

This commit is contained in:
Johannes Rieken
2020-01-20 15:31:50 +01:00
parent 1bafcbe022
commit 63142fc2cb
4 changed files with 91 additions and 58 deletions

View File

@@ -483,15 +483,29 @@ export namespace WorkspaceEdit {
const result: extHostProtocol.IWorkspaceEditDto = {
edits: []
};
for (const entry of (value as types.WorkspaceEdit)._allEntries()) {
const [uri, uriOrEdits] = entry;
if (URI.isUri(uriOrEdits) || uriOrEdits === undefined) {
// resource edits
result.edits.push(<extHostProtocol.IWorkspaceFileEditDto>{ oldUri: uri, newUri: uriOrEdits, options: entry[2] });
} else {
// text edits
const doc = documents && uri ? documents.getDocument(uri) : undefined;
result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{ resource: uri, modelVersionId: doc && doc.version, edit: TextEdit.from(uriOrEdits) });
if (value instanceof types.WorkspaceEdit) {
for (let entry of value.allEntries()) {
if (entry._type === 1) {
// file operation
result.edits.push(<extHostProtocol.IWorkspaceFileEditDto>{
oldUri: entry.from,
newUri: entry.to,
options: entry.options,
metadata: entry.metadata
});
} else {
// text edits
const doc = documents?.getDocument(entry.uri);
result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{
resource: entry.uri,
edit: TextEdit.from(entry.edit),
modelVersionId: doc?.version,
metadata: entry.metadata
});
}
}
}
return result;

View File

@@ -564,7 +564,6 @@ export class TextEdit {
}
}
export interface IFileOperationOptions {
overwrite?: boolean;
ignoreIfExists?: boolean;
@@ -577,12 +576,14 @@ export interface IFileOperation {
from?: URI;
to?: URI;
options?: IFileOperationOptions;
metadata?: vscode.WorkspaceEditMetadata;
}
export interface IFileTextEdit {
_type: 2;
uri: URI;
edit: TextEdit;
metadata?: vscode.WorkspaceEditMetadata;
}
@es5ClassCompat
@@ -590,28 +591,28 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
private _edits = new Array<IFileOperation | IFileTextEdit>();
renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }): void {
this._edits.push({ _type: 1, from, to, options });
renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
this._edits.push({ _type: 1, from, to, options, metadata });
}
createFile(uri: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }): void {
this._edits.push({ _type: 1, from: undefined, to: uri, options });
createFile(uri: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
this._edits.push({ _type: 1, from: undefined, to: uri, options, metadata });
}
deleteFile(uri: vscode.Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean; }): void {
this._edits.push({ _type: 1, from: uri, to: undefined, options });
deleteFile(uri: vscode.Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
this._edits.push({ _type: 1, from: uri, to: undefined, options, metadata });
}
replace(uri: URI, range: Range, newText: string): void {
this._edits.push({ _type: 2, uri, edit: new TextEdit(range, newText) });
replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditMetadata): void {
this._edits.push({ _type: 2, uri, edit: new TextEdit(range, newText), metadata });
}
insert(resource: URI, position: Position, newText: string): void {
this.replace(resource, new Range(position, position), newText);
insert(resource: URI, position: Position, newText: string, metadata?: vscode.WorkspaceEditMetadata): void {
this.replace(resource, new Range(position, position), newText, metadata);
}
delete(resource: URI, range: Range): void {
this.replace(resource, range, '');
delete(resource: URI, range: Range, metadata?: vscode.WorkspaceEditMetadata): void {
this.replace(resource, range, '', metadata);
}
has(uri: URI): boolean {
@@ -663,18 +664,22 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
return values(textEdits);
}
_allEntries(): ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] {
const res: ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] = [];
for (let edit of this._edits) {
if (edit._type === 1) {
res.push([edit.from, edit.to, edit.options]);
} else {
res.push([edit.uri, edit.edit]);
}
}
return res;
allEntries(): ReadonlyArray<IFileTextEdit | IFileOperation> {
return this._edits;
}
// _allEntries(): ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] {
// const res: ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] = [];
// for (let edit of this._edits) {
// if (edit._type === 1) {
// res.push([edit.from, edit.to, edit.options]);
// } else {
// res.push([edit.uri, edit.edit]);
// }
// }
// return res;
// }
get size(): number {
return this.entries().length;
}