|  | #![allow(rustc::symbol_intern_string_literal)] | 
|  |  | 
|  | use rustc_hashes::Hash64; | 
|  | use rustc_span::def_id::{DefPathHash, StableCrateId}; | 
|  | use rustc_span::edition::Edition; | 
|  | use rustc_span::{Symbol, create_session_globals_then}; | 
|  |  | 
|  | use crate::definitions::{DefKey, DefPathData, DisambiguatedDefPathData}; | 
|  |  | 
|  | #[test] | 
|  | fn def_path_hash_depends_on_crate_id() { | 
|  | // This test makes sure that *both* halves of a DefPathHash depend on | 
|  | // the crate-id of the defining crate. This is a desirable property | 
|  | // because the crate-id can be more easily changed than the DefPath | 
|  | // of an item, so, in the case of a crate-local DefPathHash collision, | 
|  | // the user can simply "roll the dice again" for all DefPathHashes in | 
|  | // the crate by changing the crate disambiguator (e.g. via bumping the | 
|  | // crate's version number). | 
|  |  | 
|  | create_session_globals_then(Edition::Edition2024, &[], None, || { | 
|  | let id0 = StableCrateId::new(Symbol::intern("foo"), false, vec!["1".to_string()], ""); | 
|  | let id1 = StableCrateId::new(Symbol::intern("foo"), false, vec!["2".to_string()], ""); | 
|  |  | 
|  | let h0 = mk_test_hash(id0); | 
|  | let h1 = mk_test_hash(id1); | 
|  |  | 
|  | assert_ne!(h0.stable_crate_id(), h1.stable_crate_id()); | 
|  | assert_ne!(h0.local_hash(), h1.local_hash()); | 
|  |  | 
|  | fn mk_test_hash(stable_crate_id: StableCrateId) -> DefPathHash { | 
|  | let parent_hash = | 
|  | DefPathHash::new(stable_crate_id, Hash64::new(stable_crate_id.as_u64())); | 
|  |  | 
|  | let key = DefKey { | 
|  | parent: None, | 
|  | disambiguated_data: DisambiguatedDefPathData { | 
|  | data: DefPathData::CrateRoot, | 
|  | disambiguator: 0, | 
|  | }, | 
|  | }; | 
|  |  | 
|  | key.compute_stable_hash(parent_hash) | 
|  | } | 
|  | }) | 
|  | } |