Skip to content

Commit e4927d5

Browse files
committed
Compress code
1 parent a6960fb commit e4927d5

File tree

2 files changed

+42
-66
lines changed

2 files changed

+42
-66
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/workspace.rs

Lines changed: 24 additions & 64 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.
@@ -249,18 +249,14 @@ impl ProjectWorkspace {
249249
if let Some(&from) = crates.get(&from) {
250250
if let Some((public_deps, _proc_macro)) = &sysroot_dps {
251251
for (name, to) in public_deps.iter() {
252-
if let Err(_) = crate_graph.add_dep(from, name.clone(), *to) {
253-
log::error!("cyclic dependency on {} for {:?}", name, from)
254-
}
252+
add_dep(&mut crate_graph, from, name.clone(), *to)
255253
}
256254
}
257255

258256
for dep in &krate.deps {
259257
let to_crate_id = dep.crate_id;
260258
if let Some(&to) = crates.get(&to_crate_id) {
261-
if let Err(_) = crate_graph.add_dep(from, dep.name.clone(), to) {
262-
log::error!("cyclic dependency {:?} -> {:?}", from, to);
263-
}
259+
add_dep(&mut crate_graph, from, dep.name.clone(), to)
264260
}
265261
}
266262
}
@@ -299,16 +295,12 @@ impl ProjectWorkspace {
299295
}
300296
if cargo[tgt].is_proc_macro {
301297
if let Some(proc_macro) = libproc_macro {
302-
if let Err(_) = crate_graph.add_dep(
298+
add_dep(
299+
&mut crate_graph,
303300
crate_id,
304301
CrateName::new("proc_macro").unwrap(),
305302
proc_macro,
306-
) {
307-
log::error!(
308-
"cyclic dependency on proc_macro for {}",
309-
&cargo[pkg].name
310-
)
311-
}
303+
);
312304
}
313305
}
314306

@@ -323,21 +315,12 @@ impl ProjectWorkspace {
323315
// cargo metadata does not do any normalization,
324316
// so we do it ourselves currently
325317
let name = CrateName::normalize_dashes(&name);
326-
if to != from && crate_graph.add_dep(from, name, to).is_err() {
327-
log::error!(
328-
"cyclic dependency between targets of {}",
329-
&cargo[pkg].name
330-
)
318+
if to != from {
319+
add_dep(&mut crate_graph, from, name, to);
331320
}
332321
}
333322
for (name, krate) in public_deps.iter() {
334-
if let Err(_) = crate_graph.add_dep(from, name.clone(), *krate) {
335-
log::error!(
336-
"cyclic dependency on {} for {}",
337-
name,
338-
&cargo[pkg].name
339-
)
340-
}
323+
add_dep(&mut crate_graph, from, name.clone(), *krate);
341324
}
342325
}
343326
}
@@ -349,13 +332,7 @@ impl ProjectWorkspace {
349332
let name = CrateName::new(&dep.name).unwrap();
350333
if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
351334
for &from in pkg_crates.get(&pkg).into_iter().flatten() {
352-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
353-
log::error!(
354-
"cyclic dependency {} -> {}",
355-
&cargo[pkg].name,
356-
&cargo[dep.pkg].name
357-
)
358-
}
335+
add_dep(&mut crate_graph, from, name.clone(), to)
359336
}
360337
}
361338
}
@@ -391,15 +368,7 @@ impl ProjectWorkspace {
391368
pkg_to_lib_crate.insert(pkg, crate_id);
392369
// Add dependencies on the core / std / alloc for rustc
393370
for (name, krate) in public_deps.iter() {
394-
if let Err(_) =
395-
crate_graph.add_dep(crate_id, name.clone(), *krate)
396-
{
397-
log::error!(
398-
"cyclic dependency on {} for {}",
399-
name,
400-
&cargo[pkg].name
401-
)
402-
}
371+
add_dep(&mut crate_graph, crate_id, name.clone(), *krate);
403372
}
404373
rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
405374
}
@@ -412,13 +381,7 @@ impl ProjectWorkspace {
412381
let name = CrateName::new(&dep.name).unwrap();
413382
if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
414383
for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() {
415-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
416-
log::error!(
417-
"cyclic dependency {} -> {}",
418-
&rustc_workspace[pkg].name,
419-
&rustc_workspace[dep.pkg].name
420-
)
421-
}
384+
add_dep(&mut crate_graph, from, name.clone(), to);
422385
}
423386
}
424387
}
@@ -434,13 +397,7 @@ impl ProjectWorkspace {
434397
continue;
435398
}
436399
for &from in pkg_crates.get(&pkg).into_iter().flatten() {
437-
if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
438-
log::error!(
439-
"cyclic dependency {} -> {}",
440-
&cargo[pkg].name,
441-
&rustc_workspace[dep].name
442-
)
443-
}
400+
add_dep(&mut crate_graph, from, name.clone(), to);
444401
}
445402
}
446403
}
@@ -511,19 +468,18 @@ fn sysroot_to_crate_graph(
511468
) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) {
512469
let mut cfg_options = CfgOptions::default();
513470
cfg_options.extend(get_rustc_cfg_options(target));
514-
let sysroot_crates: FxHashMap<_, _> = sysroot
471+
let sysroot_crates: FxHashMap<SysrootCrate, CrateId> = sysroot
515472
.crates()
516473
.filter_map(|krate| {
517474
let file_id = load(&sysroot[krate].root)?;
518475

519476
let env = Env::default();
520477
let proc_macro = vec![];
521-
let name = CrateName::new(&sysroot[krate].name)
522-
.expect("Sysroot crates' names do not contain dashes");
478+
let display_name = CrateDisplayName::from_canonical_name(sysroot[krate].name.clone());
523479
let crate_id = crate_graph.add_crate_root(
524480
file_id,
525481
Edition::Edition2018,
526-
Some(name.into()),
482+
Some(display_name),
527483
cfg_options.clone(),
528484
env,
529485
proc_macro,
@@ -536,9 +492,7 @@ fn sysroot_to_crate_graph(
536492
for &to in sysroot[from].deps.iter() {
537493
let name = CrateName::new(&sysroot[to].name).unwrap();
538494
if let (Some(&from), Some(&to)) = (sysroot_crates.get(&from), sysroot_crates.get(&to)) {
539-
if let Err(_) = crate_graph.add_dep(from, name, to) {
540-
log::error!("cyclic dependency between sysroot crates")
541-
}
495+
add_dep(crate_graph, from, name, to);
542496
}
543497
}
544498
}
@@ -579,3 +533,9 @@ fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> {
579533

580534
res
581535
}
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)