Skip to content

Commit 040049b

Browse files
Merge pull request #20144 from regexident/load-workspace-into-db
Add `fn load_workspace_into_db` variant for `ra_ap_load_cargo`'s `fn load_workspace`
2 parents 87940a9 + a0e857f commit 040049b

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

crates/load-cargo/src/lib.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

476493
fn expander_to_proc_macro(

0 commit comments

Comments
 (0)