@@ -32,7 +32,7 @@ use crate::{
32
32
mem_docs:: MemDocs ,
33
33
op_queue:: OpQueue ,
34
34
reload,
35
- task_pool:: TaskPool ,
35
+ task_pool:: { TaskPool , TaskQueue } ,
36
36
} ;
37
37
38
38
// Enforces drop order
@@ -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 > > ,
@@ -83,7 +82,7 @@ pub(crate) struct GlobalState {
83
82
pub ( crate ) last_flycheck_error : Option < String > ,
84
83
85
84
// VFS
86
- pub ( crate ) loader : Handle < Box < dyn vfs:: loader:: Handle > , Receiver < vfs:: loader:: Message > > ,
85
+ pub ( crate ) loader : Handle < Box < dyn vfs:: loader:: Handle + Send > , Receiver < vfs:: loader:: Message > > ,
87
86
pub ( crate ) vfs : Arc < RwLock < ( vfs:: Vfs , IntMap < FileId , LineEndings > ) > > ,
88
87
pub ( crate ) vfs_config_version : u32 ,
89
88
pub ( crate ) vfs_progress_config_version : u32 ,
@@ -125,6 +124,16 @@ 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
+ /// a deferred task queue. this should only be used if the enqueued Task
129
+ /// can only run *after* [`GlobalState::process_changes`] has been called.
130
+ pub ( crate ) task_queue : TaskQueue ,
131
+ }
132
+
133
+ #[ derive( Clone ) ]
134
+ pub ( crate ) struct Conn {
135
+ pub ( crate ) sender : Sender < lsp_server:: Message > ,
136
+ req_queue : Arc < ReqQueue > ,
128
137
}
129
138
130
139
/// An immutable snapshot of the world's state at a point in time.
@@ -145,11 +154,13 @@ impl std::panic::UnwindSafe for GlobalStateSnapshot {}
145
154
146
155
impl GlobalState {
147
156
pub ( crate ) fn new ( sender : Sender < lsp_server:: Message > , config : Config ) -> GlobalState {
157
+ let conn = Conn { sender, req_queue : Arc :: new ( ReqQueue :: default ( ) ) } ;
158
+
148
159
let loader = {
149
160
let ( sender, receiver) = unbounded :: < vfs:: loader:: Message > ( ) ;
150
161
let handle: vfs_notify:: NotifyHandle =
151
162
vfs:: loader:: Handle :: spawn ( Box :: new ( move |msg| sender. send ( msg) . unwrap ( ) ) ) ;
152
- let handle = Box :: new ( handle) as Box < dyn vfs:: loader:: Handle > ;
163
+ let handle = Box :: new ( handle) as Box < dyn vfs:: loader:: Handle + Send > ;
153
164
Handle { handle, receiver }
154
165
} ;
155
166
@@ -164,14 +175,18 @@ impl GlobalState {
164
175
Handle { handle, receiver }
165
176
} ;
166
177
178
+ let task_queue = {
179
+ let ( sender, receiver) = unbounded ( ) ;
180
+ TaskQueue { sender, receiver }
181
+ } ;
182
+
167
183
let mut analysis_host = AnalysisHost :: new ( config. lru_parse_query_capacity ( ) ) ;
168
184
if let Some ( capacities) = config. lru_query_capacities ( ) {
169
185
analysis_host. update_lru_capacities ( capacities) ;
170
186
}
171
187
let ( flycheck_sender, flycheck_receiver) = unbounded ( ) ;
172
188
let mut this = GlobalState {
173
- sender,
174
- req_queue : ReqQueue :: default ( ) ,
189
+ conn,
175
190
task_pool,
176
191
fmt_pool,
177
192
loader,
@@ -209,6 +224,8 @@ impl GlobalState {
209
224
fetch_proc_macros_queue : OpQueue :: default ( ) ,
210
225
211
226
prime_caches_queue : OpQueue :: default ( ) ,
227
+
228
+ task_queue,
212
229
} ;
213
230
// Apply any required database inputs from the config.
214
231
this. update_configuration ( config) ;
@@ -376,13 +393,13 @@ impl GlobalState {
376
393
params : R :: Params ,
377
394
handler : ReqHandler ,
378
395
) {
379
- let request = self . req_queue . outgoing . register ( R :: METHOD . to_string ( ) , params, handler) ;
380
- self . send ( request. into ( ) ) ;
396
+ self . conn . send_request :: < R > ( params, handler) ;
381
397
}
382
398
383
399
pub ( crate ) fn complete_request ( & mut self , response : lsp_server:: Response ) {
384
- let handler = self
385
- . req_queue
400
+ let req_queue = Arc :: make_mut ( & mut self . conn . req_queue ) ;
401
+
402
+ let handler = req_queue
386
403
. outgoing
387
404
. complete ( response. id . clone ( ) )
388
405
. expect ( "received response for unknown request" ) ;
@@ -393,22 +410,20 @@ impl GlobalState {
393
410
& self ,
394
411
params : N :: Params ,
395
412
) {
396
- let not = lsp_server:: Notification :: new ( N :: METHOD . to_string ( ) , params) ;
397
- self . send ( not. into ( ) ) ;
413
+ self . conn . send_notification :: < N > ( params) ;
398
414
}
399
415
400
416
pub ( crate ) fn register_request (
401
417
& mut self ,
402
418
request : & lsp_server:: Request ,
403
419
request_received : Instant ,
404
420
) {
405
- self . req_queue
406
- . incoming
407
- . register ( request. id . clone ( ) , ( request. method . clone ( ) , request_received) ) ;
421
+ self . conn . register_request ( request, request_received) ;
408
422
}
409
423
410
424
pub ( crate ) fn respond ( & mut self , response : lsp_server:: Response ) {
411
- if let Some ( ( method, start) ) = self . req_queue . incoming . complete ( response. id . clone ( ) ) {
425
+ let req_queue = Arc :: make_mut ( & mut self . conn . req_queue ) ;
426
+ if let Some ( ( method, start) ) = req_queue. incoming . complete ( response. id . clone ( ) ) {
412
427
if let Some ( err) = & response. error {
413
428
if err. message . starts_with ( "server panicked" ) {
414
429
self . poke_rust_analyzer_developer ( format ! ( "{}, check the log" , err. message) )
@@ -417,17 +432,51 @@ impl GlobalState {
417
432
418
433
let duration = start. elapsed ( ) ;
419
434
tracing:: debug!( "handled {} - ({}) in {:0.2?}" , method, response. id, duration) ;
420
- self . send ( response. into ( ) ) ;
435
+ self . conn . send ( response. into ( ) ) ;
421
436
}
422
437
}
423
438
424
439
pub ( crate ) fn cancel ( & mut self , request_id : lsp_server:: RequestId ) {
425
- if let Some ( response) = self . req_queue . incoming . cancel ( request_id) {
440
+ self . conn . cancel ( request_id) ;
441
+ }
442
+
443
+ pub ( crate ) fn is_completed ( & self , request : & lsp_server:: Request ) -> bool {
444
+ self . conn . is_completed ( & request)
445
+ }
446
+ }
447
+
448
+ impl Conn {
449
+ pub ( crate ) fn send_request < R : lsp_types:: request:: Request > (
450
+ & mut self ,
451
+ params : R :: Params ,
452
+ handler : ReqHandler ,
453
+ ) {
454
+ let req_queue = Arc :: make_mut ( & mut self . req_queue ) ;
455
+ let request = req_queue. outgoing . register ( R :: METHOD . to_string ( ) , params, handler) ;
456
+ self . send ( request. into ( ) ) ;
457
+ }
458
+
459
+ pub ( crate ) fn send_notification < N : lsp_types:: notification:: Notification > (
460
+ & self ,
461
+ params : N :: Params ,
462
+ ) {
463
+ let not = lsp_server:: Notification :: new ( N :: METHOD . to_string ( ) , params) ;
464
+ self . send ( not. into ( ) ) ;
465
+ }
466
+
467
+ fn register_request ( & mut self , request : & lsp_server:: Request , request_received : Instant ) {
468
+ let req_queue = Arc :: make_mut ( & mut self . req_queue ) ;
469
+ req_queue. incoming . register ( request. id . clone ( ) , ( request. method . clone ( ) , request_received) ) ;
470
+ }
471
+
472
+ fn cancel ( & mut self , request_id : lsp_server:: RequestId ) {
473
+ let req_queue = Arc :: make_mut ( & mut self . req_queue ) ;
474
+ if let Some ( response) = req_queue. incoming . cancel ( request_id) {
426
475
self . send ( response. into ( ) ) ;
427
476
}
428
477
}
429
478
430
- pub ( crate ) fn is_completed ( & self , request : & lsp_server:: Request ) -> bool {
479
+ fn is_completed ( & self , request : & lsp_server:: Request ) -> bool {
431
480
self . req_queue . incoming . is_completed ( & request. id )
432
481
}
433
482
0 commit comments