mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-23 00:33:12 +00:00
Add back optimizations
This commit is contained in:
parent
e15df1f414
commit
947dfdce0c
1 changed files with 8 additions and 4 deletions
|
@ -499,13 +499,18 @@ impl CrateGraph {
|
||||||
/// 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.
|
||||||
|
/// Note that for deduplication to fully work, `self`'s crate dependencies must be sorted by crate id.
|
||||||
|
/// 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(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut other: CrateGraph,
|
mut other: CrateGraph,
|
||||||
proc_macros: &mut ProcMacroPaths,
|
proc_macros: &mut ProcMacroPaths,
|
||||||
) -> FxHashMap<CrateId, CrateId> {
|
) -> FxHashMap<CrateId, CrateId> {
|
||||||
self.sort_deps();
|
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();
|
||||||
for topo in topo {
|
for topo in topo {
|
||||||
|
@ -514,9 +519,8 @@ impl CrateGraph {
|
||||||
crate_data.dependencies.iter_mut().for_each(|dep| dep.crate_id = id_map[&dep.crate_id]);
|
crate_data.dependencies.iter_mut().for_each(|dep| dep.crate_id = id_map[&dep.crate_id]);
|
||||||
crate_data.dependencies.sort_by_key(|dep| dep.crate_id);
|
crate_data.dependencies.sort_by_key(|dep| dep.crate_id);
|
||||||
|
|
||||||
let find = self.arena.iter().find(|(_, v)| *v == crate_data);
|
let find = self.arena.iter().take(m).find_map(|(k, v)| (v == crate_data).then_some(k));
|
||||||
let new_id =
|
let new_id = find.unwrap_or_else(|| self.arena.alloc(crate_data.clone()));
|
||||||
if let Some((k, _)) = find { k } else { self.arena.alloc(crate_data.clone()) };
|
|
||||||
id_map.insert(topo, new_id);
|
id_map.insert(topo, new_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue