about summary refs log tree commit diff
path: root/editors/code
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2019-12-30 16:43:34 +0100
committerAleksey Kladov <aleksey.kladov@gmail.com>2019-12-30 19:07:59 +0100
commit5aebf1081dced95a71c674aba65fb5b3e40e6ff1 (patch)
treebacedf66912eee5a366a3c93c60a39ba29744f92 /editors/code
parent83d2527880d86653ce00940c65620319b36afcff (diff)
downloadrust-5aebf1081dced95a71c674aba65fb5b3e40e6ff1.tar.gz
rust-5aebf1081dced95a71c674aba65fb5b3e40e6ff1.zip
Refactor applySourceChange
Diffstat (limited to 'editors/code')
-rw-r--r--editors/code/src/commands/analyzer_status.ts8
-rw-r--r--editors/code/src/commands/index.ts4
-rw-r--r--editors/code/src/commands/join_lines.ts12
-rw-r--r--editors/code/src/commands/on_enter.ts49
-rw-r--r--editors/code/src/ctx.ts22
-rw-r--r--editors/code/src/main.ts52
-rw-r--r--editors/code/src/source_change.ts (renamed from editors/code/src/commands/apply_source_change.ts)10
7 files changed, 68 insertions, 89 deletions
diff --git a/editors/code/src/commands/analyzer_status.ts b/editors/code/src/commands/analyzer_status.ts
index c9d32fe070a..849c2ec6c6f 100644
--- a/editors/code/src/commands/analyzer_status.ts
+++ b/editors/code/src/commands/analyzer_status.ts
@@ -40,11 +40,10 @@ export function analyzerStatus(ctx: Ctx): Cmd {
 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
     }
@@ -53,9 +52,8 @@ class TextDocumentContentProvider
         _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,
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index 8090c7e5b20..0a0a36e2307 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -3,10 +3,9 @@ import { Ctx, Cmd } from '../ctx'
 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';
@@ -17,7 +16,6 @@ function collectGarbage(ctx: Ctx): Cmd {
 
 export {
     analyzerStatus,
-    applySourceChange,
     expandMacro,
     joinLines,
     matchingBrace,
diff --git a/editors/code/src/commands/join_lines.ts b/editors/code/src/commands/join_lines.ts
index 7952fb0c006..1a4b8a2d808 100644
--- a/editors/code/src/commands/join_lines.ts
+++ b/editors/code/src/commands/join_lines.ts
@@ -1,16 +1,14 @@
 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() },
@@ -19,7 +17,7 @@ export function joinLines(ctx: Ctx): Cmd {
             'rust-analyzer/joinLines',
             request,
         );
-        await applySourceChange(change);
+        await applySourceChange(ctx, change);
     }
 }
 
diff --git a/editors/code/src/commands/on_enter.ts b/editors/code/src/commands/on_enter.ts
index 772c64b3c78..4503e13f008 100644
--- a/editors/code/src/commands/on_enter.ts
+++ b/editors/code/src/commands/on_enter.ts
@@ -1,33 +1,28 @@
-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;
 }
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index 712337fe71c..22af5ef321a 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -27,6 +27,28 @@ export class Ctx {
         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);
     }
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 95beb2d8fba..c3f2806302c 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -27,34 +27,6 @@ export async function activate(context: vscode.ExtensionContext) {
     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);
@@ -62,10 +34,6 @@ export async function activate(context: vscode.ExtensionContext) {
     // 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[]) => {
             vscode.commands.executeCommand(
@@ -78,7 +46,7 @@ export async function activate(context: vscode.ExtensionContext) {
     );
 
     if (Server.config.enableEnhancedTyping) {
-        overrideCommand('type', commands.onEnter.handle);
+        ctx.overrideCommand('type', commands.onEnter);
     }
 
     const watchStatus = new StatusDisplay(
@@ -91,15 +59,15 @@ export async function activate(context: vscode.ExtensionContext) {
         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();
 
diff --git a/editors/code/src/commands/apply_source_change.ts b/editors/code/src/source_change.ts
index 8167398b1ce..a4f9068b274 100644
--- a/editors/code/src/commands/apply_source_change.ts
+++ b/editors/code/src/source_change.ts
@@ -1,7 +1,7 @@
 import * as vscode from 'vscode';
 import * as lc from 'vscode-languageclient';
 
-import { Server } from '../server';
+import { Ctx } from './ctx';
 
 export interface SourceChange {
     label: string;
@@ -9,8 +9,8 @@ export interface SourceChange {
     cursorPosition?: lc.TextDocumentPositionParams;
 }
 
-export async function handle(change: SourceChange) {
-    const wsEdit = Server.client.protocol2CodeConverter.asWorkspaceEdit(
+export async function applySourceChange(ctx: Ctx, change: SourceChange) {
+    const wsEdit = ctx.client.protocol2CodeConverter.asWorkspaceEdit(
         change.workspaceEdit,
     );
     let created;
@@ -32,10 +32,10 @@ export async function handle(change: SourceChange) {
         const doc = await vscode.workspace.openTextDocument(toOpenUri);
         await vscode.window.showTextDocument(doc);
     } else if (toReveal) {
-        const uri = Server.client.protocol2CodeConverter.asUri(
+        const uri = ctx.client.protocol2CodeConverter.asUri(
             toReveal.textDocument.uri,
         );
-        const position = Server.client.protocol2CodeConverter.asPosition(
+        const position = ctx.client.protocol2CodeConverter.asPosition(
             toReveal.position,
         );
         const editor = vscode.window.activeTextEditor;