aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs42
1 files changed, 30 insertions, 12 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index c0395c6d8..ce25ff162 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -9,7 +9,7 @@ use gen_lsp_server::{
9 handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse, 9 handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse,
10}; 10};
11use lsp_types::{ClientCapabilities, NumberOrString}; 11use lsp_types::{ClientCapabilities, NumberOrString};
12use ra_ide_api::{Canceled, FileId, LibraryData}; 12use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData};
13use ra_prof::profile; 13use ra_prof::profile;
14use ra_vfs::VfsTask; 14use ra_vfs::VfsTask;
15use serde::{de::DeserializeOwned, Serialize}; 15use serde::{de::DeserializeOwned, Serialize};
@@ -56,7 +56,7 @@ pub fn main_loop(
56 msg_receiver: &Receiver<RawMessage>, 56 msg_receiver: &Receiver<RawMessage>,
57 msg_sender: &Sender<RawMessage>, 57 msg_sender: &Sender<RawMessage>,
58) -> Result<()> { 58) -> Result<()> {
59 log::debug!("server_config: {:?}", config); 59 log::info!("server_config: {:#?}", config);
60 // FIXME: support dynamic workspace loading. 60 // FIXME: support dynamic workspace loading.
61 let workspaces = { 61 let workspaces = {
62 let ws_worker = workspace_loader(config.with_sysroot); 62 let ws_worker = workspace_loader(config.with_sysroot);
@@ -83,6 +83,21 @@ pub fn main_loop(
83 .iter() 83 .iter()
84 .map(|glob| ra_vfs_glob::Glob::new(glob)) 84 .map(|glob| ra_vfs_glob::Glob::new(glob))
85 .collect::<std::result::Result<Vec<_>, _>>()?; 85 .collect::<std::result::Result<Vec<_>, _>>()?;
86 let feature_flags = {
87 let mut ff = FeatureFlags::default();
88 for (flag, value) in config.feature_flags {
89 if let Err(_) = ff.set(flag.as_str(), value) {
90 log::error!("unknown feature flag: {:?}", flag);
91 show_message(
92 req::MessageType::Error,
93 format!("unknown feature flag: {:?}", flag),
94 msg_sender,
95 );
96 }
97 }
98 ff
99 };
100 log::info!("feature_flags: {:#?}", feature_flags);
86 let mut state = WorldState::new( 101 let mut state = WorldState::new(
87 ws_roots, 102 ws_roots,
88 workspaces, 103 workspaces,
@@ -90,13 +105,13 @@ pub fn main_loop(
90 &globs, 105 &globs,
91 Options { 106 Options {
92 publish_decorations: config.publish_decorations, 107 publish_decorations: config.publish_decorations,
93 show_workspace_loaded: config.show_workspace_loaded,
94 supports_location_link: client_caps 108 supports_location_link: client_caps
95 .text_document 109 .text_document
96 .and_then(|it| it.definition) 110 .and_then(|it| it.definition)
97 .and_then(|it| it.link_support) 111 .and_then(|it| it.link_support)
98 .unwrap_or(false), 112 .unwrap_or(false),
99 }, 113 },
114 feature_flags,
100 ); 115 );
101 116
102 let pool = ThreadPool::new(THREADPOOL_SIZE); 117 let pool = ThreadPool::new(THREADPOOL_SIZE);
@@ -276,7 +291,7 @@ fn main_loop_inner(
276 && in_flight_libraries == 0 291 && in_flight_libraries == 0
277 { 292 {
278 let n_packages: usize = state.workspaces.iter().map(|it| it.n_packages()).sum(); 293 let n_packages: usize = state.workspaces.iter().map(|it| it.n_packages()).sum();
279 if state.options.show_workspace_loaded { 294 if state.feature_flags().get("notifications.workspace-loaded") {
280 let msg = format!("workspace loaded, {} rust packages", n_packages); 295 let msg = format!("workspace loaded, {} rust packages", n_packages);
281 show_message(req::MessageType::Info, msg, msg_sender); 296 show_message(req::MessageType::Info, msg, msg_sender);
282 } 297 }
@@ -587,17 +602,20 @@ fn update_file_notifications_on_threadpool(
587 subscriptions: Vec<FileId>, 602 subscriptions: Vec<FileId>,
588) { 603) {
589 log::trace!("updating notifications for {:?}", subscriptions); 604 log::trace!("updating notifications for {:?}", subscriptions);
605 let publish_diagnostics = world.feature_flags().get("lsp.diagnostics");
590 pool.execute(move || { 606 pool.execute(move || {
591 for file_id in subscriptions { 607 for file_id in subscriptions {
592 match handlers::publish_diagnostics(&world, file_id) { 608 if publish_diagnostics {
593 Err(e) => { 609 match handlers::publish_diagnostics(&world, file_id) {
594 if !is_canceled(&e) { 610 Err(e) => {
595 log::error!("failed to compute diagnostics: {:?}", e); 611 if !is_canceled(&e) {
612 log::error!("failed to compute diagnostics: {:?}", e);
613 }
614 }
615 Ok(params) => {
616 let not = RawNotification::new::<req::PublishDiagnostics>(&params);
617 sender.send(Task::Notify(not)).unwrap();
596 } 618 }
597 }
598 Ok(params) => {
599 let not = RawNotification::new::<req::PublishDiagnostics>(&params);
600 sender.send(Task::Notify(not)).unwrap();
601 } 619 }
602 } 620 }
603 if publish_decorations { 621 if publish_decorations {