@@ -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+ FetchWorkspaces ( 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 :: FetchWorkspaces ( _) => 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 :: FetchWorkspaces ( it) => fmt:: Debug :: fmt ( it, f) ,
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 :: FetchWorkspaces ( 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 :: FetchWorkspaces ( req) => {
424+ self . fetch_workspaces_queue . request_op ( "project structure 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 {
@@ -830,6 +841,7 @@ impl GlobalState {
830841 match message {
831842 vfs:: loader:: Message :: Changed { files } | vfs:: loader:: Message :: Loaded { files } => {
832843 let _p = tracing:: info_span!( "GlobalState::handle_vfs_msg{changed/load}" ) . entered ( ) ;
844+ self . debounce_workspace_fetch ( ) ;
833845 let vfs = & mut self . vfs . write ( ) . 0 ;
834846 for ( path, contents) in files {
835847 let path = VfsPath :: from ( path) ;
0 commit comments