private async onCodeAction(source: Source, workspaceEdit: WorkspaceEdit): Promise<boolean> { const success = workspace.applyEdit(workspaceEdit); if (!success) { return false; } let firstEdit: TextEdit | undefined = undefined; for (const [uri, edits] of workspaceEdit.entries()) { if (uri.fsPath === source.uri.fsPath) { firstEdit = edits[0]; break; } } if (!firstEdit) { return true; } const newLines = firstEdit.newText.match(/\n/g); const editedRange = new Range( firstEdit.range.start.line, 0, firstEdit.range.end.line + 1 + (newLines ? newLines.length : 0), 0); // TODO: Workaround for https://github.com/Microsoft/TypeScript/issues/12249 // apply formatting to the source range until TS returns formatted results const edits = (await commands.executeCommand('vscode.executeFormatRangeProvider', source.uri, editedRange, source.formattingOptions || {})) as TextEdit[]; if (!edits || !edits.length) { return false; } const formattingEdit = new WorkspaceEdit(); formattingEdit.set(source.uri, edits); return workspace.applyEdit(formattingEdit); }
private async doRefactoring(file: string, refactor: string, action: string, range: Range): Promise<boolean> { const args: Proto.GetEditsForRefactorRequestArgs = { file, refactor, action, startLine: range.start.line + 1, startOffset: range.start.character + 1, endLine: range.end.line + 1, endOffset: range.end.character + 1 }; const response = await this.client.execute('getEditsForRefactor', args); if (!response || !response.body || !response.body.edits.length) { return false; } const edit = this.toWorkspaceEdit(response.body.edits); if (!(await workspace.applyEdit(edit))) { return false; } const renameLocation = response.body.renameLocation; if (renameLocation) { if (window.activeTextEditor && window.activeTextEditor.document.uri.fsPath === file) { const pos = new Position(renameLocation.line - 1, renameLocation.offset - 1); window.activeTextEditor.selection = new Selection(pos, pos); await commands.executeCommand('editor.action.rename'); } } return true; }
saveText: async (text: string) => { const filename = await utils.createFile('', getFixturePath([ rule, value, 'test' ])); const doc = await workspace.openTextDocument(filename); await window.showTextDocument(doc); const edit = new WorkspaceEdit(); edit.insert(doc.uri, new Position(0, 0), text); assert.strictEqual( await workspace.applyEdit(edit), true, 'applies edit' ); return await new Promise(resolve => { let saveCount = 0; workspace.onDidSaveTextDocument(savedDoc => { if (++saveCount === (options.saves || 1)) { resolve(savedDoc.getText()); } }); doc.save(); }); }
private onCodeAction(source: Source, workspaceEdit: WorkspaceEdit) { workspace.applyEdit(workspaceEdit).then(success => { if (!success) { return Promise.reject<boolean>(false); } let firstEdit: TextEdit | null = null; for (const [uri, edits] of workspaceEdit.entries()) { if (uri.fsPath === source.uri.fsPath) { firstEdit = edits[0]; break; } } if (!firstEdit) { return true; } const newLines = firstEdit.newText.match(/\n/g); const editedRange = new Range( new Position(firstEdit.range.start.line, 0), new Position(firstEdit.range.end.line + 1 + (newLines ? newLines.length : 0), 0)); // TODO: Workaround for https://github.com/Microsoft/TypeScript/issues/12249 // apply formatting to the source range until TS returns formatted results return commands.executeCommand('vscode.executeFormatRangeProvider', source.uri, editedRange, source.formattingOptions || {}).then((edits: TextEdit[]) => { if (!edits || !edits.length) { return false; } const workspaceEdit = new WorkspaceEdit(); workspaceEdit.set(source.uri, edits); return workspace.applyEdit(workspaceEdit); }); }); }
export async function applyCodeAction( client: ITypescriptServiceClient, action: Proto.CodeAction, file: string ): Promise<boolean> { if (action.changes && action.changes.length) { const workspaceEdit = new WorkspaceEdit(); for (const change of action.changes) { for (const textChange of change.textChanges) { workspaceEdit.replace(client.asUrl(change.fileName), tsTextSpanToVsRange(textChange), textChange.newText); } } if (!(await workspace.applyEdit(workspaceEdit))) { return false; } } if (action.commands && action.commands.length) { for (const command of action.commands) { const response = await client.execute('applyCodeActionCommand', { file, command }); if (!response || !response.body) { return false; } } } return true; }
private async _revertChanges(textEditor: TextEditor, changes: LineChange[]): Promise<void> { const modifiedDocument = textEditor.document; const modifiedUri = modifiedDocument.uri; if (modifiedUri.scheme !== 'file') { return; } const originalUri = toGitUri(modifiedUri, '~'); const originalDocument = await workspace.openTextDocument(originalUri); const basename = path.basename(modifiedUri.fsPath); const message = localize('confirm revert', "Are you sure you want to revert the selected changes in {0}?", basename); const yes = localize('revert', "Revert Changes"); const pick = await window.showWarningMessage(message, { modal: true }, yes); if (pick !== yes) { return; } const result = applyLineChanges(originalDocument, modifiedDocument, changes); const edit = new WorkspaceEdit(); edit.replace(modifiedUri, new Range(new Position(0, 0), modifiedDocument.lineAt(modifiedDocument.lineCount - 1).range.end), result); workspace.applyEdit(edit); await modifiedDocument.save(); }
it("renames all exact references but not other items with same name", async () => { const doc = currentDoc(); await setTestContent(` class Danny { static int myField = 1; } class Other { static int Danny = 2; } var a = new Danny(); print(Danny.myField); `); const renameResult = await (vs.commands.executeCommand("vscode.executeDocumentRenameProvider", doc.uri, positionOf("D^anny"), "NewDanny") as Thenable<vs.WorkspaceEdit>); await vs.workspace.applyEdit(renameResult); await ensureTestContent(` class NewDanny { static int myField = 1; } class Other { static int Danny = 2; } var a = new NewDanny(); print(NewDanny.myField); `); });
private async doRefactoring(document: TextDocument, file: string, refactor: string, action: string, range: Range): Promise<boolean> { await this.formattingOptionsManager.ensureFormatOptionsForDocument(document, undefined); const args: Proto.GetEditsForRefactorRequestArgs = { ...vsRangeToTsFileRange(file, range), refactor, action }; const response = await this.client.execute('getEditsForRefactor', args); if (!response || !response.body || !response.body.edits.length) { return false; } const edit = this.toWorkspaceEdit(response.body.edits); if (!(await workspace.applyEdit(edit))) { return false; } const renameLocation = response.body.renameLocation; if (renameLocation) { if (window.activeTextEditor && window.activeTextEditor.document.uri.fsPath === file) { const pos = tsLocationToVsPosition(renameLocation); window.activeTextEditor.selection = new Selection(pos, pos); await commands.executeCommand('editor.action.rename'); } } return true; }
return commands.executeCommand('vscode.executeFormatRangeProvider', source.uri, editedRange, source.formattingOptions || {}).then((edits: TextEdit[]) => { if (!edits || !edits.length) { return false; } const workspaceEdit = new WorkspaceEdit(); workspaceEdit.set(source.uri, edits); return workspace.applyEdit(workspaceEdit); });
function applyTextEdit(we) { telemetry.traceEvent('command-applytextedit'); let wse = new vscode.WorkspaceEdit() for (let edit of we.documentChanges[0].edits) { wse.replace(we.documentChanges[0].textDocument.uri, new vscode.Range(edit.range.start.line, edit.range.start.character, edit.range.end.line, edit.range.end.character), edit.newText) } vscode.workspace.applyEdit(wse) }