aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_ide/src/lib.rs5
-rw-r--r--crates/ra_ide_db/src/lib.rs12
-rw-r--r--crates/rust-analyzer/src/main_loop.rs121
-rw-r--r--crates/rust-analyzer/src/world.rs11
4 files changed, 89 insertions, 60 deletions
diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs
index e43414985..937c9caa5 100644
--- a/crates/ra_ide/src/lib.rs
+++ b/crates/ra_ide/src/lib.rs
@@ -138,6 +138,11 @@ impl AnalysisHost {
138 pub fn new(lru_capacity: Option<usize>) -> AnalysisHost { 138 pub fn new(lru_capacity: Option<usize>) -> AnalysisHost {
139 AnalysisHost { db: RootDatabase::new(lru_capacity) } 139 AnalysisHost { db: RootDatabase::new(lru_capacity) }
140 } 140 }
141
142 pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
143 self.db.update_lru_capacity(lru_capacity);
144 }
145
141 /// Returns a snapshot of the current state, which you can query for 146 /// Returns a snapshot of the current state, which you can query for
142 /// semantic information. 147 /// semantic information.
143 pub fn analysis(&self) -> Analysis { 148 pub fn analysis(&self) -> Analysis {
diff --git a/crates/ra_ide_db/src/lib.rs b/crates/ra_ide_db/src/lib.rs
index 4faeefa8d..e6f2d36e9 100644
--- a/crates/ra_ide_db/src/lib.rs
+++ b/crates/ra_ide_db/src/lib.rs
@@ -115,12 +115,16 @@ impl RootDatabase {
115 db.set_crate_graph_with_durability(Default::default(), Durability::HIGH); 115 db.set_crate_graph_with_durability(Default::default(), Durability::HIGH);
116 db.set_local_roots_with_durability(Default::default(), Durability::HIGH); 116 db.set_local_roots_with_durability(Default::default(), Durability::HIGH);
117 db.set_library_roots_with_durability(Default::default(), Durability::HIGH); 117 db.set_library_roots_with_durability(Default::default(), Durability::HIGH);
118 let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP); 118 db.update_lru_capacity(lru_capacity);
119 db.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_capacity);
120 db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_capacity);
121 db.query_mut(hir::db::MacroExpandQuery).set_lru_capacity(lru_capacity);
122 db 119 db
123 } 120 }
121
122 pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
123 let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP);
124 self.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_capacity);
125 self.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_capacity);
126 self.query_mut(hir::db::MacroExpandQuery).set_lru_capacity(lru_capacity);
127 }
124} 128}
125 129
126impl salsa::ParallelDatabase for RootDatabase { 130impl salsa::ParallelDatabase for RootDatabase {
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index a48368e30..85bde90bb 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -17,8 +17,9 @@ use std::{
17use crossbeam_channel::{never, select, unbounded, RecvError, Sender}; 17use crossbeam_channel::{never, select, unbounded, RecvError, Sender};
18use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response}; 18use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response};
19use lsp_types::{ 19use lsp_types::{
20 ClientCapabilities, NumberOrString, WorkDoneProgress, WorkDoneProgressBegin, 20 ClientCapabilities, NumberOrString, TextDocumentClientCapabilities, WorkDoneProgress,
21 WorkDoneProgressCreateParams, WorkDoneProgressEnd, WorkDoneProgressReport, 21 WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd,
22 WorkDoneProgressReport,
22}; 23};
23use ra_cargo_watch::{url_from_path_with_drive_lowercasing, CheckOptions, CheckTask}; 24use ra_cargo_watch::{url_from_path_with_drive_lowercasing, CheckOptions, CheckTask};
24use ra_ide::{Canceled, FileId, InlayHintsOptions, LibraryData, SourceRootId}; 25use ra_ide::{Canceled, FileId, InlayHintsOptions, LibraryData, SourceRootId};
@@ -64,6 +65,53 @@ impl fmt::Display for LspError {
64 65
65impl Error for LspError {} 66impl Error for LspError {}
66 67
68fn get_feature_flags(config: &ServerConfig, connection: &Connection) -> FeatureFlags {
69 let mut ff = FeatureFlags::default();
70 for (flag, &value) in &config.feature_flags {
71 if ff.set(flag.as_str(), value).is_err() {
72 log::error!("unknown feature flag: {:?}", flag);
73 show_message(
74 req::MessageType::Error,
75 format!("unknown feature flag: {:?}", flag),
76 &connection.sender,
77 );
78 }
79 }
80 log::info!("feature_flags: {:#?}", ff);
81 ff
82}
83
84fn get_options(
85 config: &ServerConfig,
86 text_document_caps: Option<&TextDocumentClientCapabilities>,
87) -> Options {
88 Options {
89 publish_decorations: config.publish_decorations,
90 supports_location_link: text_document_caps
91 .and_then(|it| it.definition)
92 .and_then(|it| it.link_support)
93 .unwrap_or(false),
94 line_folding_only: text_document_caps
95 .and_then(|it| it.folding_range.as_ref())
96 .and_then(|it| it.line_folding_only)
97 .unwrap_or(false),
98 inlay_hints: InlayHintsOptions {
99 type_hints: config.inlay_hints_type,
100 parameter_hints: config.inlay_hints_parameter,
101 chaining_hints: config.inlay_hints_chaining,
102 max_length: config.inlay_hints_max_length,
103 },
104 cargo_watch: CheckOptions {
105 enable: config.cargo_watch_enable,
106 args: config.cargo_watch_args.clone(),
107 command: config.cargo_watch_command.clone(),
108 all_targets: config.cargo_watch_all_targets,
109 },
110 rustfmt_args: config.rustfmt_args.clone(),
111 vscode_lldb: config.vscode_lldb,
112 }
113}
114
67pub fn main_loop( 115pub fn main_loop(
68 ws_roots: Vec<PathBuf>, 116 ws_roots: Vec<PathBuf>,
69 client_caps: ClientCapabilities, 117 client_caps: ClientCapabilities,
@@ -91,23 +139,10 @@ pub fn main_loop(
91 SetThreadPriority(thread, thread_priority_above_normal); 139 SetThreadPriority(thread, thread_priority_above_normal);
92 } 140 }
93 141
142 let text_document_caps = client_caps.text_document.as_ref();
94 let mut loop_state = LoopState::default(); 143 let mut loop_state = LoopState::default();
95 let mut world_state = { 144 let mut world_state = {
96 let feature_flags = { 145 let feature_flags = get_feature_flags(&config, &connection);
97 let mut ff = FeatureFlags::default();
98 for (flag, value) in config.feature_flags {
99 if ff.set(flag.as_str(), value).is_err() {
100 log::error!("unknown feature flag: {:?}", flag);
101 show_message(
102 req::MessageType::Error,
103 format!("unknown feature flag: {:?}", flag),
104 &connection.sender,
105 );
106 }
107 }
108 ff
109 };
110 log::info!("feature_flags: {:#?}", feature_flags);
111 146
112 // FIXME: support dynamic workspace loading. 147 // FIXME: support dynamic workspace loading.
113 let workspaces = { 148 let workspaces = {
@@ -169,42 +204,13 @@ pub fn main_loop(
169 connection.sender.send(request.into()).unwrap(); 204 connection.sender.send(request.into()).unwrap();
170 } 205 }
171 206
172 let options = {
173 let text_document_caps = client_caps.text_document.as_ref();
174 Options {
175 publish_decorations: config.publish_decorations,
176 supports_location_link: text_document_caps
177 .and_then(|it| it.definition)
178 .and_then(|it| it.link_support)
179 .unwrap_or(false),
180 line_folding_only: text_document_caps
181 .and_then(|it| it.folding_range.as_ref())
182 .and_then(|it| it.line_folding_only)
183 .unwrap_or(false),
184 inlay_hints: InlayHintsOptions {
185 type_hints: config.inlay_hints_type,
186 parameter_hints: config.inlay_hints_parameter,
187 chaining_hints: config.inlay_hints_chaining,
188 max_length: config.inlay_hints_max_length,
189 },
190 cargo_watch: CheckOptions {
191 enable: config.cargo_watch_enable,
192 args: config.cargo_watch_args,
193 command: config.cargo_watch_command,
194 all_targets: config.cargo_watch_all_targets,
195 },
196 rustfmt_args: config.rustfmt_args,
197 vscode_lldb: config.vscode_lldb,
198 }
199 };
200
201 WorldState::new( 207 WorldState::new(
202 ws_roots, 208 ws_roots,
203 workspaces, 209 workspaces,
204 config.lru_capacity, 210 config.lru_capacity,
205 &globs, 211 &globs,
206 Watch(!config.use_client_watching), 212 Watch(!config.use_client_watching),
207 options, 213 get_options(&config, text_document_caps),
208 feature_flags, 214 feature_flags,
209 ) 215 )
210 }; 216 };
@@ -243,17 +249,16 @@ pub fn main_loop(
243 break; 249 break;
244 }; 250 };
245 } 251 }
246 if let Some(new_server_config) = loop_turn( 252 loop_turn(
247 &pool, 253 &pool,
248 &task_sender, 254 &task_sender,
249 &libdata_sender, 255 &libdata_sender,
250 &connection, 256 &connection,
257 text_document_caps,
251 &mut world_state, 258 &mut world_state,
252 &mut loop_state, 259 &mut loop_state,
253 event, 260 event,
254 )? { 261 )?;
255 dbg!(new_server_config);
256 }
257 } 262 }
258 } 263 }
259 world_state.analysis_host.request_cancellation(); 264 world_state.analysis_host.request_cancellation();
@@ -360,10 +365,11 @@ fn loop_turn(
360 task_sender: &Sender<Task>, 365 task_sender: &Sender<Task>,
361 libdata_sender: &Sender<LibraryData>, 366 libdata_sender: &Sender<LibraryData>,
362 connection: &Connection, 367 connection: &Connection,
368 text_document_caps: Option<&TextDocumentClientCapabilities>,
363 world_state: &mut WorldState, 369 world_state: &mut WorldState,
364 loop_state: &mut LoopState, 370 loop_state: &mut LoopState,
365 event: Event, 371 event: Event,
366) -> Result<Option<ServerConfig>> { 372) -> Result<()> {
367 let loop_start = Instant::now(); 373 let loop_start = Instant::now();
368 374
369 // NOTE: don't count blocking select! call as a loop-turn time 375 // NOTE: don't count blocking select! call as a loop-turn time
@@ -374,8 +380,6 @@ fn loop_turn(
374 log::info!("queued count = {}", queue_count); 380 log::info!("queued count = {}", queue_count);
375 } 381 }
376 382
377 let mut new_server_config = None;
378
379 match event { 383 match event {
380 Event::Task(task) => { 384 Event::Task(task) => {
381 on_task(task, &connection.sender, &mut loop_state.pending_requests, world_state); 385 on_task(task, &connection.sender, &mut loop_state.pending_requests, world_state);
@@ -411,13 +415,18 @@ fn loop_turn(
411 } 415 }
412 if Some(&resp.id) == loop_state.configuration_request_id.as_ref() { 416 if Some(&resp.id) == loop_state.configuration_request_id.as_ref() {
413 loop_state.configuration_request_id.take(); 417 loop_state.configuration_request_id.take();
418 // TODO kb unwrap-unwrap-unwrap
414 let new_config = 419 let new_config =
415 serde_json::from_value::<Vec<ServerConfig>>(resp.result.unwrap()) 420 serde_json::from_value::<Vec<ServerConfig>>(resp.result.unwrap())
416 .unwrap() 421 .unwrap()
417 .first() 422 .first()
418 .unwrap() 423 .unwrap()
419 .to_owned(); 424 .to_owned();
420 new_server_config = Some(new_config); 425 world_state.update_configuration(
426 new_config.lru_capacity,
427 get_options(&new_config, text_document_caps),
428 get_feature_flags(&new_config, connection),
429 );
421 } 430 }
422 } 431 }
423 }, 432 },
@@ -488,7 +497,7 @@ fn loop_turn(
488 } 497 }
489 } 498 }
490 499
491 Ok(new_server_config) 500 Ok(())
492} 501}
493 502
494fn on_task( 503fn on_task(
diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs
index ca045f93c..d77844a36 100644
--- a/crates/rust-analyzer/src/world.rs
+++ b/crates/rust-analyzer/src/world.rs
@@ -199,6 +199,17 @@ impl WorldState {
199 } 199 }
200 } 200 }
201 201
202 pub fn update_configuration(
203 &mut self,
204 lru_capacity: Option<usize>,
205 options: Options,
206 feature_flags: FeatureFlags,
207 ) {
208 self.feature_flags = Arc::new(feature_flags);
209 self.analysis_host.update_lru_capacity(lru_capacity);
210 self.options = options;
211 }
212
202 /// Returns a vec of libraries 213 /// Returns a vec of libraries
203 /// FIXME: better API here 214 /// FIXME: better API here
204 pub fn process_changes( 215 pub fn process_changes(