@@ -8,7 +8,7 @@ use std::{
88 time:: { Duration , Instant } ,
99} ;
1010
11- use crossbeam_channel:: { Receiver , select} ;
11+ use crossbeam_channel:: { Receiver , never , select} ;
1212use ide_db:: base_db:: { SourceDatabase , VfsPath , salsa:: Database as _} ;
1313use lsp_server:: { Connection , Notification , Request } ;
1414use lsp_types:: { TextDocumentIdentifier , notification:: Notification as _} ;
@@ -71,6 +71,7 @@ enum Event {
7171 Flycheck ( FlycheckMessage ) ,
7272 TestResult ( CargoTestMessage ) ,
7373 DiscoverProject ( DiscoverProjectMessage ) ,
74+ SwitchWorkspaces ( FetchWorkspaceRequest ) ,
7475}
7576
7677impl fmt:: Display for Event {
@@ -83,6 +84,7 @@ impl fmt::Display for Event {
8384 Event :: QueuedTask ( _) => write ! ( f, "Event::QueuedTask" ) ,
8485 Event :: TestResult ( _) => write ! ( f, "Event::TestResult" ) ,
8586 Event :: DiscoverProject ( _) => write ! ( f, "Event::DiscoverProject" ) ,
87+ Event :: SwitchWorkspaces ( _) => write ! ( f, "Event::SwitchWorkspaces" ) ,
8688 }
8789 }
8890}
@@ -150,6 +152,7 @@ impl fmt::Debug for Event {
150152 }
151153 _ => ( ) ,
152154 }
155+
153156 match self {
154157 Event :: Lsp ( it) => fmt:: Debug :: fmt ( it, f) ,
155158 Event :: Task ( it) => fmt:: Debug :: fmt ( it, f) ,
@@ -158,6 +161,7 @@ impl fmt::Debug for Event {
158161 Event :: Flycheck ( it) => fmt:: Debug :: fmt ( it, f) ,
159162 Event :: TestResult ( it) => fmt:: Debug :: fmt ( it, f) ,
160163 Event :: DiscoverProject ( it) => fmt:: Debug :: fmt ( it, f) ,
164+ Event :: SwitchWorkspaces ( _) => Ok ( ( ) ) ,
161165 }
162166 }
163167}
@@ -251,7 +255,7 @@ impl GlobalState {
251255 }
252256
253257 fn next_event (
254- & self ,
258+ & mut self ,
255259 inbox : & Receiver < lsp_server:: Message > ,
256260 ) -> Result < Option < Event > , crossbeam_channel:: RecvError > {
257261 // Make sure we reply to formatting requests ASAP so the editor doesn't block
@@ -283,6 +287,10 @@ impl GlobalState {
283287
284288 recv( self . discover_receiver) -> task =>
285289 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+ } ,
286294 }
287295 . map ( Some )
288296 }
@@ -412,6 +420,9 @@ impl GlobalState {
412420 self . handle_discover_msg ( message) ;
413421 }
414422 }
423+ Event :: SwitchWorkspaces ( req) => {
424+ self . fetch_workspaces_queue . request_op ( "vfs change" . to_owned ( ) , req)
425+ }
415426 }
416427 let event_handling_duration = loop_start. elapsed ( ) ;
417428 let ( state_changed, memdocs_added_or_removed) = if self . vfs_done {
0 commit comments