4 base_db::{salsa::Durability, CrateGraph, SourceDatabase},
5 FxHashMap, RootDatabase,
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(),
40 map.insert(old_id, new_id);
43 for old_id in shuffled_ids.iter().copied() {
44 let data = &crate_graph[old_id];
45 for dep in &data.dependencies {
46 let mut new_dep = dep.clone();
47 new_dep.crate_id = map[&dep.crate_id];
48 new_graph.add_dep(map[&old_id], new_dep).unwrap();
52 db.set_crate_graph_with_durability(Arc::new(new_graph), Durability::HIGH);
55 fn shuffle<T>(slice: &mut [T]) {
56 let mut rng = oorandom::Rand32::new(seed());
58 let mut remaining = slice.len() - 1;
60 let index = rng.rand_range(0..remaining as u32);
61 slice.swap(remaining, index as usize);
67 use std::collections::hash_map::RandomState;
68 use std::hash::{BuildHasher, Hasher};
70 RandomState::new().build_hasher().finish()