Skip to content

internal: Delay drawing of workspace dev-dependency edges #16886

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 19, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions crates/project-model/src/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,8 @@ fn cargo_to_crate_graph(
}
}

let mut delayed_dev_deps = vec![];

// Now add a dep edge from all targets of upstream to the lib
// target of downstream.
for pkg in cargo.packages() {
Expand All @@ -1092,20 +1094,18 @@ fn cargo_to_crate_graph(
}

// If the dependency is a dev-dependency with both crates being member libraries of
// the workspace we discard the edge. The reason can be read up on in
// the workspace we delay adding the edge. The reason can be read up on in
// https://github.com/rust-lang/rust-analyzer/issues/14167
// but in short, such an edge usually causes some form of cycle in the crate graph
// wrt to unit tests. Something we cannot reasonable support.
// but in short, such an edge is able to cause some form of cycle in the crate graph
// for normal dependencies. If we do run into a cycle like this, we want to prefer
// the non dev-dependency edge, and so the easiest way to do that is by adding the
// dev-dependency edges last.
if dep.kind == DepKind::Dev
&& matches!(kind, TargetKind::Lib { .. })
&& cargo[dep.pkg].is_member
&& cargo[pkg].is_member
{
tracing::warn!(
"Discarding dev-dependency edge from library target `{}` to library target `{}` to prevent potential cycles",
cargo[dep.pkg].name,
cargo[pkg].name
);
delayed_dev_deps.push((from, name.clone(), to));
continue;
}

Expand All @@ -1114,6 +1114,10 @@ fn cargo_to_crate_graph(
}
}

for (from, name, to) in delayed_dev_deps {
add_dep(crate_graph, from, name, to);
}

if has_private {
// If the user provided a path to rustc sources, we add all the rustc_private crates
// and create dependencies on them for the crates which opt-in to that
Expand Down