mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-20 23:32:15 +00:00
Automatically sort crate graph
This commit is contained in:
parent
86441c5bb9
commit
cdc972499e
2 changed files with 7 additions and 11 deletions
|
@ -490,19 +490,11 @@ impl CrateGraph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sort_deps(&mut self) {
|
|
||||||
self.arena
|
|
||||||
.iter_mut()
|
|
||||||
.for_each(|(_, data)| data.dependencies.sort_by_key(|dep| dep.crate_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Extends this crate graph by adding a complete second crate
|
/// Extends this crate graph by adding a complete second crate
|
||||||
/// graph and adjust the ids in the [`ProcMacroPaths`] accordingly.
|
/// graph and adjust the ids in the [`ProcMacroPaths`] accordingly.
|
||||||
///
|
///
|
||||||
/// This will deduplicate the crates of the graph where possible.
|
/// This will deduplicate the crates of the graph where possible.
|
||||||
/// Note that for deduplication to fully work, `self`'s crate dependencies must be sorted by crate id.
|
/// Furthermore dependencies are sorted by crate id to make deduplication easier.
|
||||||
/// If the crate dependencies were sorted, the resulting graph from this `extend` call will also
|
|
||||||
/// have the crate dependencies sorted.
|
|
||||||
///
|
///
|
||||||
/// Returns a map mapping `other`'s IDs to the new IDs in `self`.
|
/// Returns a map mapping `other`'s IDs to the new IDs in `self`.
|
||||||
pub fn extend(
|
pub fn extend(
|
||||||
|
@ -510,6 +502,12 @@ impl CrateGraph {
|
||||||
mut other: CrateGraph,
|
mut other: CrateGraph,
|
||||||
proc_macros: &mut ProcMacroPaths,
|
proc_macros: &mut ProcMacroPaths,
|
||||||
) -> FxHashMap<CrateId, CrateId> {
|
) -> FxHashMap<CrateId, CrateId> {
|
||||||
|
// Sorting here is a bit pointless because the input is likely already sorted.
|
||||||
|
// However, the overhead is small and it makes the `extend` method harder to misuse.
|
||||||
|
self.arena
|
||||||
|
.iter_mut()
|
||||||
|
.for_each(|(_, data)| data.dependencies.sort_by_key(|dep| dep.crate_id));
|
||||||
|
|
||||||
let m = self.len();
|
let m = self.len();
|
||||||
let topo = other.crates_in_topological_order();
|
let topo = other.crates_in_topological_order();
|
||||||
let mut id_map: FxHashMap<CrateId, CrateId> = FxHashMap::default();
|
let mut id_map: FxHashMap<CrateId, CrateId> = FxHashMap::default();
|
||||||
|
|
|
@ -232,7 +232,6 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
|
||||||
#[test]
|
#[test]
|
||||||
fn crate_graph_dedup_identical() {
|
fn crate_graph_dedup_identical() {
|
||||||
let (mut crate_graph, proc_macros) = load_cargo("regex-metadata.json");
|
let (mut crate_graph, proc_macros) = load_cargo("regex-metadata.json");
|
||||||
crate_graph.sort_deps();
|
|
||||||
|
|
||||||
let (d_crate_graph, mut d_proc_macros) = (crate_graph.clone(), proc_macros.clone());
|
let (d_crate_graph, mut d_proc_macros) = (crate_graph.clone(), proc_macros.clone());
|
||||||
|
|
||||||
|
@ -253,7 +252,6 @@ fn crate_graph_dedup() {
|
||||||
let (regex_crate_graph, mut regex_proc_macros) = to_crate_graph(regex_workspace, &mut file_map);
|
let (regex_crate_graph, mut regex_proc_macros) = to_crate_graph(regex_workspace, &mut file_map);
|
||||||
assert_eq!(regex_crate_graph.iter().count(), 50);
|
assert_eq!(regex_crate_graph.iter().count(), 50);
|
||||||
|
|
||||||
crate_graph.sort_deps();
|
|
||||||
crate_graph.extend(regex_crate_graph, &mut regex_proc_macros);
|
crate_graph.extend(regex_crate_graph, &mut regex_proc_macros);
|
||||||
assert_eq!(crate_graph.iter().count(), 108);
|
assert_eq!(crate_graph.iter().count(), 108);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue