Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/span/src/hygiene.rs')
| -rw-r--r-- | crates/span/src/hygiene.rs | 97 |
1 files changed, 73 insertions, 24 deletions
diff --git a/crates/span/src/hygiene.rs b/crates/span/src/hygiene.rs index aef3fbf051..6c363825aa 100644 --- a/crates/span/src/hygiene.rs +++ b/crates/span/src/hygiene.rs @@ -67,6 +67,16 @@ const _: () = { self.parent.hash(state); } } + + impl zalsa_::HasJar for SyntaxContext { + type Jar = zalsa_struct_::JarImpl<SyntaxContext>; + const KIND: zalsa_::JarKind = zalsa_::JarKind::Struct; + } + + zalsa_::register_jar! { + zalsa_::ErasedJar::erase::<SyntaxContext>() + } + /// Key to use during hash lookups. Each field is some type that implements `Lookup<T>` /// for the owned type. This permits interning with an `&str` when a `String` is required and so forth. #[derive(Hash)] @@ -98,21 +108,38 @@ const _: () = { salsa::plumbing::Location { file: file!(), line: line!() }; const DEBUG_NAME: &'static str = "SyntaxContextData"; const REVISIONS: std::num::NonZeroUsize = std::num::NonZeroUsize::MAX; + const PERSIST: bool = false; + type Fields<'a> = SyntaxContextData; type Struct<'a> = SyntaxContext; - } - impl SyntaxContext { - pub fn ingredient<Db>(db: &Db) -> &zalsa_struct_::IngredientImpl<Self> + + fn serialize<S>(_: &Self::Fields<'_>, _: S) -> Result<S::Ok, S::Error> where - Db: ?Sized + zalsa_::Database, + S: zalsa_::serde::Serializer, + { + unimplemented!("attempted to serialize value that set `PERSIST` to false") + } + + fn deserialize<'de, D>(_: D) -> Result<Self::Fields<'static>, D::Error> + where + D: zalsa_::serde::Deserializer<'de>, { + unimplemented!("attempted to deserialize value that cannot set `PERSIST` to false"); + } + } + + impl SyntaxContext { + pub fn ingredient(zalsa: &zalsa_::Zalsa) -> &zalsa_struct_::IngredientImpl<Self> { static CACHE: zalsa_::IngredientCache<zalsa_struct_::IngredientImpl<SyntaxContext>> = zalsa_::IngredientCache::new(); - CACHE.get_or_create(db.zalsa(), || { - db.zalsa() - .lookup_jar_by_type::<zalsa_struct_::JarImpl<SyntaxContext>>() - .get_or_create() - }) + + // SAFETY: `lookup_jar_by_type` returns a valid ingredient index, and the only + // ingredient created by our jar is the struct ingredient. + unsafe { + CACHE.get_or_create(zalsa, || { + zalsa.lookup_jar_by_type::<zalsa_struct_::JarImpl<SyntaxContext>>() + }) + } } } impl zalsa_::AsId for SyntaxContext { @@ -132,13 +159,14 @@ const _: () = { impl zalsa_::SalsaStructInDb for SyntaxContext { type MemoIngredientMap = salsa::plumbing::MemoIngredientSingletonIndex; - fn lookup_or_create_ingredient_index( - zalsa: &salsa::plumbing::Zalsa, - ) -> salsa::plumbing::IngredientIndices { - zalsa - .lookup_jar_by_type::<zalsa_struct_::JarImpl<SyntaxContext>>() - .get_or_create() - .into() + fn lookup_ingredient_index(aux: &zalsa_::Zalsa) -> salsa::plumbing::IngredientIndices { + aux.lookup_jar_by_type::<zalsa_struct_::JarImpl<SyntaxContext>>().into() + } + + fn entries(zalsa: &zalsa_::Zalsa) -> impl Iterator<Item = zalsa_::DatabaseKeyIndex> + '_ { + let _ingredient_index = + zalsa.lookup_jar_by_type::<zalsa_struct_::JarImpl<SyntaxContext>>(); + <SyntaxContext>::ingredient(zalsa).entries(zalsa).map(|entry| entry.key()) } #[inline] @@ -149,6 +177,18 @@ const _: () = { None } } + + #[inline] + unsafe fn memo_table( + zalsa: &zalsa_::Zalsa, + id: zalsa_::Id, + current_revision: zalsa_::Revision, + ) -> zalsa_::MemoTableWithTypes<'_> { + // SAFETY: Guaranteed by caller. + unsafe { + zalsa.table().memos::<zalsa_struct_::Value<SyntaxContext>>(id, current_revision) + } + } } unsafe impl salsa::plumbing::Update for SyntaxContext { @@ -184,8 +224,11 @@ const _: () = { Edition: zalsa_::interned::HashEqLike<T2>, SyntaxContext: zalsa_::interned::HashEqLike<T3>, { - SyntaxContext::ingredient(db).intern( - db.as_dyn_database(), + let (zalsa, zalsa_local) = db.zalsas(); + + SyntaxContext::ingredient(zalsa).intern( + zalsa, + zalsa_local, StructKey::<'db>( outer_expn, outer_transparency, @@ -216,7 +259,8 @@ const _: () = { Db: ?Sized + zalsa_::Database, { let id = self.as_salsa_id()?; - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.outer_expn } @@ -225,7 +269,8 @@ const _: () = { Db: ?Sized + zalsa_::Database, { let Some(id) = self.as_salsa_id() else { return Transparency::Opaque }; - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.outer_transparency } @@ -235,7 +280,8 @@ const _: () = { { match self.as_salsa_id() { Some(id) => { - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.edition } None => Edition::from_u32(SyntaxContext::MAX_ID - self.into_u32()), @@ -248,7 +294,8 @@ const _: () = { { match self.as_salsa_id() { Some(id) => { - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.parent } None => self, @@ -262,7 +309,8 @@ const _: () = { { match self.as_salsa_id() { Some(id) => { - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.opaque } None => self, @@ -276,7 +324,8 @@ const _: () = { { match self.as_salsa_id() { Some(id) => { - let fields = SyntaxContext::ingredient(db).data(db.as_dyn_database(), id); + let zalsa = db.zalsa(); + let fields = SyntaxContext::ingredient(zalsa).data(zalsa, id); fields.opaque_and_semitransparent } None => self, |