class TextDocumentContentProvider
implements vscode.TextDocumentContentProvider {
+ ctx: Ctx
uri = vscode.Uri.parse('rust-analyzer-status://status');
eventEmitter = new vscode.EventEmitter<vscode.Uri>();
- ctx: Ctx
-
constructor(ctx: Ctx) {
this.ctx = ctx
}
_uri: vscode.Uri,
): vscode.ProviderResult<string> {
const editor = vscode.window.activeTextEditor;
- if (editor == null) {
- return '';
- }
+ if (editor == null) return '';
+
return this.ctx.client.sendRequest<string>(
'rust-analyzer/analyzerStatus',
null,
+++ /dev/null
-import * as vscode from 'vscode';
-import * as lc from 'vscode-languageclient';
-
-import { Server } from '../server';
-
-export interface SourceChange {
- label: string;
- workspaceEdit: lc.WorkspaceEdit;
- cursorPosition?: lc.TextDocumentPositionParams;
-}
-
-export async function handle(change: SourceChange) {
- const wsEdit = Server.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 = Server.client.protocol2CodeConverter.asUri(
- toReveal.textDocument.uri,
- );
- const position = Server.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,
- );
- }
-}
import { analyzerStatus } from './analyzer_status';
import { matchingBrace } from './matching_brace';
import { joinLines } from './join_lines';
-import * as applySourceChange from './apply_source_change';
+import { onEnter } from './on_enter';
import * as expandMacro from './expand_macro';
import * as inlayHints from './inlay_hints';
-import * as onEnter from './on_enter';
import * as parentModule from './parent_module';
import * as runnables from './runnables';
import * as syntaxTree from './syntaxTree';
export {
analyzerStatus,
- applySourceChange,
expandMacro,
joinLines,
matchingBrace,
import { Range, TextDocumentIdentifier } from 'vscode-languageclient';
import { Ctx, Cmd } from '../ctx';
import {
- handle as applySourceChange,
- SourceChange,
-} from './apply_source_change';
+ applySourceChange, SourceChange
+} from '../source_change';
export function joinLines(ctx: Ctx): Cmd {
return async () => {
const editor = ctx.activeRustEditor;
- if (!editor) {
- return;
- }
+ if (!editor) return;
+
const request: JoinLinesParams = {
range: ctx.client.code2ProtocolConverter.asRange(editor.selection),
textDocument: { uri: editor.document.uri.toString() },
'rust-analyzer/joinLines',
request,
);
- await applySourceChange(change);
+ await applySourceChange(ctx, change);
}
}
-import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient';
-import { Server } from '../server';
import {
- handle as applySourceChange,
+ applySourceChange,
SourceChange,
-} from './apply_source_change';
+} from '../source_change';
+import { Cmd, Ctx } from '../ctx';
-export async function handle(event: { text: string }): Promise<boolean> {
- const editor = vscode.window.activeTextEditor;
- if (
- editor == null ||
- editor.document.languageId !== 'rust' ||
- event.text !== '\n'
- ) {
- return false;
- }
- const request: lc.TextDocumentPositionParams = {
- textDocument: { uri: editor.document.uri.toString() },
- position: Server.client.code2ProtocolConverter.asPosition(
- editor.selection.active,
- ),
- };
- const change = await Server.client.sendRequest<undefined | SourceChange>(
- 'rust-analyzer/onEnter',
- request,
- );
- if (!change) {
- return false;
+export function onEnter(ctx: Ctx): Cmd {
+ return async (event: { text: string }) => {
+ const editor = ctx.activeRustEditor;
+ if (!editor || event.text !== '\n') return false;
+
+ const request: lc.TextDocumentPositionParams = {
+ textDocument: { uri: editor.document.uri.toString() },
+ position: ctx.client.code2ProtocolConverter.asPosition(
+ editor.selection.active,
+ ),
+ };
+ const change = await ctx.client.sendRequest<undefined | SourceChange>(
+ 'rust-analyzer/onEnter',
+ request,
+ );
+ if (!change) return false;
+
+ await applySourceChange(ctx, change);
+ return true;
}
- await applySourceChange(change);
- return true;
}
this.pushCleanup(d);
}
+ overrideCommand(name: string, factory: (ctx: Ctx) => Cmd) {
+ const defaultCmd = `default:${name}`;
+ const override = factory(this);
+ const original = (...args: any[]) =>
+ vscode.commands.executeCommand(defaultCmd, ...args);
+ try {
+ const d = vscode.commands.registerCommand(
+ name,
+ async (...args: any[]) => {
+ if (!(await override(...args))) {
+ return await original(...args);
+ }
+ },
+ );
+ this.pushCleanup(d);
+ } catch (_) {
+ vscode.window.showWarningMessage(
+ 'Enhanced typing feature is disabled because of incompatibility with VIM extension, consider turning off rust-analyzer.enableEnhancedTyping: https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/README.md#settings',
+ );
+ }
+ }
+
pushCleanup(d: { dispose(): any }) {
this.extCtx.subscriptions.push(d);
}
function registerCommand(name: string, f: any) {
disposeOnDeactivation(vscode.commands.registerCommand(name, f));
}
- function overrideCommand(
- name: string,
- f: (...args: any[]) => Promise<boolean>,
- ) {
- const defaultCmd = `default:${name}`;
- const original = (...args: any[]) =>
- vscode.commands.executeCommand(defaultCmd, ...args);
-
- try {
- registerCommand(name, async (...args: any[]) => {
- const editor = vscode.window.activeTextEditor;
- if (
- !editor ||
- !editor.document ||
- editor.document.languageId !== 'rust'
- ) {
- return await original(...args);
- }
- if (!(await f(...args))) {
- return await original(...args);
- }
- });
- } catch (_) {
- vscode.window.showWarningMessage(
- 'Enhanced typing feature is disabled because of incompatibility with VIM extension, consider turning off rust-analyzer.enableEnhancedTyping: https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/README.md#settings',
- );
- }
- }
// Commands are requests from vscode to the language server
registerCommand('rust-analyzer.parentModule', commands.parentModule.handle);
registerCommand('rust-analyzer.run', commands.runnables.handle);
// Unlike the above this does not send requests to the language server
registerCommand('rust-analyzer.runSingle', commands.runnables.handleSingle);
- registerCommand(
- 'rust-analyzer.applySourceChange',
- commands.applySourceChange.handle,
- );
registerCommand(
'rust-analyzer.showReferences',
(uri: string, position: lc.Position, locations: lc.Location[]) => {
);
if (Server.config.enableEnhancedTyping) {
- overrideCommand('type', commands.onEnter.handle);
+ ctx.overrideCommand('type', commands.onEnter);
}
const watchStatus = new StatusDisplay(
string,
lc.GenericNotificationHandler,
]> = [
- [
- 'rust-analyzer/publishDecorations',
- notifications.publishDecorations.handle,
- ],
- [
- '$/progress',
- params => watchStatus.handleProgressNotification(params),
- ],
- ];
+ [
+ 'rust-analyzer/publishDecorations',
+ notifications.publishDecorations.handle,
+ ],
+ [
+ '$/progress',
+ params => watchStatus.handleProgressNotification(params),
+ ],
+ ];
const syntaxTreeContentProvider = new SyntaxTreeContentProvider();
const expandMacroContentProvider = new ExpandMacroContentProvider();
--- /dev/null
+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,
+ );
+ }
+}