Skip to content

refactor(macros): complete non-authoritative scanning#10

Merged
eboody merged 3 commits intomainfrom
refactor/non-authoritative-scanning
Mar 25, 2026
Merged

refactor(macros): complete non-authoritative scanning#10
eboody merged 3 commits intomainfrom
refactor/non-authoritative-scanning

Conversation

@eboody
Copy link
Owner

@eboody eboody commented Mar 25, 2026

Summary

  • complete the semantic-authority refactor so state, machine, transition, and validator semantics come from attributed-item AST plus generated support items instead of scanner or registry discovery
  • move validator rebuild shape under #[machine] and emit validator methods through a hidden proc-macro support path
  • keep registry and source scanning only for diagnostics, refresh trybuild coverage, and document the remaining nested-macro validator-field limitation

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

  • cargo test -p statum-macros --test macro_errors
  • cargo test -p statum-macros
  • cargo test --workspace
  • cargo clippy --workspace --all-targets --all-features -- -D warnings
  • RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps

Notes

  • I measured clean local compile-time before and after the final validator pass and did not see a meaningful change.
  • Registry and source scanning still exist for diagnostics, but they are no longer in the semantic authority path.
  • Machine-field rebinding still does not descend into nested macro token trees such as format! and println!; the README now calls that out explicitly.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +326 to +330
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);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +398 to +399
#[doc(hidden)]
pub use statum_macros::__statum_emit_validator_methods_impl;
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

__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.

Copilot uses AI. Check for mistakes.
@eboody eboody merged commit b318ad5 into main Mar 25, 2026
11 checks passed
@eboody eboody deleted the refactor/non-authoritative-scanning branch March 25, 2026 16:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants