Skip to content

Commit 10e3a98

Browse files
bors[bot]matklad
andauthored
Merge #6571
6571: Cleanup project model r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents c7c4e91 + 0dc1742 commit 10e3a98

File tree

3 files changed

+75
-108
lines changed

3 files changed

+75
-108
lines changed

crates/base_db/src/input.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,10 @@ impl CrateGraph {
225225
to: CrateId,
226226
) -> Result<(), CyclicDependenciesError> {
227227
if self.dfs_find(from, to, &mut FxHashSet::default()) {
228-
return Err(CyclicDependenciesError);
228+
return Err(CyclicDependenciesError {
229+
from: (from, self[from].display_name.clone()),
230+
to: (to, self[to].display_name.clone()),
231+
});
229232
}
230233
self.arena.get_mut(&from).unwrap().add_dep(name, to);
231234
Ok(())
@@ -421,7 +424,20 @@ impl fmt::Display for ParseEditionError {
421424
impl std::error::Error for ParseEditionError {}
422425

423426
#[derive(Debug)]
424-
pub struct CyclicDependenciesError;
427+
pub struct CyclicDependenciesError {
428+
from: (CrateId, Option<CrateDisplayName>),
429+
to: (CrateId, Option<CrateDisplayName>),
430+
}
431+
432+
impl fmt::Display for CyclicDependenciesError {
433+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
434+
let render = |(id, name): &(CrateId, Option<CrateDisplayName>)| match name {
435+
Some(it) => format!("{}({:?})", it, id),
436+
None => format!("{:?}", id),
437+
};
438+
write!(f, "cyclic deps: {} -> {}", render(&self.from), render(&self.to))
439+
}
440+
}
425441

426442
#[cfg(test)]
427443
mod tests {

crates/project_model/src/sysroot.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl Sysroot {
3737
pub fn public_deps(&self) -> impl Iterator<Item = (&'static str, SysrootCrate)> + '_ {
3838
// core is added as a dependency before std in order to
3939
// mimic rustcs dependency order
40-
vec!["core", "alloc", "std"].into_iter().filter_map(move |it| Some((it, self.by_name(it)?)))
40+
["core", "alloc", "std"].iter().filter_map(move |&it| Some((it, self.by_name(it)?)))
4141
}
4242

4343
pub fn proc_macro(&self) -> Option<SysrootCrate> {

crates/project_model/src/workspace.rs

Lines changed: 56 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use proc_macro_api::ProcMacroClient;
1212
use rustc_hash::{FxHashMap, FxHashSet};
1313

1414
use crate::{
15-
cargo_workspace, cfg_flag::CfgFlag, utf8_stdout, CargoConfig, CargoWorkspace, ProjectJson,
16-
ProjectManifest, Sysroot, TargetKind,
15+
cargo_workspace, cfg_flag::CfgFlag, sysroot::SysrootCrate, utf8_stdout, CargoConfig,
16+
CargoWorkspace, ProjectJson, ProjectManifest, Sysroot, TargetKind,
1717
};
1818

1919
/// `PackageRoot` describes a package root folder.
@@ -70,12 +70,8 @@ impl ProjectWorkspace {
7070
format!("Failed to deserialize json file {}", project_json.display())
7171
})?;
7272
let project_location = project_json.parent().unwrap().to_path_buf();
73-
let project = ProjectJson::new(&project_location, data);
74-
let sysroot = match &project.sysroot_src {
75-
Some(path) => Some(Sysroot::load(path)?),
76-
None => None,
77-
};
78-
ProjectWorkspace::Json { project, sysroot }
73+
let project_json = ProjectJson::new(&project_location, data);
74+
ProjectWorkspace::load_inline(project_json)?
7975
}
8076
ProjectManifest::CargoToml(cargo_toml) => {
8177
let cargo_version = utf8_stdout({
@@ -150,43 +146,38 @@ impl ProjectWorkspace {
150146
})
151147
}))
152148
.collect::<Vec<_>>(),
153-
ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
154-
let roots = cargo
155-
.packages()
156-
.map(|pkg| {
157-
let is_member = cargo[pkg].is_member;
158-
let pkg_root = cargo[pkg].root().to_path_buf();
159-
160-
let mut include = vec![pkg_root.clone()];
161-
include.extend(cargo[pkg].out_dir.clone());
162-
163-
let mut exclude = vec![pkg_root.join(".git")];
164-
if is_member {
165-
exclude.push(pkg_root.join("target"));
166-
} else {
167-
exclude.push(pkg_root.join("tests"));
168-
exclude.push(pkg_root.join("examples"));
169-
exclude.push(pkg_root.join("benches"));
170-
}
171-
PackageRoot { is_member, include, exclude }
172-
})
173-
.chain(sysroot.crates().map(|krate| PackageRoot {
149+
ProjectWorkspace::Cargo { cargo, sysroot, rustc } => cargo
150+
.packages()
151+
.map(|pkg| {
152+
let is_member = cargo[pkg].is_member;
153+
let pkg_root = cargo[pkg].root().to_path_buf();
154+
155+
let mut include = vec![pkg_root.clone()];
156+
include.extend(cargo[pkg].out_dir.clone());
157+
158+
let mut exclude = vec![pkg_root.join(".git")];
159+
if is_member {
160+
exclude.push(pkg_root.join("target"));
161+
} else {
162+
exclude.push(pkg_root.join("tests"));
163+
exclude.push(pkg_root.join("examples"));
164+
exclude.push(pkg_root.join("benches"));
165+
}
166+
PackageRoot { is_member, include, exclude }
167+
})
168+
.chain(sysroot.crates().map(|krate| PackageRoot {
169+
is_member: false,
170+
include: vec![sysroot[krate].root_dir().to_path_buf()],
171+
exclude: Vec::new(),
172+
}))
173+
.chain(rustc.into_iter().flat_map(|rustc| {
174+
rustc.packages().map(move |krate| PackageRoot {
174175
is_member: false,
175-
include: vec![sysroot[krate].root_dir().to_path_buf()],
176+
include: vec![rustc[krate].root().to_path_buf()],
176177
exclude: Vec::new(),
177-
}));
178-
if let Some(rustc_packages) = rustc {
179-
roots
180-
.chain(rustc_packages.packages().map(|krate| PackageRoot {
181-
is_member: false,
182-
include: vec![rustc_packages[krate].root().to_path_buf()],
183-
exclude: Vec::new(),
184-
}))
185-
.collect()
186-
} else {
187-
roots.collect()
188-
}
189-
}
178+
})
179+
}))
180+
.collect(),
190181
}
191182
}
192183

@@ -258,18 +249,14 @@ impl ProjectWorkspace {
258249
if let Some(&from) = crates.get(&from) {
259250
if let Some((public_deps, _proc_macro)) = &sysroot_dps {
260251
for (name, to) in public_deps.iter() {
261-
if let Err(_) = crate_graph.add_dep(from, name.clone(), *to) {
262-
log::error!("cyclic dependency on {} for {:?}", name, from)
263-
}
252+
add_dep(&mut crate_graph, from, name.clone(), *to)
264253
}
265254
}
266255

267256
for dep in &krate.deps {
268257
let to_crate_id = dep.crate_id;
269258
if let Some(&to) = crates.get(&to_crate_id) {
270-
if let Err(_) = crate_graph.add_dep(from, dep.name.clone(), to) {
271-
log::error!("cyclic dependency {:?} -> {:?}", from, to);
272-
}
259+
add_dep(&mut crate_graph, from, dep.name.clone(), to)
273260
}
274261
}
275262
}
@@ -308,16 +295,12 @@ impl ProjectWorkspace {
308295
}
309296
if cargo[tgt].is_proc_macro {
310297
if let Some(proc_macro) = libproc_macro {
311-
if let Err(_) = crate_graph.add_dep(
298+
add_dep(
299+
&mut crate_graph,
312300
crate_id,
313301
CrateName::new("proc_macro").unwrap(),
314302
proc_macro,
315-
) {
316-
log::error!(
317-
"cyclic dependency on proc_macro for {}",
318-
&cargo[pkg].name
319-
)
320-
}
303+
);
321304
}
322305
}
323306

@@ -332,21 +315,12 @@ impl ProjectWorkspace {
332315
// cargo metadata does not do any normalization,
333316
// so we do it ourselves currently
334317
let name = CrateName::normalize_dashes(&name);
335-
if to != from && crate_graph.add_dep(from, name, to).is_err() {
336-
log::error!(
337-
"cyclic dependency between targets of {}",
338-
&cargo[pkg].name
339-
)
318+
if to != from {
319+
add_dep(&mut crate_graph, from, name, to);
340320
}
341321
}
342322
for (name, krate) in public_deps.iter() {
343-
if let Err(_) = crate_graph.add_dep(from, name.clone(), *krate) {
344-
log::error!(
345-
"cyclic dependency on {} for {}",
346-
name,
347-
&cargo[pkg].name
348-
)
349-
}
323+
add_dep(&mut crate_graph, from, name.clone(), *krate);
350324
}
351325
}
352326
}
@@ -358,13 +332,7 @@ impl ProjectWorkspace {
358332
let name = CrateName::new(&dep.name).unwrap();
359333
if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
360334
for &from in pkg_crates.get(&pkg).into_iter().flatten() {
361-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
362-
log::error!(
363-
"cyclic dependency {} -> {}",
364-
&cargo[pkg].name,
365-
&cargo[dep.pkg].name
366-
)
367-
}
335+
add_dep(&mut crate_graph, from, name.clone(), to)
368336
}
369337
}
370338
}
@@ -400,15 +368,7 @@ impl ProjectWorkspace {
400368
pkg_to_lib_crate.insert(pkg, crate_id);
401369
// Add dependencies on the core / std / alloc for rustc
402370
for (name, krate) in public_deps.iter() {
403-
if let Err(_) =
404-
crate_graph.add_dep(crate_id, name.clone(), *krate)
405-
{
406-
log::error!(
407-
"cyclic dependency on {} for {}",
408-
name,
409-
&cargo[pkg].name
410-
)
411-
}
371+
add_dep(&mut crate_graph, crate_id, name.clone(), *krate);
412372
}
413373
rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
414374
}
@@ -421,13 +381,7 @@ impl ProjectWorkspace {
421381
let name = CrateName::new(&dep.name).unwrap();
422382
if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
423383
for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() {
424-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
425-
log::error!(
426-
"cyclic dependency {} -> {}",
427-
&rustc_workspace[pkg].name,
428-
&rustc_workspace[dep.pkg].name
429-
)
430-
}
384+
add_dep(&mut crate_graph, from, name.clone(), to);
431385
}
432386
}
433387
}
@@ -443,13 +397,7 @@ impl ProjectWorkspace {
443397
continue;
444398
}
445399
for &from in pkg_crates.get(&pkg).into_iter().flatten() {
446-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
447-
log::error!(
448-
"cyclic dependency {} -> {}",
449-
&cargo[pkg].name,
450-
&rustc_workspace[dep].name
451-
)
452-
}
400+
add_dep(&mut crate_graph, from, name.clone(), to);
453401
}
454402
}
455403
}
@@ -520,19 +468,18 @@ fn sysroot_to_crate_graph(
520468
) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) {
521469
let mut cfg_options = CfgOptions::default();
522470
cfg_options.extend(get_rustc_cfg_options(target));
523-
let sysroot_crates: FxHashMap<_, _> = sysroot
471+
let sysroot_crates: FxHashMap<SysrootCrate, CrateId> = sysroot
524472
.crates()
525473
.filter_map(|krate| {
526474
let file_id = load(&sysroot[krate].root)?;
527475

528476
let env = Env::default();
529477
let proc_macro = vec![];
530-
let name = CrateName::new(&sysroot[krate].name)
531-
.expect("Sysroot crates' names do not contain dashes");
478+
let display_name = CrateDisplayName::from_canonical_name(sysroot[krate].name.clone());
532479
let crate_id = crate_graph.add_crate_root(
533480
file_id,
534481
Edition::Edition2018,
535-
Some(name.into()),
482+
Some(display_name),
536483
cfg_options.clone(),
537484
env,
538485
proc_macro,
@@ -545,9 +492,7 @@ fn sysroot_to_crate_graph(
545492
for &to in sysroot[from].deps.iter() {
546493
let name = CrateName::new(&sysroot[to].name).unwrap();
547494
if let (Some(&from), Some(&to)) = (sysroot_crates.get(&from), sysroot_crates.get(&to)) {
548-
if let Err(_) = crate_graph.add_dep(from, name, to) {
549-
log::error!("cyclic dependency between sysroot crates")
550-
}
495+
add_dep(crate_graph, from, name, to);
551496
}
552497
}
553498
}
@@ -588,3 +533,9 @@ fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> {
588533

589534
res
590535
}
536+
537+
fn add_dep(graph: &mut CrateGraph, from: CrateId, name: CrateName, to: CrateId) {
538+
if let Err(err) = graph.add_dep(from, name, to) {
539+
log::error!("{}", err)
540+
}
541+
}

0 commit comments

Comments
 (0)