mirror of
https://github.com/salsa-rs/salsa.git
synced 2025-01-15 01:39:25 +00:00
252d21e358
423: salsa 2022: fix input macro set_* being off by one if id field present r=XFFXFF a=jhgg This PR fixes an issue with code generation for `#[salsa::input]` struct's `set_` methods. Consider the following code: ```rust #[salsa::input(jar = Jar)] struct BuggedInput { #[id] id: u32, other: String, } ``` This will expand to: ```rust #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Debug)] struct BuggedInput(salsa::Id); impl BuggedInput { // snip... fn set_other<'db>( self, __db: &'db mut <Jar as salsa:🫙:Jar<'_>>::DynDb, ) -> salsa::setter::Setter<'db, BuggedInput, u32> { // ^^^ wrong type (should be `String`) let (__jar, __runtime) = <_ as salsa::storage::HasJar<Jar>>::jar_mut(__db); let __ingredients = <Jar as salsa::storage::HasIngredientsFor<BuggedInput>>::ingredient_mut(__jar); salsa::setter::Setter::new(__runtime, self, &mut __ingredients.0) // ^ wrong index (should be `1`) } } ``` Here we can see that the generated `set_other` impl is improperly setting the `id` field. This bug is caused because the filtering of the id fields in `InputStruct::all_set_field_names` causes a mismatch in `InputStruct::input_inherent_impl` when zipped with the field indices and types. This PR changes `all_set_field_names` to return an `Option<&syn::Ident>` where the None is provided when a setter should not be generated, thus not causing index mismatches because no filtering occurs. Instead, we filter inside of `input_inherent_impl` after all the zips have been applied to the iterator. After this PR, the code generated is now correct: ```rust #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Debug)] struct BuggedInput(salsa::Id); impl BuggedInput { // snip... fn set_other<'db>( self, __db: &'db mut <Jar as salsa:🫙:Jar<'_>>::DynDb, ) -> salsa::setter::Setter<'db, BuggedInput, String> { let (__jar, __runtime) = <_ as salsa::storage::HasJar<Jar>>::jar_mut(__db); let __ingredients = <Jar as salsa::storage::HasIngredientsFor<BuggedInput>>::ingredient_mut(__jar); salsa::setter::Setter::new(__runtime, self, &mut __ingredients.1) } } ``` Co-authored-by: Jake Heinz <jh@discordapp.com> |
||
---|---|---|
.. | ||
src | ||
tests | ||
Cargo.toml |