From ee4e41cbea8ef3758ccebd9ffb35c5290aebfceb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 17 Feb 2020 14:03:33 +0100 Subject: Push IO and error handling up --- editors/code/src/client.ts | 6 +----- editors/code/src/ctx.ts | 10 ++-------- editors/code/src/main.ts | 11 ++++++++++- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 11894973c..aaf2ef40e 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts @@ -2,18 +2,14 @@ import * as lc from 'vscode-languageclient'; import * as vscode from 'vscode'; import { Config } from './config'; -import { ensureServerBinary } from './installation/server'; import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed'; -export async function createClient(config: Config): Promise { +export async function createClient(config: Config, serverPath: string): Promise { // '.' Is the fallback if no folder is open // TODO?: Workspace folders support Uri's (eg: file://test.txt). // It might be a good idea to test if the uri points to a file. const workspaceFolderPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? '.'; - const serverPath = await ensureServerBinary(config.serverSource); - if (!serverPath) return null; - const run: lc.Executable = { command: serverPath, options: { cwd: workspaceFolderPath }, diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index c06d8ac31..935a6f2b5 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts @@ -23,16 +23,10 @@ export class Ctx { this.extCtx = extCtx; } - async startServer() { + async startServer(serverPath: string) { assert(this.client == null); - const client = await createClient(this.config); - if (!client) { - throw new Error( - "Rust Analyzer Language Server is not available. " + - "Please, ensure its [proper installation](https://github.com/rust-analyzer/rust-analyzer/tree/master/docs/user#vs-code)." - ); - } + const client = await createClient(this.config, serverPath); this.pushCleanup(client.start()); await client.onReady(); diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index 0bf2c4829..ece4883bd 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts @@ -5,18 +5,27 @@ import { activateInlayHints } from './inlay_hints'; import { activateStatusDisplay } from './status_display'; import { Ctx } from './ctx'; import { activateHighlighting } from './highlighting'; +import { ensureServerBinary } from './installation/server'; let ctx: Ctx | undefined; export async function activate(context: vscode.ExtensionContext) { ctx = new Ctx(context); + const serverPath = await ensureServerBinary(ctx.config.serverSource); + if (serverPath == null) { + throw new Error( + "Rust Analyzer Language Server is not available. " + + "Please, ensure its [proper installation](https://github.com/rust-analyzer/rust-analyzer/tree/master/docs/user#vs-code)." + ); + } + // Note: we try to start the server before we activate type hints so that it // registers its `onDidChangeDocument` handler before us. // // This a horribly, horribly wrong way to deal with this problem. try { - await ctx.startServer(); + await ctx.startServer(serverPath); } catch (e) { vscode.window.showErrorMessage(e.message); } -- cgit v1.2.3