fix various small bugs in #[salsa::input]

This commit is contained in:
Niko Matsakis 2022-08-03 00:41:22 -04:00
parent f0156cca36
commit 7e3e77d611
3 changed files with 14 additions and 12 deletions

View file

@ -78,14 +78,15 @@ impl EntityLike {
}
)
.collect();
let field_setters: Vec<syn::ImplItemMethod> = field_indices.iter().zip(&field_names).zip(&field_tys).map(|((field_index, field_name), field_ty)| {
let set_field_name = syn::Ident::new(&format!("set_{}", field_name), field_name.span());
parse_quote! {
pub fn #set_field_name<'db>(self, __db: &'db #db_dyn_ty, __value: #field_ty)
pub fn #set_field_name<'db>(self, __db: &'db mut #db_dyn_ty, __value: #field_ty)
{
let (__jar, __runtime) = <_ as salsa::storage::HasJar<#jar_ty>>::jar(__db);
let __ingredients = <#jar_ty as salsa::storage::HasIngredientsFor< #ident >>::ingredient(__jar);
__ingredients.#field_index.set(__db, self).clone()
let (__jar, __runtime) = <_ as salsa::storage::HasJar<#jar_ty>>::jar_mut(__db);
let __ingredients = <#jar_ty as salsa::storage::HasIngredientsFor< #ident >>::ingredient_mut(__jar);
__ingredients.#field_index.store(__runtime, self, __value, salsa::Durability::LOW);
}
}
})
@ -99,7 +100,7 @@ impl EntityLike {
let __ingredients = <#jar_ty as salsa::storage::HasIngredientsFor< #ident >>::ingredient_mut(__jar);
let __id = __ingredients.#input_index.new_input(__runtime);
#(
__ingredients.#field_indices.store(__db, __id, #field_names, salsa::Durability::LOW);
__ingredients.#field_indices.store(__runtime, __id, #field_names, salsa::Durability::LOW);
)*
__id
}
@ -152,19 +153,14 @@ impl EntityLike {
},
)*
{
let index = ingredients.push_mut(
let index = ingredients.push(
|jars| {
let jar = <DB as salsa::storage::JarFromJars<Self::Jar>>::jar_from_jars(jars);
let ingredients = <_ as salsa::storage::HasIngredientsFor<Self>>::ingredient(jar);
&ingredients.#input_index
},
|jars| {
let jar = <DB as salsa::storage::JarFromJars<Self::Jar>>::jar_from_jars_mut(jars);
let ingredients = <_ as salsa::storage::HasIngredientsFor<Self>>::ingredient_mut(jar);
&mut ingredients.#input_index
},
);
salsa::entity::EntityIngredient::new(index)
salsa::input::InputIngredient::new(index)
},
)
}

View file

@ -63,6 +63,11 @@ pub fn interned(args: TokenStream, input: TokenStream) -> TokenStream {
interned::interned(args, input)
}
#[proc_macro_attribute]
pub fn input(args: TokenStream, input: TokenStream) -> TokenStream {
input::input(args, input)
}
#[proc_macro_attribute]
pub fn component(args: TokenStream, input: TokenStream) -> TokenStream {
component::component(args, input)

View file

@ -45,6 +45,7 @@ pub use salsa_entity_macros::accumulator;
pub use salsa_entity_macros::component;
pub use salsa_entity_macros::db;
pub use salsa_entity_macros::entity;
pub use salsa_entity_macros::input;
pub use salsa_entity_macros::interned;
pub use salsa_entity_macros::jar;
pub use salsa_entity_macros::memoized;