From 8a23bec2cdd008ff04cb01cdcca1f379f53156a3 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sat, 21 Mar 2020 00:01:47 +0200 Subject: Style fixes --- crates/rust-analyzer/src/main_loop.rs | 39 +++++++++++++++++++++-------------- editors/code/src/client.ts | 4 ++-- editors/code/src/ctx.ts | 4 ++-- editors/code/src/inlay_hints.ts | 4 +++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 85bde90bb..a64dccd58 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -413,20 +413,27 @@ fn loop_turn( if !removed { log::error!("unexpected response: {:?}", resp) } - if Some(&resp.id) == loop_state.configuration_request_id.as_ref() { + + if Some(resp.id) == loop_state.configuration_request_id { loop_state.configuration_request_id.take(); - // TODO kb unwrap-unwrap-unwrap - let new_config = - serde_json::from_value::>(resp.result.unwrap()) - .unwrap() - .first() - .unwrap() - .to_owned(); - world_state.update_configuration( - new_config.lru_capacity, - get_options(&new_config, text_document_caps), - get_feature_flags(&new_config, connection), - ); + if let Some(err) = resp.error { + log::error!("failed fetch the server settings: {:?}", err) + } else if resp.result.is_none() { + log::error!("received empty server settings response from the client") + } else { + let new_config = + serde_json::from_value::>(resp.result.unwrap())? + .first() + .expect( + "The client is expected to always send a non-empty config data", + ) + .to_owned(); + world_state.update_configuration( + new_config.lru_capacity, + get_options(&new_config, text_document_caps), + get_feature_flags(&new_config, connection), + ); + } } } }, @@ -657,13 +664,15 @@ fn on_notification( Err(not) => not, }; let not = match notification_cast::(not) { - Ok(_params) => { + Ok(_) => { + // As stated in https://github.com/microsoft/language-server-protocol/issues/676, + // this notification's parameters should be ignored and the actual config queried separately. let request_id = loop_state.next_request_id(); let request = request_new::( request_id.clone(), ConfigurationParams::default(), ); - msg_sender.send(request.into()).unwrap(); + msg_sender.send(request.into())?; loop_state.configuration_request_id.replace(request_id); return Ok(()); diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 0d0832c44..34965e2fb 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts @@ -5,7 +5,7 @@ import { Config } from './config'; import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed'; import { SemanticTokensFeature, DocumentSemanticsTokensSignature } from 'vscode-languageclient/lib/semanticTokens.proposed'; -export function configToOptions(config: Config): object { +export function configToServerOptions(config: Config): object { return { publishDecorations: !config.highlightingSemanticTokens, lruCapacity: config.lruCapacity, @@ -50,7 +50,7 @@ export async function createClient(config: Config, serverPath: string): Promise< const clientOptions: lc.LanguageClientOptions = { documentSelector: [{ scheme: 'file', language: 'rust' }], - initializationOptions: configToOptions(config), + initializationOptions: configToServerOptions(config), traceOutputChannel, middleware: { // Workaround for https://github.com/microsoft/vscode-languageserver-node/issues/576 diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index 934638c6d..d2f49cd23 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts @@ -2,7 +2,7 @@ import * as vscode from 'vscode'; import * as lc from 'vscode-languageclient'; import { Config } from './config'; -import { createClient, configToOptions } from './client'; +import { createClient, configToServerOptions } from './client'; import { isRustEditor, RustEditor } from './util'; export class Ctx { @@ -20,7 +20,7 @@ export class Ctx { const res = new Ctx(config, extCtx, client, serverPath); res.pushCleanup(client.start()); await client.onReady(); - client.onRequest('workspace/configuration', _ => [configToOptions(config)]); + client.onRequest('workspace/configuration', _ => [configToServerOptions(config)]); return res; } diff --git a/editors/code/src/inlay_hints.ts b/editors/code/src/inlay_hints.ts index 542d1f367..98663e0e3 100644 --- a/editors/code/src/inlay_hints.ts +++ b/editors/code/src/inlay_hints.ts @@ -18,6 +18,8 @@ export function activateInlayHints(ctx: Ctx) { return this.dispose(); } if (!this.updater) this.updater = new HintsUpdater(ctx); + + this.updater.syncCacheAndRenderHints(); }, dispose() { this.updater?.dispose(); @@ -124,7 +126,7 @@ class HintsUpdater implements Disposable { this.syncCacheAndRenderHints(); } - private syncCacheAndRenderHints() { + public syncCacheAndRenderHints() { // FIXME: make inlayHints request pass an array of files? this.sourceFiles.forEach((file, uri) => this.fetchHints(file).then(hints => { if (!hints) return; -- cgit v1.2.3