mirror of
https://github.com/salsa-rs/salsa.git
synced 2025-01-16 10:12:02 +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> |
||
---|---|---|
.. | ||
compile-fail | ||
parallel | ||
warnings | ||
accumulate-from-tracked-fn.rs | ||
accumulate-reuse-workaround.rs | ||
accumulate-reuse.rs | ||
accumulate.rs | ||
compile_fail.rs | ||
cycles.rs | ||
debug.rs | ||
deletion-cascade.rs | ||
deletion.rs | ||
expect_reuse_field_x_of_a_tracked_struct_changes_but_fn_depends_on_field_y.rs | ||
expect_reuse_field_x_of_an_input_changes_but_fn_depends_on_field_y.rs | ||
hello_world.rs | ||
input_with_ids.rs | ||
lru.rs | ||
mutate_in_place.rs | ||
override_new_get_set.rs | ||
panic-when-reading-fields-of-tracked-structs-from-older-revisions.rs | ||
singleton.rs | ||
specify-only-works-if-the-key-is-created-in-the-current-query.rs | ||
specify_tracked_fn_in_rev_1_but_not_2.rs | ||
tracked_fn_constant.rs | ||
tracked_fn_on_input.rs | ||
tracked_fn_on_tracked.rs | ||
tracked_fn_on_tracked_specify.rs | ||
tracked_fn_read_own_entity.rs | ||
tracked_fn_read_own_specify.rs | ||
tracked_method.rs |