Skip to content

Commit 92fef01

Browse files
bors[bot]matklad
andauthored
Merge #4964
4964: Move ReqQueue to lsp-server r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents b575b02 + f3cf85a commit 92fef01

File tree

7 files changed

+109
-192
lines changed

7 files changed

+109
-192
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rust-analyzer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ threadpool = "1.7.1"
3232

3333
stdx = { path = "../stdx" }
3434

35-
lsp-server = "0.3.2"
35+
lsp-server = "0.3.3"
3636
ra_flycheck = { path = "../ra_flycheck" }
3737
ra_ide = { path = "../ra_ide" }
3838
ra_prof = { path = "../ra_prof" }

crates/rust-analyzer/src/global_state.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use stdx::format_to;
2020
use crate::{
2121
config::{Config, FilesWatcher},
2222
diagnostics::{CheckFixes, DiagnosticCollection},
23-
main_loop::req_queue::{CompletedInRequest, LatestRequests},
23+
main_loop::request_metrics::{LatestRequests, RequestMetrics},
2424
to_proto::url_from_abs_path,
2525
vfs_glob::{Glob, RustPackageFilterBuilder},
2626
LspError, Result,
@@ -55,19 +55,19 @@ pub struct GlobalState {
5555
pub analysis_host: AnalysisHost,
5656
pub vfs: Arc<RwLock<Vfs>>,
5757
pub task_receiver: Receiver<VfsTask>,
58-
pub latest_requests: Arc<RwLock<LatestRequests>>,
5958
pub flycheck: Option<Flycheck>,
6059
pub diagnostics: DiagnosticCollection,
6160
pub proc_macro_client: ProcMacroClient,
61+
pub(crate) latest_requests: Arc<RwLock<LatestRequests>>,
6262
}
6363

6464
/// An immutable snapshot of the world's state at a point in time.
6565
pub struct GlobalStateSnapshot {
6666
pub config: Config,
6767
pub workspaces: Arc<Vec<ProjectWorkspace>>,
6868
pub analysis: Analysis,
69-
pub latest_requests: Arc<RwLock<LatestRequests>>,
7069
pub check_fixes: CheckFixes,
70+
pub(crate) latest_requests: Arc<RwLock<LatestRequests>>,
7171
vfs: Arc<RwLock<Vfs>>,
7272
}
7373

@@ -236,7 +236,7 @@ impl GlobalState {
236236
self.analysis_host.collect_garbage()
237237
}
238238

239-
pub(crate) fn complete_request(&mut self, request: CompletedInRequest) {
239+
pub(crate) fn complete_request(&mut self, request: RequestMetrics) {
240240
self.latest_requests.write().record(request)
241241
}
242242
}

crates/rust-analyzer/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ mod semantic_tokens;
3232

3333
use serde::de::DeserializeOwned;
3434

35-
pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
35+
pub type Result<T, E = Box<dyn std::error::Error + Send + Sync>> = std::result::Result<T, E>;
3636
pub use crate::{
3737
caps::server_capabilities,
3838
main_loop::LspError,

crates/rust-analyzer/src/main_loop.rs

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
mod handlers;
55
mod subscriptions;
6-
pub(crate) mod req_queue;
6+
pub(crate) mod request_metrics;
77

88
use std::{
99
borrow::Cow,
@@ -17,11 +17,13 @@ use std::{
1717
};
1818

1919
use crossbeam_channel::{never, select, unbounded, RecvError, Sender};
20-
use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response};
20+
use lsp_server::{
21+
Connection, ErrorCode, Message, Notification, ReqQueue, Request, RequestId, Response,
22+
};
2123
use lsp_types::{
22-
DidChangeTextDocumentParams, NumberOrString, TextDocumentContentChangeEvent, WorkDoneProgress,
23-
WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd,
24-
WorkDoneProgressReport,
24+
request::Request as _, DidChangeTextDocumentParams, NumberOrString,
25+
TextDocumentContentChangeEvent, WorkDoneProgress, WorkDoneProgressBegin,
26+
WorkDoneProgressCreateParams, WorkDoneProgressEnd, WorkDoneProgressReport,
2527
};
2628
use ra_flycheck::{CheckTask, Status};
2729
use ra_ide::{Canceled, FileId, LineIndex};
@@ -37,10 +39,9 @@ use crate::{
3739
from_proto,
3840
global_state::{file_id_to_url, GlobalState, GlobalStateSnapshot},
3941
lsp_ext,
40-
main_loop::subscriptions::Subscriptions,
42+
main_loop::{request_metrics::RequestMetrics, subscriptions::Subscriptions},
4143
Result,
4244
};
43-
use req_queue::ReqQueue;
4445

4546
#[derive(Debug)]
4647
pub struct LspError {
@@ -150,10 +151,11 @@ pub fn main_loop(config: Config, connection: Connection) -> Result<()> {
150151
register_options: Some(serde_json::to_value(registration_options).unwrap()),
151152
};
152153
let params = lsp_types::RegistrationParams { registrations: vec![registration] };
153-
let request = loop_state
154-
.req_queue
155-
.outgoing
156-
.register::<lsp_types::request::RegisterCapability>(params, |_, _| ());
154+
let request = loop_state.req_queue.outgoing.register(
155+
lsp_types::request::RegisterCapability::METHOD.to_string(),
156+
params,
157+
DO_NOTHING,
158+
);
157159
connection.sender.send(request.into()).unwrap();
158160
}
159161

@@ -261,9 +263,13 @@ impl fmt::Debug for Event {
261263
}
262264
}
263265

266+
type ReqHandler = fn(&mut GlobalState, Response);
267+
const DO_NOTHING: ReqHandler = |_, _| ();
268+
type Incoming = lsp_server::Incoming<(&'static str, Instant)>;
269+
264270
#[derive(Default)]
265271
struct LoopState {
266-
req_queue: ReqQueue<fn(&mut GlobalState, lsp_server::Response)>,
272+
req_queue: ReqQueue<(&'static str, Instant), ReqHandler>,
267273
subscriptions: Subscriptions,
268274
workspace_loaded: bool,
269275
roots_progress_reported: Option<usize>,
@@ -367,14 +373,19 @@ fn loop_turn(
367373
fn on_task(
368374
task: Task,
369375
msg_sender: &Sender<Message>,
370-
incoming_requests: &mut req_queue::Incoming,
376+
incoming_requests: &mut Incoming,
371377
state: &mut GlobalState,
372378
) {
373379
match task {
374380
Task::Respond(response) => {
375-
if let Some(completed) = incoming_requests.complete(response.id.clone()) {
376-
log::info!("handled req#{} in {:?}", completed.id, completed.duration);
377-
state.complete_request(completed);
381+
if let Some((method, start)) = incoming_requests.complete(response.id.clone()) {
382+
let duration = start.elapsed();
383+
log::info!("handled req#{} in {:?}", response.id, duration);
384+
state.complete_request(RequestMetrics {
385+
id: response.id.clone(),
386+
method: method.to_string(),
387+
duration,
388+
});
378389
msg_sender.send(response.into()).unwrap();
379390
}
380391
}
@@ -387,7 +398,7 @@ fn on_task(
387398

388399
fn on_request(
389400
global_state: &mut GlobalState,
390-
incoming_requests: &mut req_queue::Incoming,
401+
incoming_requests: &mut Incoming,
391402
pool: &ThreadPool,
392403
task_sender: &Sender<Task>,
393404
msg_sender: &Sender<Message>,
@@ -527,37 +538,35 @@ fn on_notification(
527538
Ok(_) => {
528539
// As stated in https://github.com/microsoft/language-server-protocol/issues/676,
529540
// this notification's parameters should be ignored and the actual config queried separately.
530-
let request = loop_state
531-
.req_queue
532-
.outgoing
533-
.register::<lsp_types::request::WorkspaceConfiguration>(
534-
lsp_types::ConfigurationParams {
535-
items: vec![lsp_types::ConfigurationItem {
536-
scope_uri: None,
537-
section: Some("rust-analyzer".to_string()),
538-
}],
539-
},
540-
|global_state, resp| {
541-
log::debug!("config update response: '{:?}", resp);
542-
let Response { error, result, .. } = resp;
543-
544-
match (error, result) {
545-
(Some(err), _) => {
546-
log::error!("failed to fetch the server settings: {:?}", err)
547-
}
548-
(None, Some(configs)) => {
549-
if let Some(new_config) = configs.get(0) {
550-
let mut config = global_state.config.clone();
551-
config.update(&new_config);
552-
global_state.update_configuration(config);
553-
}
541+
let request = loop_state.req_queue.outgoing.register(
542+
lsp_types::request::WorkspaceConfiguration::METHOD.to_string(),
543+
lsp_types::ConfigurationParams {
544+
items: vec![lsp_types::ConfigurationItem {
545+
scope_uri: None,
546+
section: Some("rust-analyzer".to_string()),
547+
}],
548+
},
549+
|global_state, resp| {
550+
log::debug!("config update response: '{:?}", resp);
551+
let Response { error, result, .. } = resp;
552+
553+
match (error, result) {
554+
(Some(err), _) => {
555+
log::error!("failed to fetch the server settings: {:?}", err)
556+
}
557+
(None, Some(configs)) => {
558+
if let Some(new_config) = configs.get(0) {
559+
let mut config = global_state.config.clone();
560+
config.update(&new_config);
561+
global_state.update_configuration(config);
554562
}
555-
(None, None) => log::error!(
556-
"received empty server settings response from the client"
557-
),
558563
}
559-
},
560-
);
564+
(None, None) => {
565+
log::error!("received empty server settings response from the client")
566+
}
567+
}
568+
},
569+
);
561570
msg_sender.send(request.into())?;
562571

563572
return Ok(());
@@ -727,15 +736,13 @@ fn send_startup_progress(sender: &Sender<Message>, loop_state: &mut LoopState) {
727736

728737
match (prev, loop_state.workspace_loaded) {
729738
(None, false) => {
730-
let request = loop_state
731-
.req_queue
732-
.outgoing
733-
.register::<lsp_types::request::WorkDoneProgressCreate>(
734-
WorkDoneProgressCreateParams {
735-
token: lsp_types::ProgressToken::String("rustAnalyzer/startup".into()),
736-
},
737-
|_, _| (),
738-
);
739+
let request = loop_state.req_queue.outgoing.register(
740+
lsp_types::request::WorkDoneProgressCreate::METHOD.to_string(),
741+
WorkDoneProgressCreateParams {
742+
token: lsp_types::ProgressToken::String("rustAnalyzer/startup".into()),
743+
},
744+
DO_NOTHING,
745+
);
739746
sender.send(request.into()).unwrap();
740747
send_startup_progress_notif(
741748
sender,
@@ -778,7 +785,7 @@ struct PoolDispatcher<'a> {
778785
req: Option<Request>,
779786
pool: &'a ThreadPool,
780787
global_state: &'a mut GlobalState,
781-
incoming_requests: &'a mut req_queue::Incoming,
788+
incoming_requests: &'a mut Incoming,
782789
msg_sender: &'a Sender<Message>,
783790
task_sender: &'a Sender<Task>,
784791
request_received: Instant,
@@ -854,11 +861,7 @@ impl<'a> PoolDispatcher<'a> {
854861
return None;
855862
}
856863
};
857-
self.incoming_requests.register(req_queue::PendingInRequest {
858-
id: id.clone(),
859-
method: R::METHOD.to_string(),
860-
received: self.request_received,
861-
});
864+
self.incoming_requests.register(id.clone(), (R::METHOD, self.request_received));
862865
Some((id, params))
863866
}
864867

0 commit comments

Comments
 (0)