diff --git a/src/green/token.rs b/src/green/token.rs index 81e298c..18e1434 100644 --- a/src/green/token.rs +++ b/src/green/token.rs @@ -1,6 +1,7 @@ use std::{ borrow::Borrow, fmt, + hash::{Hash, Hasher}, mem::{self, ManuallyDrop}, ops, ptr, }; @@ -21,6 +22,7 @@ struct GreenTokenHead { type Repr = HeaderSlice; type ReprThin = HeaderSlice; +#[derive(Eq)] #[repr(transparent)] pub struct GreenTokenData { data: ReprThin, @@ -32,6 +34,12 @@ impl PartialEq for GreenTokenData { } } +impl Hash for GreenTokenData { + fn hash(&self, state: &mut H) { + (*self.data).hash(state); + } +} + /// Leaf node in the immutable tree. #[derive(PartialEq, Eq, Hash, Clone)] #[repr(transparent)] @@ -141,3 +149,18 @@ impl ops::Deref for GreenToken { } } } + +#[cfg(test)] +mod tests { + use std::hash::{BuildHasher, RandomState}; + + use super::*; + + #[test] + fn hash_borrow() { + let owned = GreenToken::new(SyntaxKind(42), "foobar"); + let borrowed: &GreenTokenData = owned.borrow(); + let s = RandomState::new(); + assert_eq!(s.hash_one(&owned), s.hash_one(borrowed)); + } +}