diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/base_db/src/input.rs | 20 | ||||
-rw-r--r-- | crates/project_model/src/workspace.rs | 88 |
2 files changed, 42 insertions, 66 deletions
diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index 31907ed98..98ba372ad 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs | |||
@@ -225,7 +225,10 @@ impl CrateGraph { | |||
225 | to: CrateId, | 225 | to: CrateId, |
226 | ) -> Result<(), CyclicDependenciesError> { | 226 | ) -> Result<(), CyclicDependenciesError> { |
227 | if self.dfs_find(from, to, &mut FxHashSet::default()) { | 227 | 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 | }); | ||
229 | } | 232 | } |
230 | self.arena.get_mut(&from).unwrap().add_dep(name, to); | 233 | self.arena.get_mut(&from).unwrap().add_dep(name, to); |
231 | Ok(()) | 234 | Ok(()) |
@@ -421,7 +424,20 @@ impl fmt::Display for ParseEditionError { | |||
421 | impl std::error::Error for ParseEditionError {} | 424 | impl std::error::Error for ParseEditionError {} |
422 | 425 | ||
423 | #[derive(Debug)] | 426 | #[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 | } | ||
425 | 441 | ||
426 | #[cfg(test)] | 442 | #[cfg(test)] |
427 | mod tests { | 443 | mod tests { |
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index 90ab5e7a9..dbf1dc5bf 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs | |||
@@ -12,8 +12,8 @@ use proc_macro_api::ProcMacroClient; | |||
12 | use rustc_hash::{FxHashMap, FxHashSet}; | 12 | use rustc_hash::{FxHashMap, FxHashSet}; |
13 | 13 | ||
14 | use crate::{ | 14 | use crate::{ |
15 | cargo_workspace, cfg_flag::CfgFlag, utf8_stdout, CargoConfig, CargoWorkspace, ProjectJson, | 15 | cargo_workspace, cfg_flag::CfgFlag, sysroot::SysrootCrate, utf8_stdout, CargoConfig, |
16 | ProjectManifest, Sysroot, TargetKind, | 16 | CargoWorkspace, ProjectJson, ProjectManifest, Sysroot, TargetKind, |
17 | }; | 17 | }; |
18 | 18 | ||
19 | /// `PackageRoot` describes a package root folder. | 19 | /// `PackageRoot` describes a package root folder. |
@@ -249,18 +249,14 @@ impl ProjectWorkspace { | |||
249 | if let Some(&from) = crates.get(&from) { | 249 | if let Some(&from) = crates.get(&from) { |
250 | if let Some((public_deps, _proc_macro)) = &sysroot_dps { | 250 | if let Some((public_deps, _proc_macro)) = &sysroot_dps { |
251 | for (name, to) in public_deps.iter() { | 251 | for (name, to) in public_deps.iter() { |
252 | if let Err(_) = crate_graph.add_dep(from, name.clone(), *to) { | 252 | add_dep(&mut crate_graph, from, name.clone(), *to) |
253 | log::error!("cyclic dependency on {} for {:?}", name, from) | ||
254 | } | ||
255 | } | 253 | } |
256 | } | 254 | } |
257 | 255 | ||
258 | for dep in &krate.deps { | 256 | for dep in &krate.deps { |
259 | let to_crate_id = dep.crate_id; | 257 | let to_crate_id = dep.crate_id; |
260 | if let Some(&to) = crates.get(&to_crate_id) { | 258 | if let Some(&to) = crates.get(&to_crate_id) { |
261 | if let Err(_) = crate_graph.add_dep(from, dep.name.clone(), to) { | 259 | add_dep(&mut crate_graph, from, dep.name.clone(), to) |
262 | log::error!("cyclic dependency {:?} -> {:?}", from, to); | ||
263 | } | ||
264 | } | 260 | } |
265 | } | 261 | } |
266 | } | 262 | } |
@@ -299,16 +295,12 @@ impl ProjectWorkspace { | |||
299 | } | 295 | } |
300 | if cargo[tgt].is_proc_macro { | 296 | if cargo[tgt].is_proc_macro { |
301 | if let Some(proc_macro) = libproc_macro { | 297 | if let Some(proc_macro) = libproc_macro { |
302 | if let Err(_) = crate_graph.add_dep( | 298 | add_dep( |
299 | &mut crate_graph, | ||
303 | crate_id, | 300 | crate_id, |
304 | CrateName::new("proc_macro").unwrap(), | 301 | CrateName::new("proc_macro").unwrap(), |
305 | proc_macro, | 302 | proc_macro, |
306 | ) { | 303 | ); |
307 | log::error!( | ||
308 | "cyclic dependency on proc_macro for {}", | ||
309 | &cargo[pkg].name | ||
310 | ) | ||
311 | } | ||
312 | } | 304 | } |
313 | } | 305 | } |
314 | 306 | ||
@@ -323,21 +315,12 @@ impl ProjectWorkspace { | |||
323 | // cargo metadata does not do any normalization, | 315 | // cargo metadata does not do any normalization, |
324 | // so we do it ourselves currently | 316 | // so we do it ourselves currently |
325 | let name = CrateName::normalize_dashes(&name); | 317 | let name = CrateName::normalize_dashes(&name); |
326 | if to != from && crate_graph.add_dep(from, name, to).is_err() { | 318 | if to != from { |
327 | log::error!( | 319 | add_dep(&mut crate_graph, from, name, to); |
328 | "cyclic dependency between targets of {}", | ||
329 | &cargo[pkg].name | ||
330 | ) | ||
331 | } | 320 | } |
332 | } | 321 | } |
333 | for (name, krate) in public_deps.iter() { | 322 | for (name, krate) in public_deps.iter() { |
334 | if let Err(_) = crate_graph.add_dep(from, name.clone(), *krate) { | 323 | add_dep(&mut crate_graph, from, name.clone(), *krate); |
335 | log::error!( | ||
336 | "cyclic dependency on {} for {}", | ||
337 | name, | ||
338 | &cargo[pkg].name | ||
339 | ) | ||
340 | } | ||
341 | } | 324 | } |
342 | } | 325 | } |
343 | } | 326 | } |
@@ -349,13 +332,7 @@ impl ProjectWorkspace { | |||
349 | let name = CrateName::new(&dep.name).unwrap(); | 332 | let name = CrateName::new(&dep.name).unwrap(); |
350 | if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) { | 333 | if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) { |
351 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { | 334 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { |
352 | if let Err(_) = crate_graph.add_dep(from, name.clone(), to) { | 335 | add_dep(&mut crate_graph, from, name.clone(), to) |
353 | log::error!( | ||
354 | "cyclic dependency {} -> {}", | ||
355 | &cargo[pkg].name, | ||
356 | &cargo[dep.pkg].name | ||
357 | ) | ||
358 | } | ||
359 | } | 336 | } |
360 | } | 337 | } |
361 | } | 338 | } |
@@ -391,15 +368,7 @@ impl ProjectWorkspace { | |||
391 | pkg_to_lib_crate.insert(pkg, crate_id); | 368 | pkg_to_lib_crate.insert(pkg, crate_id); |
392 | // Add dependencies on the core / std / alloc for rustc | 369 | // Add dependencies on the core / std / alloc for rustc |
393 | for (name, krate) in public_deps.iter() { | 370 | for (name, krate) in public_deps.iter() { |
394 | if let Err(_) = | 371 | add_dep(&mut crate_graph, crate_id, name.clone(), *krate); |
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 | } | ||
403 | } | 372 | } |
404 | rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id); | 373 | rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id); |
405 | } | 374 | } |
@@ -412,13 +381,7 @@ impl ProjectWorkspace { | |||
412 | let name = CrateName::new(&dep.name).unwrap(); | 381 | let name = CrateName::new(&dep.name).unwrap(); |
413 | if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) { | 382 | if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) { |
414 | for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() { | 383 | for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() { |
415 | if let Err(_) = crate_graph.add_dep(from, name.clone(), to) { | 384 | add_dep(&mut crate_graph, from, name.clone(), to); |
416 | log::error!( | ||
417 | "cyclic dependency {} -> {}", | ||
418 | &rustc_workspace[pkg].name, | ||
419 | &rustc_workspace[dep.pkg].name | ||
420 | ) | ||
421 | } | ||
422 | } | 385 | } |
423 | } | 386 | } |
424 | } | 387 | } |
@@ -434,13 +397,7 @@ impl ProjectWorkspace { | |||
434 | continue; | 397 | continue; |
435 | } | 398 | } |
436 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { | 399 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { |
437 | if let Err(_) = crate_graph.add_dep(from, name.clone(), to) { | 400 | add_dep(&mut crate_graph, from, name.clone(), to); |
438 | log::error!( | ||
439 | "cyclic dependency {} -> {}", | ||
440 | &cargo[pkg].name, | ||
441 | &rustc_workspace[dep].name | ||
442 | ) | ||
443 | } | ||
444 | } | 401 | } |
445 | } | 402 | } |
446 | } | 403 | } |
@@ -511,19 +468,18 @@ fn sysroot_to_crate_graph( | |||
511 | ) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) { | 468 | ) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) { |
512 | let mut cfg_options = CfgOptions::default(); | 469 | let mut cfg_options = CfgOptions::default(); |
513 | cfg_options.extend(get_rustc_cfg_options(target)); | 470 | cfg_options.extend(get_rustc_cfg_options(target)); |
514 | let sysroot_crates: FxHashMap<_, _> = sysroot | 471 | let sysroot_crates: FxHashMap<SysrootCrate, CrateId> = sysroot |
515 | .crates() | 472 | .crates() |
516 | .filter_map(|krate| { | 473 | .filter_map(|krate| { |
517 | let file_id = load(&sysroot[krate].root)?; | 474 | let file_id = load(&sysroot[krate].root)?; |
518 | 475 | ||
519 | let env = Env::default(); | 476 | let env = Env::default(); |
520 | let proc_macro = vec![]; | 477 | let proc_macro = vec![]; |
521 | let name = CrateName::new(&sysroot[krate].name) | 478 | let display_name = CrateDisplayName::from_canonical_name(sysroot[krate].name.clone()); |
522 | .expect("Sysroot crates' names do not contain dashes"); | ||
523 | let crate_id = crate_graph.add_crate_root( | 479 | let crate_id = crate_graph.add_crate_root( |
524 | file_id, | 480 | file_id, |
525 | Edition::Edition2018, | 481 | Edition::Edition2018, |
526 | Some(name.into()), | 482 | Some(display_name), |
527 | cfg_options.clone(), | 483 | cfg_options.clone(), |
528 | env, | 484 | env, |
529 | proc_macro, | 485 | proc_macro, |
@@ -536,9 +492,7 @@ fn sysroot_to_crate_graph( | |||
536 | for &to in sysroot[from].deps.iter() { | 492 | for &to in sysroot[from].deps.iter() { |
537 | let name = CrateName::new(&sysroot[to].name).unwrap(); | 493 | let name = CrateName::new(&sysroot[to].name).unwrap(); |
538 | if let (Some(&from), Some(&to)) = (sysroot_crates.get(&from), sysroot_crates.get(&to)) { | 494 | 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) { | 495 | add_dep(crate_graph, from, name, to); |
540 | log::error!("cyclic dependency between sysroot crates") | ||
541 | } | ||
542 | } | 496 | } |
543 | } | 497 | } |
544 | } | 498 | } |
@@ -579,3 +533,9 @@ fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> { | |||
579 | 533 | ||
580 | res | 534 | res |
581 | } | 535 | } |
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 | } | ||