Skip to content

Commit 584bdde

Browse files
committed
Don't panic on crates depending on themselves
Fixes #3883.
1 parent 90a5c46 commit 584bdde

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

crates/ra_db/src/input.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,12 @@ impl CrateGraph {
254254
return false;
255255
}
256256

257+
if target == from {
258+
return true;
259+
}
260+
257261
for dep in &self[from].dependencies {
258262
let crate_id = dep.crate_id;
259-
if crate_id == target {
260-
return true;
261-
}
262-
263263
if self.dfs_find(target, crate_id, visited) {
264264
return true;
265265
}
@@ -369,7 +369,7 @@ mod tests {
369369
use super::{CfgOptions, CrateGraph, CrateName, Dependency, Edition::Edition2018, Env, FileId};
370370

371371
#[test]
372-
fn it_should_panic_because_of_cycle_dependencies() {
372+
fn detect_cyclic_dependency_indirect() {
373373
let mut graph = CrateGraph::default();
374374
let crate1 = graph.add_crate_root(
375375
FileId(1u32),
@@ -403,6 +403,31 @@ mod tests {
403403
assert!(graph.add_dep(crate3, CrateName::new("crate1").unwrap(), crate1).is_err());
404404
}
405405

406+
#[test]
407+
fn detect_cyclic_dependency_direct() {
408+
let mut graph = CrateGraph::default();
409+
let crate1 = graph.add_crate_root(
410+
FileId(1u32),
411+
Edition2018,
412+
None,
413+
CfgOptions::default(),
414+
Env::default(),
415+
Default::default(),
416+
Default::default(),
417+
);
418+
let crate2 = graph.add_crate_root(
419+
FileId(2u32),
420+
Edition2018,
421+
None,
422+
CfgOptions::default(),
423+
Env::default(),
424+
Default::default(),
425+
Default::default(),
426+
);
427+
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
428+
assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err());
429+
}
430+
406431
#[test]
407432
fn it_works() {
408433
let mut graph = CrateGraph::default();

crates/ra_hir_def/src/nameres/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: CrateDefMap) -> Cr
3636

3737
// populate external prelude
3838
for dep in &crate_graph[def_map.krate].dependencies {
39-
let dep_def_map = db.crate_def_map(dep.crate_id);
4039
log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id);
40+
let dep_def_map = db.crate_def_map(dep.crate_id);
4141
def_map.extern_prelude.insert(
4242
dep.as_name(),
4343
ModuleId { krate: dep.crate_id, local_id: dep_def_map.root }.into(),

0 commit comments

Comments
 (0)