diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 42 |
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 | }; |
11 | use lsp_types::{ClientCapabilities, NumberOrString}; | 11 | use lsp_types::{ClientCapabilities, NumberOrString}; |
12 | use ra_ide_api::{Canceled, FileId, LibraryData}; | 12 | use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData}; |
13 | use ra_prof::profile; | 13 | use ra_prof::profile; |
14 | use ra_vfs::VfsTask; | 14 | use ra_vfs::VfsTask; |
15 | use serde::{de::DeserializeOwned, Serialize}; | 15 | use 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>(¶ms); | ||
617 | sender.send(Task::Notify(not)).unwrap(); | ||
596 | } | 618 | } |
597 | } | ||
598 | Ok(params) => { | ||
599 | let not = RawNotification::new::<req::PublishDiagnostics>(¶ms); | ||
600 | sender.send(Task::Notify(not)).unwrap(); | ||
601 | } | 619 | } |
602 | } | 620 | } |
603 | if publish_decorations { | 621 | if publish_decorations { |