Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit ccecb29

Browse files
committed
refactor: Remove CrateGraphBuilder::iter_mut
1 parent fcd6e94 commit ccecb29

File tree

22 files changed

+75
-1297
lines changed

22 files changed

+75
-1297
lines changed

src/tools/rust-analyzer/crates/base-db/src/input.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ pub struct CrateData<Id> {
311311
pub type CrateDataBuilder = CrateData<CrateBuilderId>;
312312
pub type BuiltCrateData = CrateData<Crate>;
313313

314+
/// Crate data unrelated to analysis.
314315
#[derive(Debug, Clone, PartialEq, Eq)]
315316
pub struct ExtraCrateData {
316317
pub version: Option<String>,
@@ -601,12 +602,6 @@ impl CrateGraphBuilder {
601602
self.arena.iter().map(|(idx, _)| idx)
602603
}
603604

604-
// FIXME: used for fixing up the toolchain sysroot, should be removed and done differently
605-
#[doc(hidden)]
606-
pub fn iter_mut(&mut self) -> impl Iterator<Item = (CrateBuilderId, &mut CrateBuilder)> + '_ {
607-
self.arena.iter_mut()
608-
}
609-
610605
/// Returns an iterator over all transitive dependencies of the given crate,
611606
/// including the crate itself.
612607
pub fn transitive_deps(&self, of: CrateBuilderId) -> impl Iterator<Item = CrateBuilderId> {

src/tools/rust-analyzer/crates/cfg/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ impl fmt::Display for InactiveReason {
264264
}
265265

266266
/// A `CfgOptions` that implements `Hash`, for the sake of hashing only.
267-
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
267+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
268268
pub struct HashableCfgOptions {
269269
_enabled: Box<[CfgAtom]>,
270270
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub struct CargoWorkspace {
3535
target_directory: AbsPathBuf,
3636
manifest_path: ManifestPath,
3737
is_virtual_workspace: bool,
38+
/// Whether this workspace represents the sysroot workspace.
39+
is_sysroot: bool,
3840
/// Environment variables set in the `.cargo/config` file.
3941
config_env: Env,
4042
}
@@ -418,6 +420,7 @@ impl CargoWorkspace {
418420
mut meta: cargo_metadata::Metadata,
419421
ws_manifest_path: ManifestPath,
420422
cargo_config_env: Env,
423+
is_sysroot: bool,
421424
) -> CargoWorkspace {
422425
let mut pkg_by_id = FxHashMap::default();
423426
let mut packages = Arena::default();
@@ -539,6 +542,7 @@ impl CargoWorkspace {
539542
target_directory,
540543
manifest_path: ws_manifest_path,
541544
is_virtual_workspace,
545+
is_sysroot,
542546
config_env: cargo_config_env,
543547
}
544548
}
@@ -632,4 +636,8 @@ impl CargoWorkspace {
632636
pub fn env(&self) -> &Env {
633637
&self.config_env
634638
}
639+
640+
pub fn is_sysroot(&self) -> bool {
641+
self.is_sysroot
642+
}
635643
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ impl Sysroot {
360360
res.packages.remove(idx);
361361
});
362362

363-
let cargo_workspace = CargoWorkspace::new(res, library_manifest, Default::default());
363+
let cargo_workspace = CargoWorkspace::new(res, library_manifest, Default::default(), true);
364364
Some(RustLibSrcWorkspace::Workspace(cargo_workspace))
365365
}
366366
}

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

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
3333
let meta: Metadata = get_test_json_file(file);
3434
let manifest_path =
3535
ManifestPath::try_from(AbsPathBuf::try_from(meta.workspace_root.clone()).unwrap()).unwrap();
36-
let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default());
36+
let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default(), false);
3737
ProjectWorkspace {
3838
kind: ProjectWorkspaceKind::Cargo {
3939
cargo: cargo_workspace,
@@ -54,7 +54,7 @@ fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
5454
fn load_rust_project(file: &str) -> (CrateGraphBuilder, ProcMacroPaths) {
5555
let data = get_test_json_file(file);
5656
let project = rooted_project_json(data);
57-
let sysroot = get_fake_sysroot();
57+
let sysroot = Sysroot::empty();
5858
let project_workspace = ProjectWorkspace {
5959
kind: ProjectWorkspaceKind::Json(project),
6060
sysroot,
@@ -101,36 +101,11 @@ fn replace_root(s: &mut String, direction: bool) {
101101
}
102102
}
103103

104-
fn replace_fake_sys_root(s: &mut String) {
105-
let fake_sysroot_path = get_test_path("fake-sysroot");
106-
let fake_sysroot_path = if cfg!(windows) {
107-
let normalized_path = fake_sysroot_path.as_str().replace('\\', r#"\\"#);
108-
format!(r#"{normalized_path}\\"#)
109-
} else {
110-
format!("{}/", fake_sysroot_path.as_str())
111-
};
112-
*s = s.replace(&fake_sysroot_path, "$FAKESYSROOT$")
113-
}
114-
115104
fn get_test_path(file: &str) -> Utf8PathBuf {
116105
let base = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR"));
117106
base.join("test_data").join(file)
118107
}
119108

120-
fn get_fake_sysroot() -> Sysroot {
121-
let sysroot_path = get_test_path("fake-sysroot");
122-
// there's no `libexec/` directory with a `proc-macro-srv` binary in that
123-
// fake sysroot, so we give them both the same path:
124-
let sysroot_dir = AbsPathBuf::assert(sysroot_path);
125-
let sysroot_src_dir = sysroot_dir.clone();
126-
let mut sysroot = Sysroot::new(Some(sysroot_dir), Some(sysroot_src_dir));
127-
let loaded_sysroot = sysroot.load_workspace(&RustSourceWorkspaceConfig::default_cargo());
128-
if let Some(loaded_sysroot) = loaded_sysroot {
129-
sysroot.set_workspace(loaded_sysroot);
130-
}
131-
sysroot
132-
}
133-
134109
fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
135110
let mut root = "$ROOT$".to_owned();
136111
replace_root(&mut root, true);
@@ -159,7 +134,6 @@ fn check_crate_graph(crate_graph: CrateGraphBuilder, expect: ExpectFile) {
159134

160135
replace_root(&mut crate_graph, false);
161136
replace_cargo(&mut crate_graph);
162-
replace_fake_sys_root(&mut crate_graph);
163137
expect.assert_eq(&crate_graph);
164138
}
165139

@@ -256,7 +230,7 @@ fn smoke_test_real_sysroot_cargo() {
256230
let meta: Metadata = get_test_json_file("hello-world-metadata.json");
257231
let manifest_path =
258232
ManifestPath::try_from(AbsPathBuf::try_from(meta.workspace_root.clone()).unwrap()).unwrap();
259-
let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default());
233+
let cargo_workspace = CargoWorkspace::new(meta, manifest_path, Default::default(), false);
260234
let mut sysroot = Sysroot::discover(
261235
AbsPath::assert(Utf8Path::new(env!("CARGO_MANIFEST_DIR"))),
262236
&Default::default(),

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

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,12 @@ impl ProjectWorkspace {
305305
&|_| (),
306306
) {
307307
Ok((meta, _error)) => {
308-
let workspace =
309-
CargoWorkspace::new(meta, cargo_toml.clone(), Env::default());
308+
let workspace = CargoWorkspace::new(
309+
meta,
310+
cargo_toml.clone(),
311+
Env::default(),
312+
false,
313+
);
310314
let build_scripts = WorkspaceBuildScripts::rustc_crates(
311315
&workspace,
312316
workspace_dir,
@@ -321,8 +325,8 @@ impl ProjectWorkspace {
321325
"Failed to read Cargo metadata from rustc source at {rustc_dir}",
322326
);
323327
Err(Some(format!(
324-
"Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
325-
)))
328+
"Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
329+
)))
326330
}
327331
}
328332
})
@@ -379,7 +383,7 @@ impl ProjectWorkspace {
379383
"Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}",
380384
)
381385
})?;
382-
let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env);
386+
let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env, false);
383387
if let Some(loaded_sysroot) = loaded_sysroot {
384388
sysroot.set_workspace(loaded_sysroot);
385389
}
@@ -515,7 +519,7 @@ impl ProjectWorkspace {
515519
let cargo_config_extra_env =
516520
cargo_config_env(detached_file, &config.extra_env, &sysroot);
517521
(
518-
CargoWorkspace::new(ws, detached_file.clone(), cargo_config_extra_env),
522+
CargoWorkspace::new(ws, detached_file.clone(), cargo_config_extra_env, false),
519523
WorkspaceBuildScripts::default(),
520524
error.map(Arc::new),
521525
)
@@ -866,6 +870,7 @@ impl ProjectWorkspace {
866870
extra_env,
867871
cfg_overrides,
868872
self.set_test,
873+
false,
869874
crate_ws_data,
870875
),
871876
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
@@ -968,6 +973,7 @@ fn project_json_to_crate_graph(
968973
extra_env: &FxHashMap<String, String>,
969974
override_cfg: &CfgOverrides,
970975
set_test: bool,
976+
is_sysroot: bool,
971977
crate_ws_data: Arc<CrateWorkspaceData>,
972978
) -> (CrateGraphBuilder, ProcMacroPaths) {
973979
let mut res = (CrateGraphBuilder::default(), ProcMacroPaths::default());
@@ -1023,7 +1029,7 @@ fn project_json_to_crate_graph(
10231029
target_cfgs.iter().chain(cfg.iter()).cloned().collect();
10241030

10251031
if *is_workspace_member {
1026-
if set_test {
1032+
if set_test && !is_sysroot {
10271033
// Add test cfg for local crates
10281034
cfg_options.insert_atom(sym::test.clone());
10291035
}
@@ -1049,9 +1055,13 @@ fn project_json_to_crate_graph(
10491055
None,
10501056
env,
10511057
if let Some(name) = display_name.clone() {
1052-
CrateOrigin::Local {
1053-
repo: repository.clone(),
1054-
name: Some(name.canonical_name().to_owned()),
1058+
if is_sysroot {
1059+
CrateOrigin::Lang(LangCrateOrigin::from(name.canonical_name().as_str()))
1060+
} else {
1061+
CrateOrigin::Local {
1062+
repo: repository.clone(),
1063+
name: Some(name.canonical_name().to_owned()),
1064+
}
10551065
}
10561066
} else {
10571067
CrateOrigin::Local { repo: None, name: None }
@@ -1119,7 +1129,6 @@ fn cargo_to_crate_graph(
11191129
sysroot,
11201130
rustc_cfg.clone(),
11211131
load,
1122-
// FIXME: This looks incorrect but I don't think this causes problems.
11231132
crate_ws_data.clone(),
11241133
);
11251134

@@ -1139,7 +1148,7 @@ fn cargo_to_crate_graph(
11391148
let mut cfg_options = cfg_options.clone();
11401149

11411150
if cargo[pkg].is_local {
1142-
if set_test {
1151+
if set_test && !cargo.is_sysroot() {
11431152
// Add test cfg for local crates
11441153
cfg_options.insert_atom(sym::test.clone());
11451154
}
@@ -1152,7 +1161,9 @@ fn cargo_to_crate_graph(
11521161

11531162
let mut lib_tgt = None;
11541163
for &tgt in cargo[pkg].targets.iter() {
1155-
if !matches!(cargo[tgt].kind, TargetKind::Lib { .. }) && !cargo[pkg].is_member {
1164+
if !matches!(cargo[tgt].kind, TargetKind::Lib { .. })
1165+
&& (!cargo[pkg].is_member || cargo.is_sysroot())
1166+
{
11561167
// For non-workspace-members, Cargo does not resolve dev-dependencies, so we don't
11571168
// add any targets except the library target, since those will not work correctly if
11581169
// they use dev-dependencies.
@@ -1177,9 +1188,13 @@ fn cargo_to_crate_graph(
11771188
name,
11781189
kind,
11791190
if pkg_data.is_local {
1180-
CrateOrigin::Local {
1181-
repo: pkg_data.repository.clone(),
1182-
name: Some(Symbol::intern(&pkg_data.name)),
1191+
if cargo.is_sysroot() {
1192+
CrateOrigin::Lang(LangCrateOrigin::from(&*pkg_data.name))
1193+
} else {
1194+
CrateOrigin::Local {
1195+
repo: pkg_data.repository.clone(),
1196+
name: Some(Symbol::intern(&pkg_data.name)),
1197+
}
11831198
}
11841199
} else {
11851200
CrateOrigin::Library {
@@ -1516,10 +1531,8 @@ fn add_target_crate_root(
15161531
env,
15171532
origin,
15181533
matches!(kind, TargetKind::Lib { is_proc_macro: true }),
1519-
Some(if pkg.is_member {
1520-
cargo.workspace_root().to_path_buf()
1521-
} else {
1522-
pkg.manifest.parent().to_path_buf()
1534+
matches!(kind, TargetKind::Lib { is_proc_macro: true }).then(|| {
1535+
if pkg.is_member { cargo.workspace_root() } else { pkg.manifest.parent() }.to_path_buf()
15231536
}),
15241537
crate_ws_data,
15251538
);
@@ -1561,16 +1574,8 @@ fn extend_crate_graph_with_sysroot(
15611574
) -> (SysrootPublicDeps, Option<CrateBuilderId>) {
15621575
let mut pub_deps = vec![];
15631576
let mut libproc_macro = None;
1564-
let diff = CfgDiff::new(vec![], vec![CfgAtom::Flag(sym::test.clone())]);
1565-
for (cid, c) in sysroot_crate_graph.iter_mut() {
1566-
// uninject `test` flag so `core` keeps working.
1567-
Arc::make_mut(&mut c.cfg_options).apply_diff(diff.clone());
1568-
// patch the origin
1569-
if c.basic.origin.is_local() {
1570-
let lang_crate = LangCrateOrigin::from(
1571-
c.extra.display_name.as_ref().map_or("", |it| it.canonical_name().as_str()),
1572-
);
1573-
c.basic.origin = CrateOrigin::Lang(lang_crate);
1577+
for cid in sysroot_crate_graph.iter() {
1578+
if let CrateOrigin::Lang(lang_crate) = sysroot_crate_graph[cid].basic.origin {
15741579
match lang_crate {
15751580
LangCrateOrigin::Test
15761581
| LangCrateOrigin::Alloc
@@ -1627,7 +1632,7 @@ fn sysroot_to_crate_graph(
16271632
let _p = tracing::info_span!("sysroot_to_crate_graph").entered();
16281633
match sysroot.workspace() {
16291634
RustLibSrcWorkspace::Workspace(cargo) => {
1630-
let (cg, pm) = cargo_to_crate_graph(
1635+
let (sysroot_cg, sysroot_pm) = cargo_to_crate_graph(
16311636
load,
16321637
None,
16331638
cargo,
@@ -1639,7 +1644,7 @@ fn sysroot_to_crate_graph(
16391644
CfgAtom::Flag(sym::debug_assertions.clone()),
16401645
CfgAtom::Flag(sym::miri.clone()),
16411646
],
1642-
vec![],
1647+
vec![CfgAtom::Flag(sym::test.clone())],
16431648
),
16441649
..Default::default()
16451650
},
@@ -1648,10 +1653,10 @@ fn sysroot_to_crate_graph(
16481653
crate_ws_data,
16491654
);
16501655

1651-
extend_crate_graph_with_sysroot(crate_graph, cg, pm)
1656+
extend_crate_graph_with_sysroot(crate_graph, sysroot_cg, sysroot_pm)
16521657
}
16531658
RustLibSrcWorkspace::Json(project_json) => {
1654-
let (cg, pm) = project_json_to_crate_graph(
1659+
let (sysroot_cg, sysroot_pm) = project_json_to_crate_graph(
16551660
rustc_cfg,
16561661
load,
16571662
project_json,
@@ -1668,10 +1673,11 @@ fn sysroot_to_crate_graph(
16681673
..Default::default()
16691674
},
16701675
false,
1676+
true,
16711677
crate_ws_data,
16721678
);
16731679

1674-
extend_crate_graph_with_sysroot(crate_graph, cg, pm)
1680+
extend_crate_graph_with_sysroot(crate_graph, sysroot_cg, sysroot_pm)
16751681
}
16761682
RustLibSrcWorkspace::Stitched(stitched) => {
16771683
let cfg_options = Arc::new({

src/tools/rust-analyzer/crates/project-model/test_data/fake-sysroot/alloc/src/lib.rs

Whitespace-only changes.

src/tools/rust-analyzer/crates/project-model/test_data/fake-sysroot/core/src/lib.rs

Whitespace-only changes.

src/tools/rust-analyzer/crates/project-model/test_data/fake-sysroot/panic_abort/src/lib.rs

Whitespace-only changes.

src/tools/rust-analyzer/crates/project-model/test_data/fake-sysroot/panic_unwind/src/lib.rs

Whitespace-only changes.

0 commit comments

Comments
 (0)