@@ -69,6 +69,23 @@ pub fn load_workspace(
69
69
extra_env : & FxHashMap < String , Option < String > > ,
70
70
load_config : & LoadCargoConfig ,
71
71
) -> 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 > ) > {
72
89
let ( sender, receiver) = unbounded ( ) ;
73
90
let mut vfs = vfs:: Vfs :: default ( ) ;
74
91
let mut loader = {
@@ -139,18 +156,19 @@ pub fn load_workspace(
139
156
version : 0 ,
140
157
} ) ;
141
158
142
- let db = load_crate_graph (
159
+ load_crate_graph_into_db (
143
160
crate_graph,
144
161
proc_macros,
145
162
project_folders. source_root_config ,
146
163
& mut vfs,
147
164
& receiver,
165
+ db,
148
166
) ;
149
167
150
168
if load_config. prefill_caches {
151
169
prime_caches:: parallel_prime_caches ( & db, 1 , & |_| ( ) ) ;
152
170
}
153
- Ok ( ( db , vfs, proc_macro_server. ok ( ) ) )
171
+ Ok ( ( vfs, proc_macro_server. ok ( ) ) )
154
172
}
155
173
156
174
#[ derive( Default ) ]
@@ -417,15 +435,14 @@ pub fn load_proc_macro(
417
435
}
418
436
}
419
437
420
- fn load_crate_graph (
438
+ fn load_crate_graph_into_db (
421
439
crate_graph : CrateGraphBuilder ,
422
440
proc_macros : ProcMacrosBuilder ,
423
441
source_root_config : SourceRootConfig ,
424
442
vfs : & mut vfs:: Vfs ,
425
443
receiver : & Receiver < vfs:: loader:: Message > ,
426
- ) -> RootDatabase {
427
- let lru_cap = std:: env:: var ( "RA_LRU_CAP" ) . ok ( ) . and_then ( |it| it. parse :: < u16 > ( ) . ok ( ) ) ;
428
- let mut db = RootDatabase :: new ( lru_cap) ;
444
+ db : & mut RootDatabase ,
445
+ ) {
429
446
let mut analysis_change = ChangeWithProcMacros :: default ( ) ;
430
447
431
448
db. enable_proc_attr_macros ( ) ;
@@ -462,7 +479,6 @@ fn load_crate_graph(
462
479
analysis_change. set_proc_macros ( proc_macros) ;
463
480
464
481
db. apply_change ( analysis_change) ;
465
- db
466
482
}
467
483
468
484
fn expander_to_proc_macro (
0 commit comments