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.rs99
1 files changed, 31 insertions, 68 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index fcebca80b3..b7ae76be8c 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -6,8 +6,8 @@ use std::{collections::VecDeque, fmt, fs, iter, process::Command, str::FromStr,
use anyhow::{format_err, Context};
use base_db::{
- CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, DependencyKind,
- Edition, Env, FileId, LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult,
+ CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Edition, Env,
+ FileId, LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult,
};
use cfg::{CfgAtom, CfgDiff, CfgOptions};
use paths::{AbsPath, AbsPathBuf};
@@ -894,7 +894,7 @@ fn project_json_to_crate_graph(
for dep in &krate.deps {
if let Some(&to) = crates.get(&dep.crate_id) {
- add_dep(crate_graph, from, dep.name.clone(), to, dep.kind().to_owned())
+ add_dep(crate_graph, from, dep.name.clone(), to)
}
}
}
@@ -938,8 +938,6 @@ fn cargo_to_crate_graph(
// Add test cfg for local crates
if cargo[pkg].is_local {
cfg_options.insert_atom("test".into());
- }
- if cargo[pkg].is_member {
cfg_options.insert_atom("rust_analyzer".into());
}
@@ -973,16 +971,28 @@ fn cargo_to_crate_graph(
let Some(file_id) = load(root) else { continue };
+ let build_data = build_scripts.get_output(pkg);
+ let pkg_data = &cargo[pkg];
let crate_id = add_target_crate_root(
crate_graph,
proc_macros,
- &cargo[pkg],
- build_scripts.get_output(pkg),
+ pkg_data,
+ build_data,
cfg_options.clone(),
file_id,
name,
kind,
- false,
+ if pkg_data.is_local {
+ CrateOrigin::Local {
+ repo: pkg_data.repository.clone(),
+ name: Some(pkg_data.name.clone()),
+ }
+ } else {
+ CrateOrigin::Library {
+ repo: pkg_data.repository.clone(),
+ name: pkg_data.name.clone(),
+ }
+ },
);
if let TargetKind::Lib { .. } = kind {
lib_tgt = Some((crate_id, name.clone()));
@@ -1016,7 +1026,7 @@ fn cargo_to_crate_graph(
// cargo metadata does not do any normalization,
// so we do it ourselves currently
let name = CrateName::normalize_dashes(&name);
- add_dep(crate_graph, from, name, to, DependencyKind::Normal);
+ add_dep(crate_graph, from, name, to);
}
}
}
@@ -1036,17 +1046,7 @@ fn cargo_to_crate_graph(
continue;
}
- add_dep(
- crate_graph,
- from,
- name.clone(),
- to,
- match dep.kind {
- DepKind::Normal => DependencyKind::Normal,
- DepKind::Dev => DependencyKind::Dev,
- DepKind::Build => DependencyKind::Build,
- },
- )
+ add_dep(crate_graph, from, name.clone(), to)
}
}
}
@@ -1193,7 +1193,7 @@ fn handle_rustc_crates(
file_id,
&rustc_workspace[tgt].name,
kind,
- true,
+ CrateOrigin::Rustc { name: rustc_workspace[pkg].name.clone() },
);
pkg_to_lib_crate.insert(pkg, crate_id);
// Add dependencies on core / std / alloc for this crate
@@ -1213,17 +1213,7 @@ fn handle_rustc_crates(
let name = CrateName::new(&dep.name).unwrap();
if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() {
- add_dep(
- crate_graph,
- from,
- name.clone(),
- to,
- match dep.kind {
- DepKind::Normal => DependencyKind::Normal,
- DepKind::Dev => DependencyKind::Dev,
- DepKind::Build => DependencyKind::Build,
- },
- );
+ add_dep(crate_graph, from, name.clone(), to);
}
}
}
@@ -1245,7 +1235,7 @@ fn handle_rustc_crates(
// `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) {
- add_dep(crate_graph, *from, name.clone(), to, DependencyKind::Normal);
+ add_dep(crate_graph, *from, name.clone(), to);
}
}
}
@@ -1262,7 +1252,7 @@ fn add_target_crate_root(
file_id: FileId,
cargo_name: &str,
kind: TargetKind,
- rustc_crate: bool,
+ origin: CrateOrigin,
) -> CrateId {
let edition = pkg.edition;
let potential_cfg_options = if pkg.features.is_empty() {
@@ -1310,13 +1300,7 @@ fn add_target_crate_root(
potential_cfg_options,
env,
matches!(kind, TargetKind::Lib { is_proc_macro: true }),
- if rustc_crate {
- CrateOrigin::Rustc { name: pkg.name.clone() }
- } else if pkg.is_member {
- CrateOrigin::Local { repo: pkg.repository.clone(), name: Some(pkg.name.clone()) }
- } else {
- CrateOrigin::Library { repo: pkg.repository.clone(), name: pkg.name.clone() }
- },
+ origin,
);
if let TargetKind::Lib { is_proc_macro: true } = kind {
let proc_macro = match build_data.as_ref().map(|it| it.proc_macro_dylib_path.as_ref()) {
@@ -1340,14 +1324,7 @@ impl SysrootPublicDeps {
/// Makes `from` depend on the public sysroot crates.
fn add_to_crate_graph(&self, crate_graph: &mut CrateGraph, from: CrateId) {
for (name, krate, prelude) in &self.deps {
- add_dep_with_prelude(
- crate_graph,
- from,
- name.clone(),
- *krate,
- *prelude,
- DependencyKind::Normal,
- );
+ add_dep_with_prelude(crate_graph, from, name.clone(), *krate, *prelude);
}
}
}
@@ -1455,7 +1432,7 @@ fn sysroot_to_crate_graph(
if let (Some(&from), Some(&to)) =
(sysroot_crates.get(&from), sysroot_crates.get(&to))
{
- add_dep(crate_graph, from, name, to, DependencyKind::Normal);
+ add_dep(crate_graph, from, name, to);
}
}
}
@@ -1476,14 +1453,8 @@ fn sysroot_to_crate_graph(
}
}
-fn add_dep(
- graph: &mut CrateGraph,
- from: CrateId,
- name: CrateName,
- to: CrateId,
- kind: DependencyKind,
-) {
- add_dep_inner(graph, from, Dependency::new(name, to, kind))
+fn add_dep(graph: &mut CrateGraph, from: CrateId, name: CrateName, to: CrateId) {
+ add_dep_inner(graph, from, Dependency::new(name, to))
}
fn add_dep_with_prelude(
@@ -1492,20 +1463,12 @@ fn add_dep_with_prelude(
name: CrateName,
to: CrateId,
prelude: bool,
- kind: DependencyKind,
) {
- add_dep_inner(graph, from, Dependency::with_prelude(name, to, prelude, kind))
+ add_dep_inner(graph, from, Dependency::with_prelude(name, to, prelude))
}
fn add_proc_macro_dep(crate_graph: &mut CrateGraph, from: CrateId, to: CrateId, prelude: bool) {
- add_dep_with_prelude(
- crate_graph,
- from,
- CrateName::new("proc_macro").unwrap(),
- to,
- prelude,
- DependencyKind::Normal,
- );
+ add_dep_with_prelude(crate_graph, from, CrateName::new("proc_macro").unwrap(), to, prelude);
}
fn add_dep_inner(graph: &mut CrateGraph, from: CrateId, dep: Dependency) {