diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2019-12-30 16:43:34 +0100 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2019-12-30 19:07:59 +0100 |
| commit | 5aebf1081dced95a71c674aba65fb5b3e40e6ff1 (patch) | |
| tree | bacedf66912eee5a366a3c93c60a39ba29744f92 /editors/code/src/source_change.ts | |
| parent | 83d2527880d86653ce00940c65620319b36afcff (diff) | |
| download | rust-5aebf1081dced95a71c674aba65fb5b3e40e6ff1.tar.gz rust-5aebf1081dced95a71c674aba65fb5b3e40e6ff1.zip | |
Refactor applySourceChange
Diffstat (limited to 'editors/code/src/source_change.ts')
| -rw-r--r-- | editors/code/src/source_change.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/editors/code/src/source_change.ts b/editors/code/src/source_change.ts new file mode 100644 index 00000000000..a4f9068b274 --- /dev/null +++ b/editors/code/src/source_change.ts @@ -0,0 +1,54 @@ +import * as vscode from 'vscode'; +import * as lc from 'vscode-languageclient'; + +import { Ctx } from './ctx'; + +export interface SourceChange { + label: string; + workspaceEdit: lc.WorkspaceEdit; + cursorPosition?: lc.TextDocumentPositionParams; +} + +export async function applySourceChange(ctx: Ctx, change: SourceChange) { + const wsEdit = ctx.client.protocol2CodeConverter.asWorkspaceEdit( + change.workspaceEdit, + ); + let created; + let moved; + if (change.workspaceEdit.documentChanges) { + for (const docChange of change.workspaceEdit.documentChanges) { + if (lc.CreateFile.is(docChange)) { + created = docChange.uri; + } else if (lc.RenameFile.is(docChange)) { + moved = docChange.newUri; + } + } + } + const toOpen = created || moved; + const toReveal = change.cursorPosition; + await vscode.workspace.applyEdit(wsEdit); + if (toOpen) { + const toOpenUri = vscode.Uri.parse(toOpen); + const doc = await vscode.workspace.openTextDocument(toOpenUri); + await vscode.window.showTextDocument(doc); + } else if (toReveal) { + const uri = ctx.client.protocol2CodeConverter.asUri( + toReveal.textDocument.uri, + ); + const position = ctx.client.protocol2CodeConverter.asPosition( + toReveal.position, + ); + const editor = vscode.window.activeTextEditor; + if (!editor || editor.document.uri.toString() !== uri.toString()) { + return; + } + if (!editor.selection.isEmpty) { + return; + } + editor.selection = new vscode.Selection(position, position); + editor.revealRange( + new vscode.Range(position, position), + vscode.TextEditorRevealType.Default, + ); + } +} |
