Skip to content

Commit f26f1dd

Browse files
committed
Spawn toolchain querying processes in parallel
1 parent da4c099 commit f26f1dd

File tree

6 files changed

+228
-112
lines changed

6 files changed

+228
-112
lines changed

src/tools/rust-analyzer/crates/project-model/src/sysroot.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ pub struct Sysroot {
3434
}
3535

3636
#[derive(Debug, Clone, Eq, PartialEq)]
37-
pub(crate) enum SysrootWorkspace {
37+
pub enum SysrootWorkspace {
3838
Workspace(CargoWorkspace),
3939
Stitched(Stitched),
4040
Empty,
4141
}
4242

4343
#[derive(Debug, Clone, Eq, PartialEq)]
44-
pub(crate) struct Stitched {
44+
pub struct Stitched {
4545
crates: Arena<SysrootCrateData>,
4646
}
4747

@@ -227,18 +227,21 @@ impl Sysroot {
227227
}
228228
}
229229

230-
pub fn load_workspace(&mut self, sysroot_source_config: &SysrootSourceWorkspaceConfig) {
230+
pub fn load_workspace(
231+
&self,
232+
sysroot_source_config: &SysrootSourceWorkspaceConfig,
233+
) -> Option<SysrootWorkspace> {
231234
assert!(matches!(self.workspace, SysrootWorkspace::Empty), "workspace already loaded");
232-
let Self { root: _, src_root: Some(src_root), workspace, error: _ } = self else { return };
235+
let Self { root: _, src_root: Some(src_root), workspace: _, error: _ } = self else {
236+
return None;
237+
};
233238
if let SysrootSourceWorkspaceConfig::CargoMetadata(cargo_config) = sysroot_source_config {
234239
let library_manifest = ManifestPath::try_from(src_root.join("Cargo.toml")).unwrap();
235240
if fs::metadata(&library_manifest).is_ok() {
236241
if let Some(loaded) =
237242
Self::load_library_via_cargo(library_manifest, src_root, cargo_config)
238243
{
239-
*workspace = loaded;
240-
self.load_core_check();
241-
return;
244+
return Some(loaded);
242245
}
243246
}
244247
}
@@ -286,11 +289,11 @@ impl Sysroot {
286289
}
287290
}
288291
}
289-
*workspace = SysrootWorkspace::Stitched(stitched);
290-
self.load_core_check();
292+
Some(SysrootWorkspace::Stitched(stitched))
291293
}
292294

293-
fn load_core_check(&mut self) {
295+
pub fn set_workspace(&mut self, workspace: SysrootWorkspace) {
296+
self.workspace = workspace;
294297
if self.error.is_none() {
295298
if let Some(src_root) = &self.src_root {
296299
let has_core = match &self.workspace {

src/tools/rust-analyzer/crates/project-model/src/tests.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ fn get_fake_sysroot() -> Sysroot {
125125
let sysroot_dir = AbsPathBuf::assert(sysroot_path);
126126
let sysroot_src_dir = sysroot_dir.clone();
127127
let mut sysroot = Sysroot::new(Some(sysroot_dir), Some(sysroot_src_dir));
128-
sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
128+
let loaded_sysroot = sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
129+
if let Some(loaded_sysroot) = loaded_sysroot {
130+
sysroot.set_workspace(loaded_sysroot);
131+
}
129132
sysroot
130133
}
131134

@@ -271,7 +274,10 @@ fn smoke_test_real_sysroot_cargo() {
271274
AbsPath::assert(Utf8Path::new(env!("CARGO_MANIFEST_DIR"))),
272275
&Default::default(),
273276
);
274-
sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
277+
let loaded_sysroot = sysroot.load_workspace(&SysrootSourceWorkspaceConfig::default_cargo());
278+
if let Some(loaded_sysroot) = loaded_sysroot {
279+
sysroot.set_workspace(loaded_sysroot);
280+
}
275281
assert!(matches!(sysroot.workspace(), SysrootWorkspace::Workspace(_)));
276282
let project_workspace = ProjectWorkspace {
277283
kind: ProjectWorkspaceKind::Cargo {

0 commit comments

Comments
 (0)