CrateOrigin::Local means local to the project workspace, not cargo workspace

This commit is contained in:
Lukas Wirth 2024-02-16 16:28:17 +01:00
parent 0ccb3b8731
commit ead369117a
17 changed files with 73 additions and 332 deletions

View file

@ -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) {