Skip to content

Commit 437baf6

Browse files
committed
Break out sender/req_queue into a Conn struct, make ReqQueue : Clone
1 parent f9df9bf commit 437baf6

File tree

5 files changed

+61
-34
lines changed

5 files changed

+61
-34
lines changed

Cargo.lock

+1-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ debug = 0
3737
# chalk-derive = { path = "../chalk/chalk-derive" }
3838
# line-index = { path = "lib/line-index" }
3939
# la-arena = { path = "lib/la-arena" }
40-
# lsp-server = { path = "lib/lsp-server" }
40+
lsp-server = { path = "lib/lsp-server" }
4141

4242

4343
# ungrammar = { path = "../ungrammar" }

crates/rust-analyzer/src/global_state.rs

+54-17
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ type ReqQueue = lsp_server::ReqQueue<(String, Instant), ReqHandler>;
5353
/// Note that this struct has more than one impl in various modules!
5454
#[doc(alias = "GlobalMess")]
5555
pub(crate) struct GlobalState {
56-
sender: Sender<lsp_server::Message>,
57-
req_queue: ReqQueue,
56+
pub(crate) conn: Conn,
5857

5958
pub(crate) task_pool: Handle<TaskPool<Task>, Receiver<Task>>,
6059
pub(crate) fmt_pool: Handle<TaskPool<Task>, Receiver<Task>>,
@@ -125,6 +124,11 @@ pub(crate) struct GlobalState {
125124
OpQueue<(), (Arc<Vec<ProjectWorkspace>>, Vec<anyhow::Result<WorkspaceBuildScripts>>)>,
126125
pub(crate) fetch_proc_macros_queue: OpQueue<Vec<ProcMacroPaths>, bool>,
127126
pub(crate) prime_caches_queue: OpQueue,
127+
128+
#[derive(Clone)]
129+
pub(crate) struct Conn {
130+
pub(crate) sender: Sender<lsp_server::Message>,
131+
req_queue: Arc<ReqQueue>,
128132
}
129133

130134
/// An immutable snapshot of the world's state at a point in time.
@@ -145,6 +149,8 @@ impl std::panic::UnwindSafe for GlobalStateSnapshot {}
145149

146150
impl GlobalState {
147151
pub(crate) fn new(sender: Sender<lsp_server::Message>, config: Config) -> GlobalState {
152+
let conn = Conn { sender, req_queue: Arc::new(ReqQueue::default()) };
153+
148154
let loader = {
149155
let (sender, receiver) = unbounded::<vfs::loader::Message>();
150156
let handle: vfs_notify::NotifyHandle =
@@ -170,8 +176,7 @@ impl GlobalState {
170176
}
171177
let (flycheck_sender, flycheck_receiver) = unbounded();
172178
let mut this = GlobalState {
173-
sender,
174-
req_queue: ReqQueue::default(),
179+
conn: server,
175180
task_pool,
176181
fmt_pool,
177182
loader,
@@ -376,13 +381,13 @@ impl GlobalState {
376381
params: R::Params,
377382
handler: ReqHandler,
378383
) {
379-
let request = self.req_queue.outgoing.register(R::METHOD.to_string(), params, handler);
380-
self.send(request.into());
384+
self.conn.send_request::<R>(params, handler);
381385
}
382386

383387
pub(crate) fn complete_request(&mut self, response: lsp_server::Response) {
384-
let handler = self
385-
.req_queue
388+
let req_queue = Arc::make_mut(&mut self.conn.req_queue);
389+
390+
let handler = req_queue
386391
.outgoing
387392
.complete(response.id.clone())
388393
.expect("received response for unknown request");
@@ -393,22 +398,20 @@ impl GlobalState {
393398
&self,
394399
params: N::Params,
395400
) {
396-
let not = lsp_server::Notification::new(N::METHOD.to_string(), params);
397-
self.send(not.into());
401+
self.conn.send_notification::<N>(params);
398402
}
399403

400404
pub(crate) fn register_request(
401405
&mut self,
402406
request: &lsp_server::Request,
403407
request_received: Instant,
404408
) {
405-
self.req_queue
406-
.incoming
407-
.register(request.id.clone(), (request.method.clone(), request_received));
409+
self.conn.register_request(request, request_received);
408410
}
409411

410412
pub(crate) fn respond(&mut self, response: lsp_server::Response) {
411-
if let Some((method, start)) = self.req_queue.incoming.complete(response.id.clone()) {
413+
let req_queue = Arc::make_mut(&mut self.conn.req_queue);
414+
if let Some((method, start)) = req_queue.incoming.complete(response.id.clone()) {
412415
if let Some(err) = &response.error {
413416
if err.message.starts_with("server panicked") {
414417
self.poke_rust_analyzer_developer(format!("{}, check the log", err.message))
@@ -417,17 +420,51 @@ impl GlobalState {
417420

418421
let duration = start.elapsed();
419422
tracing::debug!("handled {} - ({}) in {:0.2?}", method, response.id, duration);
420-
self.send(response.into());
423+
self.conn.send(response.into());
421424
}
422425
}
423426

424427
pub(crate) fn cancel(&mut self, request_id: lsp_server::RequestId) {
425-
if let Some(response) = self.req_queue.incoming.cancel(request_id) {
428+
self.conn.cancel(request_id);
429+
}
430+
431+
pub(crate) fn is_completed(&self, request: &lsp_server::Request) -> bool {
432+
self.conn.is_completed(&request)
433+
}
434+
}
435+
436+
impl Conn {
437+
pub(crate) fn send_request<R: lsp_types::request::Request>(
438+
&mut self,
439+
params: R::Params,
440+
handler: ReqHandler,
441+
) {
442+
let req_queue = Arc::make_mut(&mut self.req_queue);
443+
let request = req_queue.outgoing.register(R::METHOD.to_string(), params, handler);
444+
self.send(request.into());
445+
}
446+
447+
pub(crate) fn send_notification<N: lsp_types::notification::Notification>(
448+
&self,
449+
params: N::Params,
450+
) {
451+
let not = lsp_server::Notification::new(N::METHOD.to_string(), params);
452+
self.send(not.into());
453+
}
454+
455+
fn register_request(&mut self, request: &lsp_server::Request, request_received: Instant) {
456+
let req_queue = Arc::make_mut(&mut self.req_queue);
457+
req_queue.incoming.register(request.id.clone(), (request.method.clone(), request_received));
458+
}
459+
460+
fn cancel(&mut self, request_id: lsp_server::RequestId) {
461+
let req_queue = Arc::make_mut(&mut self.req_queue);
462+
if let Some(response) = req_queue.incoming.cancel(request_id) {
426463
self.send(response.into());
427464
}
428465
}
429466

430-
pub(crate) fn is_completed(&self, request: &lsp_server::Request) -> bool {
467+
fn is_completed(&self, request: &lsp_server::Request) -> bool {
431468
self.req_queue.incoming.is_completed(&request.id)
432469
}
433470

crates/rust-analyzer/tests/slow-tests/support.rs

+2
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ impl Server {
212212
.extract::<Value>(N::METHOD)
213213
.expect("was not able to extract notification");
214214

215+
tracing::debug!(?actual, "got notification");
215216
if let Some((expected_part, actual_part)) = find_mismatch(&expected, &actual) {
216217
panic!(
217218
"JSON mismatch\nExpected:\n{}\nWas:\n{}\nExpected part:\n{}\nActual part:\n{}\n",
@@ -221,6 +222,7 @@ impl Server {
221222
to_string_pretty(actual_part).unwrap(),
222223
);
223224
} else {
225+
tracing::debug!("sucessfully matched notification");
224226
return;
225227
}
226228
} else {

lib/lsp-server/src/req_queue.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::Serialize;
55
use crate::{ErrorCode, Request, RequestId, Response, ResponseError};
66

77
/// Manages the set of pending requests, both incoming and outgoing.
8-
#[derive(Debug)]
8+
#[derive(Debug, Clone)]
99
pub struct ReqQueue<I, O> {
1010
pub incoming: Incoming<I>,
1111
pub outgoing: Outgoing<O>,
@@ -20,12 +20,12 @@ impl<I, O> Default for ReqQueue<I, O> {
2020
}
2121
}
2222

23-
#[derive(Debug)]
23+
#[derive(Debug, Clone)]
2424
pub struct Incoming<I> {
2525
pending: HashMap<RequestId, I>,
2626
}
2727

28-
#[derive(Debug)]
28+
#[derive(Debug, Clone)]
2929
pub struct Outgoing<O> {
3030
next_id: i32,
3131
pending: HashMap<RequestId, O>,

0 commit comments

Comments
 (0)