@@ -53,8 +53,7 @@ type ReqQueue = lsp_server::ReqQueue<(String, Instant), ReqHandler>;
53
53
/// Note that this struct has more than one impl in various modules!
54
54
#[ doc( alias = "GlobalMess" ) ]
55
55
pub ( crate ) struct GlobalState {
56
- sender : Sender < lsp_server:: Message > ,
57
- req_queue : ReqQueue ,
56
+ pub ( crate ) conn : Conn ,
58
57
59
58
pub ( crate ) task_pool : Handle < TaskPool < Task > , Receiver < Task > > ,
60
59
pub ( crate ) fmt_pool : Handle < TaskPool < Task > , Receiver < Task > > ,
@@ -125,6 +124,11 @@ pub(crate) struct GlobalState {
125
124
OpQueue < ( ) , ( Arc < Vec < ProjectWorkspace > > , Vec < anyhow:: Result < WorkspaceBuildScripts > > ) > ,
126
125
pub ( crate ) fetch_proc_macros_queue : OpQueue < Vec < ProcMacroPaths > , bool > ,
127
126
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 > ,
128
132
}
129
133
130
134
/// An immutable snapshot of the world's state at a point in time.
@@ -145,6 +149,8 @@ impl std::panic::UnwindSafe for GlobalStateSnapshot {}
145
149
146
150
impl GlobalState {
147
151
pub ( crate ) fn new ( sender : Sender < lsp_server:: Message > , config : Config ) -> GlobalState {
152
+ let conn = Conn { sender, req_queue : Arc :: new ( ReqQueue :: default ( ) ) } ;
153
+
148
154
let loader = {
149
155
let ( sender, receiver) = unbounded :: < vfs:: loader:: Message > ( ) ;
150
156
let handle: vfs_notify:: NotifyHandle =
@@ -170,8 +176,7 @@ impl GlobalState {
170
176
}
171
177
let ( flycheck_sender, flycheck_receiver) = unbounded ( ) ;
172
178
let mut this = GlobalState {
173
- sender,
174
- req_queue : ReqQueue :: default ( ) ,
179
+ conn : server,
175
180
task_pool,
176
181
fmt_pool,
177
182
loader,
@@ -376,13 +381,13 @@ impl GlobalState {
376
381
params : R :: Params ,
377
382
handler : ReqHandler ,
378
383
) {
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) ;
381
385
}
382
386
383
387
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
386
391
. outgoing
387
392
. complete ( response. id . clone ( ) )
388
393
. expect ( "received response for unknown request" ) ;
@@ -393,22 +398,20 @@ impl GlobalState {
393
398
& self ,
394
399
params : N :: Params ,
395
400
) {
396
- let not = lsp_server:: Notification :: new ( N :: METHOD . to_string ( ) , params) ;
397
- self . send ( not. into ( ) ) ;
401
+ self . conn . send_notification :: < N > ( params) ;
398
402
}
399
403
400
404
pub ( crate ) fn register_request (
401
405
& mut self ,
402
406
request : & lsp_server:: Request ,
403
407
request_received : Instant ,
404
408
) {
405
- self . req_queue
406
- . incoming
407
- . register ( request. id . clone ( ) , ( request. method . clone ( ) , request_received) ) ;
409
+ self . conn . register_request ( request, request_received) ;
408
410
}
409
411
410
412
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 ( ) ) {
412
415
if let Some ( err) = & response. error {
413
416
if err. message . starts_with ( "server panicked" ) {
414
417
self . poke_rust_analyzer_developer ( format ! ( "{}, check the log" , err. message) )
@@ -417,17 +420,51 @@ impl GlobalState {
417
420
418
421
let duration = start. elapsed ( ) ;
419
422
tracing:: debug!( "handled {} - ({}) in {:0.2?}" , method, response. id, duration) ;
420
- self . send ( response. into ( ) ) ;
423
+ self . conn . send ( response. into ( ) ) ;
421
424
}
422
425
}
423
426
424
427
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) {
426
463
self . send ( response. into ( ) ) ;
427
464
}
428
465
}
429
466
430
- pub ( crate ) fn is_completed ( & self , request : & lsp_server:: Request ) -> bool {
467
+ fn is_completed ( & self , request : & lsp_server:: Request ) -> bool {
431
468
self . req_queue . incoming . is_completed ( & request. id )
432
469
}
433
470
0 commit comments