Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/project-model/src/workspace.rs')
-rw-r--r--crates/project-model/src/workspace.rs184
1 files changed, 119 insertions, 65 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 62c13c7d9e..114c2551e1 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -6,8 +6,9 @@ use std::{collections::VecDeque, fmt, fs, iter, ops::Deref, sync, thread};
use anyhow::Context;
use base_db::{
- CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Env,
- LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult,
+ CrateBuilderId, CrateDisplayName, CrateGraphBuilder, CrateName, CrateOrigin,
+ CrateWorkspaceData, DependencyBuilder, Env, LangCrateOrigin, ProcMacroPaths,
+ TargetLayoutLoadResult,
};
use cfg::{CfgAtom, CfgDiff, CfgOptions};
use intern::{sym, Symbol};
@@ -848,10 +849,14 @@ impl ProjectWorkspace {
&self,
load: FileLoader<'_>,
extra_env: &FxHashMap<String, String>,
- ) -> (CrateGraph, ProcMacroPaths) {
+ ) -> (CrateGraphBuilder, ProcMacroPaths) {
let _p = tracing::info_span!("ProjectWorkspace::to_crate_graph").entered();
let Self { kind, sysroot, cfg_overrides, rustc_cfg, .. } = self;
+ let crate_ws_data = Arc::new(CrateWorkspaceData {
+ toolchain: self.toolchain.clone(),
+ data_layout: self.target_layout.clone(),
+ });
let (crate_graph, proc_macros) = match kind {
ProjectWorkspaceKind::Json(project) => project_json_to_crate_graph(
rustc_cfg.clone(),
@@ -861,6 +866,7 @@ impl ProjectWorkspace {
extra_env,
cfg_overrides,
self.set_test,
+ crate_ws_data,
),
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
cargo_to_crate_graph(
@@ -872,6 +878,7 @@ impl ProjectWorkspace {
cfg_overrides,
build_scripts,
self.set_test,
+ crate_ws_data,
)
}
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => {
@@ -885,6 +892,7 @@ impl ProjectWorkspace {
cfg_overrides,
build_scripts,
self.set_test,
+ crate_ws_data,
)
} else {
detached_file_to_crate_graph(
@@ -894,6 +902,7 @@ impl ProjectWorkspace {
sysroot,
cfg_overrides,
self.set_test,
+ crate_ws_data,
)
}
}
@@ -959,15 +968,22 @@ fn project_json_to_crate_graph(
extra_env: &FxHashMap<String, String>,
override_cfg: &CfgOverrides,
set_test: bool,
-) -> (CrateGraph, ProcMacroPaths) {
- let mut res = (CrateGraph::default(), ProcMacroPaths::default());
+ crate_ws_data: Arc<CrateWorkspaceData>,
+) -> (CrateGraphBuilder, ProcMacroPaths) {
+ let mut res = (CrateGraphBuilder::default(), ProcMacroPaths::default());
let (crate_graph, proc_macros) = &mut res;
- let (public_deps, libproc_macro) =
- sysroot_to_crate_graph(crate_graph, sysroot, rustc_cfg.clone(), load);
+ let (public_deps, libproc_macro) = sysroot_to_crate_graph(
+ crate_graph,
+ sysroot,
+ rustc_cfg.clone(),
+ load,
+ // FIXME: This looks incorrect but I don't think this matters.
+ crate_ws_data.clone(),
+ );
let mut cfg_cache: FxHashMap<&str, Vec<CfgAtom>> = FxHashMap::default();
- let idx_to_crate_id: FxHashMap<CrateArrayIdx, CrateId> = project
+ let idx_to_crate_id: FxHashMap<CrateArrayIdx, _> = project
.crates()
.filter_map(|(idx, krate)| Some((idx, krate, load(&krate.root_module)?)))
.map(
@@ -1042,6 +1058,7 @@ fn project_json_to_crate_graph(
},
*is_proc_macro,
proc_macro_cwd.clone(),
+ crate_ws_data.clone(),
);
debug!(
?crate_graph_crate_id,
@@ -1092,12 +1109,19 @@ fn cargo_to_crate_graph(
override_cfg: &CfgOverrides,
build_scripts: &WorkspaceBuildScripts,
set_test: bool,
-) -> (CrateGraph, ProcMacroPaths) {
+ crate_ws_data: Arc<CrateWorkspaceData>,
+) -> (CrateGraphBuilder, ProcMacroPaths) {
let _p = tracing::info_span!("cargo_to_crate_graph").entered();
- let mut res = (CrateGraph::default(), ProcMacroPaths::default());
+ let mut res = (CrateGraphBuilder::default(), ProcMacroPaths::default());
let (crate_graph, proc_macros) = &mut res;
- let (public_deps, libproc_macro) =
- sysroot_to_crate_graph(crate_graph, sysroot, rustc_cfg.clone(), load);
+ let (public_deps, libproc_macro) = sysroot_to_crate_graph(
+ crate_graph,
+ sysroot,
+ rustc_cfg.clone(),
+ load,
+ // FIXME: This looks incorrect but I don't think this causes problems.
+ crate_ws_data.clone(),
+ );
let cfg_options = CfgOptions::from_iter(rustc_cfg);
@@ -1163,6 +1187,7 @@ fn cargo_to_crate_graph(
name: Symbol::intern(&pkg_data.name),
}
},
+ crate_ws_data.clone(),
);
if let TargetKind::Lib { .. } = kind {
lib_tgt = Some((crate_id, name.clone()));
@@ -1267,6 +1292,8 @@ fn cargo_to_crate_graph(
} else {
rustc_build_scripts
},
+ // FIXME: This looks incorrect but I don't think this causes problems.
+ crate_ws_data,
);
}
}
@@ -1280,11 +1307,18 @@ fn detached_file_to_crate_graph(
sysroot: &Sysroot,
override_cfg: &CfgOverrides,
set_test: bool,
-) -> (CrateGraph, ProcMacroPaths) {
+ crate_ws_data: Arc<CrateWorkspaceData>,
+) -> (CrateGraphBuilder, ProcMacroPaths) {
let _p = tracing::info_span!("detached_file_to_crate_graph").entered();
- let mut crate_graph = CrateGraph::default();
- let (public_deps, _libproc_macro) =
- sysroot_to_crate_graph(&mut crate_graph, sysroot, rustc_cfg.clone(), load);
+ let mut crate_graph = CrateGraphBuilder::default();
+ let (public_deps, _libproc_macro) = sysroot_to_crate_graph(
+ &mut crate_graph,
+ sysroot,
+ rustc_cfg.clone(),
+ load,
+ // FIXME: This looks incorrect but I don't think this causes problems.
+ crate_ws_data.clone(),
+ );
let mut cfg_options = CfgOptions::from_iter(rustc_cfg);
if set_test {
@@ -1316,6 +1350,7 @@ fn detached_file_to_crate_graph(
},
false,
None,
+ crate_ws_data,
);
public_deps.add_to_crate_graph(&mut crate_graph, detached_file_crate);
@@ -1323,18 +1358,19 @@ fn detached_file_to_crate_graph(
}
fn handle_rustc_crates(
- crate_graph: &mut CrateGraph,
+ crate_graph: &mut CrateGraphBuilder,
proc_macros: &mut ProcMacroPaths,
- pkg_to_lib_crate: &mut FxHashMap<Package, CrateId>,
+ pkg_to_lib_crate: &mut FxHashMap<Package, CrateBuilderId>,
load: FileLoader<'_>,
rustc_workspace: &CargoWorkspace,
cargo: &CargoWorkspace,
public_deps: &SysrootPublicDeps,
- libproc_macro: Option<CrateId>,
- pkg_crates: &FxHashMap<Package, Vec<(CrateId, TargetKind)>>,
+ libproc_macro: Option<CrateBuilderId>,
+ pkg_crates: &FxHashMap<Package, Vec<(CrateBuilderId, TargetKind)>>,
cfg_options: &CfgOptions,
override_cfg: &CfgOverrides,
build_scripts: &WorkspaceBuildScripts,
+ crate_ws_data: Arc<CrateWorkspaceData>,
) {
let mut rustc_pkg_crates = FxHashMap::default();
// The root package of the rustc-dev component is rustc_driver, so we match that
@@ -1377,6 +1413,7 @@ fn handle_rustc_crates(
&rustc_workspace[tgt].name,
kind,
CrateOrigin::Rustc { name: Symbol::intern(&rustc_workspace[pkg].name) },
+ crate_ws_data.clone(),
);
pkg_to_lib_crate.insert(pkg, crate_id);
// Add dependencies on core / std / alloc for this crate
@@ -1417,7 +1454,7 @@ fn handle_rustc_crates(
// This avoids the situation where `from` depends on e.g. `arrayvec`, but
// `rust_analyzer` thinks that it should use the one from the `rustc_source`
// instead of the one from `crates.io`
- if !crate_graph[*from].dependencies.iter().any(|d| d.name == name) {
+ if !crate_graph[*from].basic.dependencies.iter().any(|d| d.name == name) {
add_dep(crate_graph, *from, name.clone(), to);
}
}
@@ -1427,7 +1464,7 @@ fn handle_rustc_crates(
}
fn add_target_crate_root(
- crate_graph: &mut CrateGraph,
+ crate_graph: &mut CrateGraphBuilder,
proc_macros: &mut ProcMacroPaths,
cargo: &CargoWorkspace,
pkg: &PackageData,
@@ -1437,7 +1474,8 @@ fn add_target_crate_root(
cargo_name: &str,
kind: TargetKind,
origin: CrateOrigin,
-) -> CrateId {
+ crate_ws_data: Arc<CrateWorkspaceData>,
+) -> CrateBuilderId {
let edition = pkg.edition;
let potential_cfg_options = if pkg.features.is_empty() {
None
@@ -1474,7 +1512,7 @@ fn add_target_crate_root(
Some(CrateDisplayName::from_canonical_name(cargo_name)),
Some(pkg.version.to_string()),
Arc::new(cfg_options),
- potential_cfg_options.map(Arc::new),
+ potential_cfg_options,
env,
origin,
matches!(kind, TargetKind::Lib { is_proc_macro: true }),
@@ -1483,6 +1521,7 @@ fn add_target_crate_root(
} else {
pkg.manifest.parent().to_path_buf()
}),
+ crate_ws_data,
);
if let TargetKind::Lib { is_proc_macro: true } = kind {
let proc_macro = match build_data {
@@ -1503,12 +1542,12 @@ fn add_target_crate_root(
#[derive(Default, Debug)]
struct SysrootPublicDeps {
- deps: Vec<(CrateName, CrateId, bool)>,
+ deps: Vec<(CrateName, CrateBuilderId, bool)>,
}
impl SysrootPublicDeps {
/// Makes `from` depend on the public sysroot crates.
- fn add_to_crate_graph(&self, crate_graph: &mut CrateGraph, from: CrateId) {
+ fn add_to_crate_graph(&self, crate_graph: &mut CrateGraphBuilder, from: CrateBuilderId) {
for (name, krate, prelude) in &self.deps {
add_dep_with_prelude(crate_graph, from, name.clone(), *krate, *prelude, true);
}
@@ -1516,10 +1555,10 @@ impl SysrootPublicDeps {
}
fn extend_crate_graph_with_sysroot(
- crate_graph: &mut CrateGraph,
- mut sysroot_crate_graph: CrateGraph,
+ crate_graph: &mut CrateGraphBuilder,
+ mut sysroot_crate_graph: CrateGraphBuilder,
mut sysroot_proc_macros: ProcMacroPaths,
-) -> (SysrootPublicDeps, Option<CrateId>) {
+) -> (SysrootPublicDeps, Option<CrateBuilderId>) {
let mut pub_deps = vec![];
let mut libproc_macro = None;
let diff = CfgDiff::new(vec![], vec![CfgAtom::Flag(sym::test.clone())]);
@@ -1527,11 +1566,11 @@ fn extend_crate_graph_with_sysroot(
// uninject `test` flag so `core` keeps working.
Arc::make_mut(&mut c.cfg_options).apply_diff(diff.clone());
// patch the origin
- if c.origin.is_local() {
+ if c.basic.origin.is_local() {
let lang_crate = LangCrateOrigin::from(
- c.display_name.as_ref().map_or("", |it| it.canonical_name().as_str()),
+ c.extra.display_name.as_ref().map_or("", |it| it.canonical_name().as_str()),
);
- c.origin = CrateOrigin::Lang(lang_crate);
+ c.basic.origin = CrateOrigin::Lang(lang_crate);
match lang_crate {
LangCrateOrigin::Test
| LangCrateOrigin::Alloc
@@ -1579,11 +1618,12 @@ fn extend_crate_graph_with_sysroot(
}
fn sysroot_to_crate_graph(
- crate_graph: &mut CrateGraph,
+ crate_graph: &mut CrateGraphBuilder,
sysroot: &Sysroot,
rustc_cfg: Vec<CfgAtom>,
load: FileLoader<'_>,
-) -> (SysrootPublicDeps, Option<CrateId>) {
+ crate_ws_data: Arc<CrateWorkspaceData>,
+) -> (SysrootPublicDeps, Option<CrateBuilderId>) {
let _p = tracing::info_span!("sysroot_to_crate_graph").entered();
match sysroot.workspace() {
RustLibSrcWorkspace::Workspace(cargo) => {
@@ -1605,6 +1645,7 @@ fn sysroot_to_crate_graph(
},
&WorkspaceBuildScripts::default(),
false,
+ crate_ws_data,
);
extend_crate_graph_with_sysroot(crate_graph, cg, pm)
@@ -1627,6 +1668,7 @@ fn sysroot_to_crate_graph(
..Default::default()
},
false,
+ crate_ws_data,
);
extend_crate_graph_with_sysroot(crate_graph, cg, pm)
@@ -1639,29 +1681,31 @@ fn sysroot_to_crate_graph(
cfg_options.insert_atom(sym::miri.clone());
cfg_options
});
- let sysroot_crates: FxHashMap<crate::sysroot::stitched::RustLibSrcCrate, CrateId> =
- stitched
- .crates()
- .filter_map(|krate| {
- let file_id = load(&stitched[krate].root)?;
-
- let display_name =
- CrateDisplayName::from_canonical_name(&stitched[krate].name);
- let crate_id = crate_graph.add_crate_root(
- file_id,
- Edition::CURRENT_FIXME,
- Some(display_name),
- None,
- cfg_options.clone(),
- None,
- Env::default(),
- CrateOrigin::Lang(LangCrateOrigin::from(&*stitched[krate].name)),
- false,
- None,
- );
- Some((krate, crate_id))
- })
- .collect();
+ let sysroot_crates: FxHashMap<
+ crate::sysroot::stitched::RustLibSrcCrate,
+ CrateBuilderId,
+ > = stitched
+ .crates()
+ .filter_map(|krate| {
+ let file_id = load(&stitched[krate].root)?;
+
+ let display_name = CrateDisplayName::from_canonical_name(&stitched[krate].name);
+ let crate_id = crate_graph.add_crate_root(
+ file_id,
+ Edition::CURRENT_FIXME,
+ Some(display_name),
+ None,
+ cfg_options.clone(),
+ None,
+ Env::default(),
+ CrateOrigin::Lang(LangCrateOrigin::from(&*stitched[krate].name)),
+ false,
+ None,
+ crate_ws_data.clone(),
+ );
+ Some((krate, crate_id))
+ })
+ .collect();
for from in stitched.crates() {
for &to in stitched[from].deps.iter() {
@@ -1691,22 +1735,32 @@ fn sysroot_to_crate_graph(
}
}
-fn add_dep(graph: &mut CrateGraph, from: CrateId, name: CrateName, to: CrateId) {
- add_dep_inner(graph, from, Dependency::new(name, to))
+fn add_dep(
+ graph: &mut CrateGraphBuilder,
+ from: CrateBuilderId,
+ name: CrateName,
+ to: CrateBuilderId,
+) {
+ add_dep_inner(graph, from, DependencyBuilder::new(name, to))
}
fn add_dep_with_prelude(
- graph: &mut CrateGraph,
- from: CrateId,
+ graph: &mut CrateGraphBuilder,
+ from: CrateBuilderId,
name: CrateName,
- to: CrateId,
+ to: CrateBuilderId,
prelude: bool,
sysroot: bool,
) {
- add_dep_inner(graph, from, Dependency::with_prelude(name, to, prelude, sysroot))
+ add_dep_inner(graph, from, DependencyBuilder::with_prelude(name, to, prelude, sysroot))
}
-fn add_proc_macro_dep(crate_graph: &mut CrateGraph, from: CrateId, to: CrateId, prelude: bool) {
+fn add_proc_macro_dep(
+ crate_graph: &mut CrateGraphBuilder,
+ from: CrateBuilderId,
+ to: CrateBuilderId,
+ prelude: bool,
+) {
add_dep_with_prelude(
crate_graph,
from,
@@ -1717,7 +1771,7 @@ fn add_proc_macro_dep(crate_graph: &mut CrateGraph, from: CrateId, to: CrateId,
);
}
-fn add_dep_inner(graph: &mut CrateGraph, from: CrateId, dep: Dependency) {
+fn add_dep_inner(graph: &mut CrateGraphBuilder, from: CrateBuilderId, dep: DependencyBuilder) {
if let Err(err) = graph.add_dep(from, dep) {
tracing::warn!("{}", err)
}