3 use ide_db::base_db::salsa::Durability;
4 use ide_db::base_db::{CrateGraph, SourceDatabase};
5 use ide_db::RootDatabase;
6 use rustc_hash::FxHashMap;
8 // Feature: Shuffle Crate Graph
10 // Randomizes all crate IDs in the crate graph, for debugging.
13 // | Editor | Action Name
15 // | VS Code | **Rust Analyzer: Shuffle Crate Graph**
17 pub(crate) fn shuffle_crate_graph(db: &mut RootDatabase) {
18 let crate_graph = db.crate_graph();
20 let mut shuffled_ids = crate_graph.iter().collect::<Vec<_>>();
21 shuffle(&mut shuffled_ids);
23 let mut new_graph = CrateGraph::default();
25 let mut map = FxHashMap::default();
26 for old_id in shuffled_ids.iter().copied() {
27 let data = &crate_graph[old_id];
28 let new_id = new_graph.add_crate_root(
31 data.display_name.clone(),
33 data.cfg_options.clone(),
34 data.potential_cfg_options.clone(),
36 data.proc_macro.clone(),
39 map.insert(old_id, new_id);
42 for old_id in shuffled_ids.iter().copied() {
43 let data = &crate_graph[old_id];
44 for dep in &data.dependencies {
45 let mut new_dep = dep.clone();
46 new_dep.crate_id = map[&dep.crate_id];
47 new_graph.add_dep(map[&old_id], new_dep).unwrap();
51 db.set_crate_graph_with_durability(Arc::new(new_graph), Durability::HIGH);
54 fn shuffle<T>(slice: &mut [T]) {
55 let mut rng = oorandom::Rand32::new(seed());
57 let mut remaining = slice.len() - 1;
59 let index = rng.rand_range(0..remaining as u32);
60 slice.swap(remaining, index as usize);
66 use std::collections::hash_map::RandomState;
67 use std::hash::{BuildHasher, Hasher};
69 RandomState::new().build_hasher().finish()