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::<Vec<ServerConfig>>(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::<Vec<ServerConfig>>(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),
+ );
+ }
}
}
},
Err(not) => not,
};
let not = match notification_cast::<req::DidChangeConfiguration>(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::<req::WorkspaceConfiguration>(
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(());
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,
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
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 {
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;
}
return this.dispose();
}
if (!this.updater) this.updater = new HintsUpdater(ctx);
+
+ this.updater.syncCacheAndRenderHints();
},
dispose() {
this.updater?.dispose();
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;