55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import * as vscode from 'vscode';
|
|
import * as lc from 'vscode-languageclient';
|
|
import * as ra from './rust-analyzer-api';
|
|
|
|
import { Ctx } from './ctx';
|
|
|
|
export async function applySourceChange(ctx: Ctx, change: ra.SourceChange) {
|
|
const client = ctx.client;
|
|
if (!client) return;
|
|
|
|
const wsEdit = 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 = client.protocol2CodeConverter.asUri(
|
|
toReveal.textDocument.uri,
|
|
);
|
|
const position = client.protocol2CodeConverter.asPosition(
|
|
toReveal.position,
|
|
);
|
|
const editor = vscode.window.activeTextEditor;
|
|
if (!editor || !editor.selection.isEmpty) {
|
|
return;
|
|
}
|
|
|
|
if (editor.document.uri !== uri) {
|
|
const doc = await vscode.workspace.openTextDocument(uri);
|
|
await vscode.window.showTextDocument(doc);
|
|
}
|
|
editor.selection = new vscode.Selection(position, position);
|
|
editor.revealRange(
|
|
new vscode.Range(position, position),
|
|
vscode.TextEditorRevealType.Default,
|
|
);
|
|
}
|
|
}
|