Push IO and error handling up

This commit is contained in:
Aleksey Kladov 2020-02-17 14:03:33 +01:00
parent 6167101302
commit ee4e41cbea
3 changed files with 13 additions and 14 deletions

View file

@ -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<null | lc.LanguageClient> {
export async function createClient(config: Config, serverPath: string): Promise<lc.LanguageClient> {
// '.' 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 },

View file

@ -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();

View file

@ -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);
}