@@ -8,7 +8,7 @@ use std::{
8
8
time:: { Duration , Instant } ,
9
9
} ;
10
10
11
- use crossbeam_channel:: { Receiver , select} ;
11
+ use crossbeam_channel:: { Receiver , never , select} ;
12
12
use ide_db:: base_db:: { SourceDatabase , VfsPath , salsa:: Database as _} ;
13
13
use lsp_server:: { Connection , Notification , Request } ;
14
14
use lsp_types:: { TextDocumentIdentifier , notification:: Notification as _} ;
@@ -71,6 +71,7 @@ enum Event {
71
71
Flycheck ( FlycheckMessage ) ,
72
72
TestResult ( CargoTestMessage ) ,
73
73
DiscoverProject ( DiscoverProjectMessage ) ,
74
+ SwitchWorkspaces ( FetchWorkspaceRequest ) ,
74
75
}
75
76
76
77
impl fmt:: Display for Event {
@@ -83,6 +84,7 @@ impl fmt::Display for Event {
83
84
Event :: QueuedTask ( _) => write ! ( f, "Event::QueuedTask" ) ,
84
85
Event :: TestResult ( _) => write ! ( f, "Event::TestResult" ) ,
85
86
Event :: DiscoverProject ( _) => write ! ( f, "Event::DiscoverProject" ) ,
87
+ Event :: SwitchWorkspaces ( _) => write ! ( f, "Event::SwitchWorkspaces" ) ,
86
88
}
87
89
}
88
90
}
@@ -150,6 +152,7 @@ impl fmt::Debug for Event {
150
152
}
151
153
_ => ( ) ,
152
154
}
155
+
153
156
match self {
154
157
Event :: Lsp ( it) => fmt:: Debug :: fmt ( it, f) ,
155
158
Event :: Task ( it) => fmt:: Debug :: fmt ( it, f) ,
@@ -158,6 +161,7 @@ impl fmt::Debug for Event {
158
161
Event :: Flycheck ( it) => fmt:: Debug :: fmt ( it, f) ,
159
162
Event :: TestResult ( it) => fmt:: Debug :: fmt ( it, f) ,
160
163
Event :: DiscoverProject ( it) => fmt:: Debug :: fmt ( it, f) ,
164
+ Event :: SwitchWorkspaces ( _) => Ok ( ( ) ) ,
161
165
}
162
166
}
163
167
}
@@ -251,7 +255,7 @@ impl GlobalState {
251
255
}
252
256
253
257
fn next_event (
254
- & self ,
258
+ & mut self ,
255
259
inbox : & Receiver < lsp_server:: Message > ,
256
260
) -> Result < Option < Event > , crossbeam_channel:: RecvError > {
257
261
// Make sure we reply to formatting requests ASAP so the editor doesn't block
@@ -283,6 +287,10 @@ impl GlobalState {
283
287
284
288
recv( self . discover_receiver) -> task =>
285
289
task. map( Event :: DiscoverProject ) ,
290
+
291
+ recv( self . fetch_ws_receiver. as_ref( ) . map_or( & never( ) , |( chan, _) | chan) ) -> _instant => {
292
+ Ok ( Event :: SwitchWorkspaces ( self . fetch_ws_receiver. take( ) . unwrap( ) . 1 ) )
293
+ } ,
286
294
}
287
295
. map ( Some )
288
296
}
@@ -412,6 +420,9 @@ impl GlobalState {
412
420
self . handle_discover_msg ( message) ;
413
421
}
414
422
}
423
+ Event :: SwitchWorkspaces ( req) => {
424
+ self . fetch_workspaces_queue . request_op ( "vfs change" . to_owned ( ) , req)
425
+ }
415
426
}
416
427
let event_handling_duration = loop_start. elapsed ( ) ;
417
428
let ( state_changed, memdocs_added_or_removed) = if self . vfs_done {
0 commit comments