refactor(macros): complete non-authoritative scanning#10
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2159e8bfc5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| fn visit_expr_if_mut(&mut self, expr: &mut syn::ExprIf) { | ||
| if let syn::Expr::Let(expr_let) = &mut *expr.cond { | ||
| self.visit_expr_mut(&mut expr_let.expr); | ||
| self.push_scope(); | ||
| self.insert_bindings_from_pat(&expr_let.pat); |
There was a problem hiding this comment.
Track bindings in let-chain validator conditions
Handle-only logic for Expr::Let conditions misses let-chains such as if let Some(name) = ... && name == ... (and similarly for while). In those cases, the pattern binding from the left side is never recorded as shadowing before the right side is traversed, so visit_expr_path_mut can incorrectly rewrite that local binding to an injected machine-field identifier. This causes valid validator bodies to fail to compile or behave differently whenever a let-chain binding name overlaps a machine field name.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This PR completes the “non-authoritative scanning” refactor by moving Statum’s semantic authority for state/machine/transition/validator relationships onto generated contracts (from attributed-item AST + generated support items), leaving registries/source scanning primarily for diagnostics. It also expands the trybuild matrix and updates docs/examples to reflect the remaining nested-macro validator-field limitation.
Changes:
- Add hidden, contract-driven support surfaces for validators/state-family/transition resolution (generated macros + traits) and route validator method emission through a hidden proc-macro support path.
- Refresh/expand trybuild UI coverage with new “contract” tests and updated expected diagnostics.
- Update docs/README/examples to document and work around nested-macro token-tree limitations for injected machine-field bindings.
Reviewed changes
Copilot reviewed 168 out of 169 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| statum/src/lib.rs | Re-export hidden proc-macro support entry used by generated validator support. |
| statum-macros/tests/ui/valid_visibility_and_reconstruction.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_via_macro_state.rs | New UI test for validators when #[state] is produced via macro_rules!. |
| statum-macros/tests/ui/valid_validators_sync.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_result_aliases.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_hygienic_locals.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_generic_payload.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_diagnostic_returns.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_validators_async.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_transition_nested_wrappers.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_transition_map.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_transition_include.rs | UI test harness + pass case for include-driven transition fragments. |
| statum-macros/tests/ui/valid_transition_branch.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_state_with_data.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_state_unit_only.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_state_named_fields.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_state_family_support_via_macro.rs | New UI test asserting #[state] emits state-family visitor/contract surface (macro_rules!-defined enum). |
| statum-macros/tests/ui/valid_state_family_support_via_include.rs | New UI test asserting state-family contract works for include!-generated state items. |
| statum-macros/tests/ui/valid_state_family_support.rs | New UI test asserting #[state] emits state-family contract metadata & marker traits. |
| statum-macros/tests/ui/valid_same_names_different_modules.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_presentation_typed_metadata.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_presentation_sugar.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_multiple_machines_same_module.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_matrix.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_validator_contract.rs | New UI test asserting machine-emitted validator contract macro shape. |
| statum-macros/tests/ui/valid_machine_supported_derives.rs | New UI test validating derive propagation/compatibility across generated surfaces. |
| statum-macros/tests/ui/valid_machine_state_surface.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_no_fields.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_introspection_cfg_dedup.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_introspection.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_field_module_paths.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_field_aliases_renamed_import.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_field_aliases_local_validators.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_field_aliases_batch.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_field_aliases.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_extra_generics.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_machine_borrowed_data.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_into_machines_by.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_helper_trait_visibility.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_cfg_hidden_duplicate_state_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_builder_overwrite.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/valid_advanced_traits.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/support/generated_state_family_item.rs | New support file used by include-driven state-family contract UI test. |
| statum-macros/tests/ui/invalid_validators_wrong_signature.stderr | Updated expected diagnostics for validator signature errors. |
| statum-macros/tests/ui/invalid_validators_wrong_signature.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_wrong_return.stderr | Updated expected diagnostics for validator return-shape/type mismatch (now compiler-driven). |
| statum-macros/tests/ui/invalid_validators_wrong_return.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_wrong_receiver.stderr | Updated expected diagnostics for validator receiver errors. |
| statum-macros/tests/ui/invalid_validators_wrong_receiver.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_unknown_state_method.stderr | Updated expected diagnostics for unknown/missing validator methods via authoritative contract. |
| statum-macros/tests/ui/invalid_validators_unknown_state_method.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_unknown_machine.stderr | Updated expected diagnostics for unknown machine in validators. |
| statum-macros/tests/ui/invalid_validators_unknown_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_plain_struct_machine_name.stderr | Updated expected diagnostics for non-#[machine] target in validators. |
| statum-macros/tests/ui/invalid_validators_plain_struct_machine_name.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_parameter_name_collision.stderr | Updated expected diagnostics for machine-field name collisions in validator params. |
| statum-macros/tests/ui/invalid_validators_parameter_name_collision.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_no_methods.stderr | Updated expected diagnostics when validators impl has no methods. |
| statum-macros/tests/ui/invalid_validators_no_methods.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_missing_variant.stderr | Updated expected diagnostics when a validator is missing for a state variant. |
| statum-macros/tests/ui/invalid_validators_missing_variant.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_declared_before_machine.stderr | Updated expected diagnostics for expansion-order constraint in validators. |
| statum-macros/tests/ui/invalid_validators_declared_before_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_validators_alias_wrong_payload.stderr | Updated expected diagnostics for alias payload mismatch (now compiler-driven). |
| statum-macros/tests/ui/invalid_validators_alias_wrong_payload.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_wrong_return.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_wrong_return.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_unknown_source_state.stderr | Updated expected diagnostics for unknown source state in transition impl. |
| statum-macros/tests/ui/invalid_transition_unknown_source_state.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_unknown_secondary_return_state.stderr | Updated expected diagnostics for unknown secondary return state. |
| statum-macros/tests/ui/invalid_transition_unknown_secondary_return_state.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_unknown_return_state.stderr | Updated expected diagnostics for unknown return state. |
| statum-macros/tests/ui/invalid_transition_unknown_return_state.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_unknown_machine.stderr | Updated expected diagnostics for unknown machine target in transitions. |
| statum-macros/tests/ui/invalid_transition_unknown_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_self_qualified_machine.stderr | Updated expected diagnostics for self-qualified machine path. |
| statum-macros/tests/ui/invalid_transition_self_qualified_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_plain_struct_machine_name.stderr | Updated expected diagnostics for non-#[machine] target in transitions. |
| statum-macros/tests/ui/invalid_transition_plain_struct_machine_name.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_option_alias.stderr | Updated expected diagnostics for aliased wrapper returns. |
| statum-macros/tests/ui/invalid_transition_option_alias.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_not_method.stderr | Updated expected diagnostics for non-method in transition impl. |
| statum-macros/tests/ui/invalid_transition_not_method.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_no_methods.stderr | Updated expected diagnostics for empty transition impl. |
| statum-macros/tests/ui/invalid_transition_no_methods.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_map_undeclared_edge.stderr | Updated expected diagnostics for undeclared edges in transition map. |
| statum-macros/tests/ui/invalid_transition_map_undeclared_edge.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_include_ambiguous_machine_name.stderr | Removed: no longer asserted in trybuild suite. |
| statum-macros/tests/ui/invalid_transition_foreign_same_leaf_machine.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_foreign_same_leaf_machine.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_custom_result_enum.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_custom_result_enum.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_custom_option_enum.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_custom_option_enum.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_custom_branch_same_name.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_custom_branch_same_name.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_custom_branch_enum.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_custom_branch_enum.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_transition_conditional.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_transition_conditional.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_with_generics.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_with_generics.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_tuple_variant.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_tuple_variant.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_struct_variant.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_not_enum.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_not_enum.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_named_field_payload_collision.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_named_field_payload_collision.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_empty_enum.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_empty_enum.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_cfg_variant.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_cfg_variant.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_state_cfg_payload_field.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_state_cfg_payload_field.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_presentation_unknown_key.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_presentation_unknown_key.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_presentation_metadata_without_types.stderr | Updated expected diagnostics to originate from generated authoritative macro path. |
| statum-macros/tests/ui/invalid_presentation_metadata_without_types.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_presentation_duplicate_key.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_presentation_duplicate_key.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_wrong_generic.stderr | Updated expected diagnostics for new “plain first generic” rule. |
| statum-macros/tests/ui/invalid_machine_wrong_generic.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_private_field_access.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_private_field_access.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_plain_enum_missing_state_attr.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_plain_enum_missing_state_attr.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_not_struct.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_not_struct.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_no_state_generic.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_no_state_generic.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_multiple_generics.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_missing_state_derive.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_missing_state_derive.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_generic_not_first.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_generic_not_first.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_declared_before_state.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_declared_before_state.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_machine_cfg_field.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_machine_cfg_field.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_legacy_transition_helper_trait.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_legacy_transition_helper_trait.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_legacy_superstate.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_legacy_superstate.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_legacy_state_helper_traits.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_legacy_state_helper_traits.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_legacy_machines_builder.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_legacy_machines_builder.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/ui/invalid_legacy_machine_builder.stderr | Updated expected diagnostics line numbers/format. |
| statum-macros/tests/ui/invalid_legacy_machine_builder.rs | UI test harness: re-export hidden validator-method emitter. |
| statum-macros/tests/macro_errors.rs | Trybuild suite updates: add new pass cases; remove one compile-fail case. |
| statum-macros/src/validators/signatures.rs | Refactor validator signature/return analysis toward contract-driven checks and improved messaging. |
| statum-macros/src/validators/resolution.rs | Remove validator coverage/state resolution logic from registry/scanner path (now contract-driven). |
| statum-macros/src/validators.rs | Rework validators expansion to rely on machine-emitted support macro + contract checks. |
| statum-macros/src/transition.rs | Refactor transitions to bind into machine/state contracts without loaded registry semantics. |
| statum-macros/src/state.rs | Emit state-family contract metadata (visitor + resolver macros; StateFamilyMember impls). |
| statum-macros/src/machine/validation.rs | Enforce “plain first generic parameter” for machine-state linkage to contracts. |
| statum-macros/src/machine/registry.rs | Remove now-unused unique-by-name lookup helper. |
| statum-macros/src/machine/mod.rs | Update exports for removed registry helper and transition support ident. |
| statum-macros/src/machine/metadata.rs | Remove now-unused field_names() helper. |
| statum-macros/src/machine/introspection.rs | Adjust internal identifier naming (uppercase, stable-hash formatting changes). |
| statum-macros/src/lib.rs | Add hidden proc-macro entrypoint __statum_emit_validator_methods_impl and refactor transition entry. |
| statum-examples/src/toy_demos/10-persistent-data-vecs.rs | Update example to avoid nested macro token-tree limitation by binding injected field locally. |
| statum-core/src/lib.rs | Introduce hidden StateFamily/StateFamilyMember traits and re-export via __private. |
| docs/persistence-and-validators.md | Document nested-macro limitation workaround and update example snippet accordingly. |
| docs/non-authoritative-scanning-plan.md | New design/implementation plan document for the refactor and authority boundaries. |
| README.md | Update validator docs + add explicit note about nested-macro limitation and workaround. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| #[doc(hidden)] | ||
| pub use statum_macros::__statum_emit_validator_methods_impl; |
There was a problem hiding this comment.
__statum_emit_validator_methods_impl is re-exported at the crate root. Even with #[doc(hidden)], this still expands the public namespace and can collide with user items or be relied upon accidentally. Consider re-exporting it under statum::__private (and updating the generated paths in the macros) so the internal proc-macro support surface is clearly segregated from the public API.
Summary
Why
This makes Statum substantially stronger on correctness, maintainability, and trustworthiness. The important semantic paths now fail closed from explicit generated contracts rather than non-authoritative rediscovery.
Validation
Notes