@@ -69,6 +69,23 @@ pub fn load_workspace(
6969 extra_env : & FxHashMap < String , Option < String > > ,
7070 load_config : & LoadCargoConfig ,
7171) -> anyhow:: Result < ( RootDatabase , vfs:: Vfs , Option < ProcMacroClient > ) > {
72+ let lru_cap = std:: env:: var ( "RA_LRU_CAP" ) . ok ( ) . and_then ( |it| it. parse :: < u16 > ( ) . ok ( ) ) ;
73+ let mut db = RootDatabase :: new ( lru_cap) ;
74+
75+ let ( vfs, proc_macro_server) = load_workspace_into_db ( ws, extra_env, load_config, & mut db) ?;
76+
77+ Ok ( ( db, vfs, proc_macro_server) )
78+ }
79+
80+ // This variant of `load_workspace` allows deferring the loading of rust-analyzer
81+ // into an existing database, which is useful in certain third-party scenarios,
82+ // now that `salsa` supports extending foreign databases (e.g. `RootDatabase`).
83+ pub fn load_workspace_into_db (
84+ ws : ProjectWorkspace ,
85+ extra_env : & FxHashMap < String , Option < String > > ,
86+ load_config : & LoadCargoConfig ,
87+ db : & mut RootDatabase ,
88+ ) -> anyhow:: Result < ( vfs:: Vfs , Option < ProcMacroClient > ) > {
7289 let ( sender, receiver) = unbounded ( ) ;
7390 let mut vfs = vfs:: Vfs :: default ( ) ;
7491 let mut loader = {
@@ -145,18 +162,20 @@ pub fn load_workspace(
145162 version : 0 ,
146163 } ) ;
147164
148- let db = load_crate_graph (
165+ load_crate_graph_into_db (
149166 crate_graph,
150167 proc_macros,
151168 project_folders. source_root_config ,
152169 & mut vfs,
153170 & receiver,
171+ db,
154172 ) ;
155173
156174 if load_config. prefill_caches {
157- prime_caches:: parallel_prime_caches ( & db, 1 , & |_| ( ) ) ;
175+ prime_caches:: parallel_prime_caches ( db, 1 , & |_| ( ) ) ;
158176 }
159- Ok ( ( db, vfs, proc_macro_server. and_then ( Result :: ok) ) )
177+
178+ Ok ( ( vfs, proc_macro_server. and_then ( Result :: ok) ) )
160179}
161180
162181#[ derive( Default ) ]
@@ -425,15 +444,14 @@ pub fn load_proc_macro(
425444 }
426445}
427446
428- fn load_crate_graph (
447+ fn load_crate_graph_into_db (
429448 crate_graph : CrateGraphBuilder ,
430449 proc_macros : ProcMacrosBuilder ,
431450 source_root_config : SourceRootConfig ,
432451 vfs : & mut vfs:: Vfs ,
433452 receiver : & Receiver < vfs:: loader:: Message > ,
434- ) -> RootDatabase {
435- let lru_cap = std:: env:: var ( "RA_LRU_CAP" ) . ok ( ) . and_then ( |it| it. parse :: < u16 > ( ) . ok ( ) ) ;
436- let mut db = RootDatabase :: new ( lru_cap) ;
453+ db : & mut RootDatabase ,
454+ ) {
437455 let mut analysis_change = ChangeWithProcMacros :: default ( ) ;
438456
439457 db. enable_proc_attr_macros ( ) ;
@@ -470,7 +488,6 @@ fn load_crate_graph(
470488 analysis_change. set_proc_macros ( proc_macros) ;
471489
472490 db. apply_change ( analysis_change) ;
473- db
474491}
475492
476493fn expander_to_proc_macro (
0 commit comments