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.rs97
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,