Skip to content

Commit 13bbed7

Browse files
bors[bot]matklad
andauthored
Merge #9963
9963: fix: resolve core::arch module r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 3004f2e + 4924c24 commit 13bbed7

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

crates/project_model/src/sysroot.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ use paths::{AbsPath, AbsPathBuf};
1212

1313
use crate::{utf8_stdout, ManifestPath};
1414

15-
#[derive(Default, Debug, Clone, Eq, PartialEq)]
15+
#[derive(Debug, Clone, Eq, PartialEq)]
1616
pub struct Sysroot {
17+
root: AbsPathBuf,
1718
crates: Arena<SysrootCrateData>,
1819
}
1920

@@ -34,6 +35,10 @@ impl ops::Index<SysrootCrate> for Sysroot {
3435
}
3536

3637
impl Sysroot {
38+
pub fn root(&self) -> &AbsPath {
39+
&self.root
40+
}
41+
3742
pub fn public_deps(&self) -> impl Iterator<Item = (&'static str, SysrootCrate)> + '_ {
3843
// core is added as a dependency before std in order to
3944
// mimic rustcs dependency order
@@ -52,7 +57,7 @@ impl Sysroot {
5257
log::debug!("Discovering sysroot for {}", dir.display());
5358
let sysroot_dir = discover_sysroot_dir(dir)?;
5459
let sysroot_src_dir = discover_sysroot_src_dir(&sysroot_dir, dir)?;
55-
let res = Sysroot::load(&sysroot_src_dir)?;
60+
let res = Sysroot::load(sysroot_src_dir)?;
5661
Ok(res)
5762
}
5863

@@ -62,14 +67,14 @@ impl Sysroot {
6267
discover_sysroot_dir(current_dir).ok().and_then(|sysroot_dir| get_rustc_src(&sysroot_dir))
6368
}
6469

65-
pub fn load(sysroot_src_dir: &AbsPath) -> Result<Sysroot> {
66-
let mut sysroot = Sysroot { crates: Arena::default() };
70+
pub fn load(sysroot_src_dir: AbsPathBuf) -> Result<Sysroot> {
71+
let mut sysroot = Sysroot { root: sysroot_src_dir, crates: Arena::default() };
6772

6873
for path in SYSROOT_CRATES.trim().lines() {
6974
let name = path.split('/').last().unwrap();
7075
let root = [format!("{}/src/lib.rs", path), format!("lib{}/lib.rs", path)]
7176
.iter()
72-
.map(|it| sysroot_src_dir.join(it))
77+
.map(|it| sysroot.root.join(it))
7378
.filter_map(|it| ManifestPath::try_from(it).ok())
7479
.find(|it| fs::metadata(it).is_ok());
7580

@@ -110,7 +115,7 @@ impl Sysroot {
110115
};
111116
anyhow::bail!(
112117
"could not find libcore in sysroot path `{}`{}",
113-
sysroot_src_dir.as_ref().display(),
118+
sysroot.root.as_path().display(),
114119
var_note,
115120
);
116121
}

crates/project_model/src/tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55

66
use base_db::{CrateGraph, FileId};
77
use expect_test::{expect, Expect};
8-
use paths::AbsPath;
8+
use paths::{AbsPath, AbsPathBuf};
99
use serde::de::DeserializeOwned;
1010

1111
use crate::{
@@ -19,7 +19,7 @@ fn load_cargo(file: &str) -> CrateGraph {
1919
let project_workspace = ProjectWorkspace::Cargo {
2020
cargo: cargo_workspace,
2121
build_scripts: WorkspaceBuildScripts::default(),
22-
sysroot: Sysroot::default(),
22+
sysroot: None,
2323
rustc: None,
2424
rustc_cfg: Vec::new(),
2525
cfg_overrides: CfgOverrides::default(),
@@ -71,8 +71,8 @@ fn get_test_path(file: &str) -> PathBuf {
7171

7272
fn get_fake_sysroot() -> Sysroot {
7373
let sysroot_path = get_test_path("fake-sysroot");
74-
let sysroot_src_dir = AbsPath::assert(&sysroot_path);
75-
Sysroot::load(&sysroot_src_dir).unwrap()
74+
let sysroot_src_dir = AbsPathBuf::assert(sysroot_path);
75+
Sysroot::load(sysroot_src_dir).unwrap()
7676
}
7777

7878
fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {

crates/project_model/src/workspace.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub enum ProjectWorkspace {
4141
Cargo {
4242
cargo: CargoWorkspace,
4343
build_scripts: WorkspaceBuildScripts,
44-
sysroot: Sysroot,
44+
sysroot: Option<Sysroot>,
4545
rustc: Option<CargoWorkspace>,
4646
/// Holds cfg flags for the current target. We get those by running
4747
/// `rustc --print cfg`.
@@ -82,7 +82,7 @@ impl fmt::Debug for ProjectWorkspace {
8282
.debug_struct("Cargo")
8383
.field("root", &cargo.workspace_root().file_name())
8484
.field("n_packages", &cargo.packages().len())
85-
.field("n_sysroot_crates", &sysroot.crates().len())
85+
.field("sysroot", &sysroot.is_some())
8686
.field(
8787
"n_rustc_compiler_crates",
8888
&rustc.as_ref().map_or(0, |rc| rc.packages().len()),
@@ -145,14 +145,14 @@ impl ProjectWorkspace {
145145
let cargo = CargoWorkspace::new(meta);
146146

147147
let sysroot = if config.no_sysroot {
148-
Sysroot::default()
148+
None
149149
} else {
150-
Sysroot::discover(cargo_toml.parent()).with_context(|| {
150+
Some(Sysroot::discover(cargo_toml.parent()).with_context(|| {
151151
format!(
152152
"Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?",
153153
cargo_toml.display()
154154
)
155-
})?
155+
})?)
156156
};
157157

158158
let rustc_dir = match &config.rustc_source {
@@ -194,7 +194,7 @@ impl ProjectWorkspace {
194194
target: Option<&str>,
195195
) -> Result<ProjectWorkspace> {
196196
let sysroot = match &project_json.sysroot_src {
197-
Some(path) => Some(Sysroot::load(path)?),
197+
Some(path) => Some(Sysroot::load(path.clone())?),
198198
None => None,
199199
};
200200
let rustc_cfg = rustc_cfg::get(None, target);
@@ -304,9 +304,9 @@ impl ProjectWorkspace {
304304
}
305305
PackageRoot { is_member, include, exclude }
306306
})
307-
.chain(sysroot.crates().map(|krate| PackageRoot {
307+
.chain(sysroot.into_iter().map(|sysroot| PackageRoot {
308308
is_member: false,
309-
include: vec![sysroot[krate].root.parent().to_path_buf()],
309+
include: vec![sysroot.root().to_path_buf()],
310310
exclude: Vec::new(),
311311
}))
312312
.chain(rustc.into_iter().flat_map(|rustc| {
@@ -338,8 +338,9 @@ impl ProjectWorkspace {
338338
match self {
339339
ProjectWorkspace::Json { project, .. } => project.n_crates(),
340340
ProjectWorkspace::Cargo { cargo, sysroot, rustc, .. } => {
341-
let rustc_package_len = rustc.as_ref().map_or(0, |rc| rc.packages().len());
342-
cargo.packages().len() + sysroot.crates().len() + rustc_package_len
341+
let rustc_package_len = rustc.as_ref().map_or(0, |it| it.packages().len());
342+
let sysroot_package_len = sysroot.as_ref().map_or(0, |it| it.crates().len());
343+
cargo.packages().len() + sysroot_package_len + rustc_package_len
343344
}
344345
ProjectWorkspace::DetachedFiles { sysroot, files, .. } => {
345346
sysroot.crates().len() + files.len()
@@ -380,7 +381,7 @@ impl ProjectWorkspace {
380381
load,
381382
cargo,
382383
build_scripts,
383-
sysroot,
384+
sysroot.as_ref(),
384385
rustc,
385386
),
386387
ProjectWorkspace::DetachedFiles { files, sysroot, rustc_cfg } => {
@@ -479,13 +480,15 @@ fn cargo_to_crate_graph(
479480
load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
480481
cargo: &CargoWorkspace,
481482
build_scripts: &WorkspaceBuildScripts,
482-
sysroot: &Sysroot,
483+
sysroot: Option<&Sysroot>,
483484
rustc: &Option<CargoWorkspace>,
484485
) -> CrateGraph {
485486
let _p = profile::span("cargo_to_crate_graph");
486487
let mut crate_graph = CrateGraph::default();
487-
let (public_deps, libproc_macro) =
488-
sysroot_to_crate_graph(&mut crate_graph, sysroot, rustc_cfg.clone(), load);
488+
let (public_deps, libproc_macro) = match sysroot {
489+
Some(sysroot) => sysroot_to_crate_graph(&mut crate_graph, sysroot, rustc_cfg.clone(), load),
490+
None => (Vec::new(), None),
491+
};
489492

490493
let mut cfg_options = CfgOptions::default();
491494
cfg_options.extend(rustc_cfg);

0 commit comments

Comments
 (0)