aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/ctx.ts
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/ctx.ts')
-rw-r--r--editors/code/src/ctx.ts48
1 files changed, 20 insertions, 28 deletions
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index a2a4e42a9..70042a479 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -1,5 +1,6 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient'; 2import * as lc from 'vscode-languageclient';
3
3import { Config } from './config'; 4import { Config } from './config';
4import { createClient } from './client'; 5import { createClient } from './client';
5 6
@@ -10,6 +11,9 @@ export class Ctx {
10 // deal with it. 11 // deal with it.
11 // 12 //
12 // Ideally, this should be replaced with async getter though. 13 // Ideally, this should be replaced with async getter though.
14 // FIXME: this actually needs syncronization of some kind (check how
15 // vscode deals with `deactivate()` call when extension has some work scheduled
16 // on the event loop to get a better picture of what we can do here)
13 client: lc.LanguageClient | null = null; 17 client: lc.LanguageClient | null = null;
14 private extCtx: vscode.ExtensionContext; 18 private extCtx: vscode.ExtensionContext;
15 private onDidRestartHooks: Array<(client: lc.LanguageClient) => void> = []; 19 private onDidRestartHooks: Array<(client: lc.LanguageClient) => void> = [];
@@ -20,12 +24,19 @@ export class Ctx {
20 } 24 }
21 25
22 async restartServer() { 26 async restartServer() {
23 let old = this.client; 27 const old = this.client;
24 if (old) { 28 if (old) {
25 await old.stop(); 29 await old.stop();
26 } 30 }
27 this.client = null; 31 this.client = null;
28 const client = createClient(this.config); 32 const client = await createClient(this.config);
33 if (!client) {
34 throw new Error(
35 "Rust Analyzer Language Server is not available. " +
36 "Please, ensure its [proper installation](https://github.com/rust-analyzer/rust-analyzer/tree/master/docs/user#vs-code)."
37 );
38 }
39
29 this.pushCleanup(client.start()); 40 this.pushCleanup(client.start());
30 await client.onReady(); 41 await client.onReady();
31 42
@@ -49,33 +60,11 @@ export class Ctx {
49 this.pushCleanup(d); 60 this.pushCleanup(d);
50 } 61 }
51 62
52 overrideCommand(name: string, factory: (ctx: Ctx) => Cmd) { 63 get subscriptions(): Disposable[] {
53 const defaultCmd = `default:${name}`;
54 const override = factory(this);
55 const original = (...args: any[]) =>
56 vscode.commands.executeCommand(defaultCmd, ...args);
57 try {
58 const d = vscode.commands.registerCommand(
59 name,
60 async (...args: any[]) => {
61 if (!(await override(...args))) {
62 return await original(...args);
63 }
64 },
65 );
66 this.pushCleanup(d);
67 } catch (_) {
68 vscode.window.showWarningMessage(
69 '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',
70 );
71 }
72 }
73
74 get subscriptions(): { dispose(): any }[] {
75 return this.extCtx.subscriptions; 64 return this.extCtx.subscriptions;
76 } 65 }
77 66
78 pushCleanup(d: { dispose(): any }) { 67 pushCleanup(d: Disposable) {
79 this.extCtx.subscriptions.push(d); 68 this.extCtx.subscriptions.push(d);
80 } 69 }
81 70
@@ -84,12 +73,15 @@ export class Ctx {
84 } 73 }
85} 74}
86 75
87export type Cmd = (...args: any[]) => any; 76export interface Disposable {
77 dispose(): void;
78}
79export type Cmd = (...args: any[]) => unknown;
88 80
89export async function sendRequestWithRetry<R>( 81export async function sendRequestWithRetry<R>(
90 client: lc.LanguageClient, 82 client: lc.LanguageClient,
91 method: string, 83 method: string,
92 param: any, 84 param: unknown,
93 token?: vscode.CancellationToken, 85 token?: vscode.CancellationToken,
94): Promise<R> { 86): Promise<R> {
95 for (const delay of [2, 4, 6, 8, 10, null]) { 87 for (const delay of [2, 4, 6, 8, 10, null]) {