Skip to content

Migrate statement-position Vec<Expression> to Vec<ExpressionStatement> (BT-974)#1009

Merged
jamesc merged 1 commit intomainfrom
worktree-BT-974
Feb 28, 2026
Merged

Migrate statement-position Vec<Expression> to Vec<ExpressionStatement> (BT-974)#1009
jamesc merged 1 commit intomainfrom
worktree-BT-974

Conversation

@jamesc
Copy link
Owner

@jamesc jamesc commented Feb 28, 2026

Summary

Phase 1, Issue 2 of ADR 0044 (Comments as First-Class AST Nodes). Pure mechanical type migration — no behavior changes.

  • Changed 3 statement-position fields (Module.expressions, MethodDefinition.body, Block.body) from Vec<Expression> to Vec<ExpressionStatement>
  • Renamed Module.leading_comments to Module.file_leading_comments
  • Updated all consumers: parser wraps with ExpressionStatement::bare(), codegen/lint/semantic/LSP unwrap via .expression
  • 44 Rust files updated, 65 parser snapshots regenerated

Linear: https://linear.app/beamtalk/issue/BT-974

Test plan

  • just ci passes (build, clippy, fmt-check, test, test-e2e)
  • All 65 parser snapshots regenerated and verified
  • Compiled output identical to before (no behavior changes)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Refactor
    • Updated internal AST structures and traversal logic across compiler modules to enhance statement-level comment handling. No changes to user-visible functionality or compiler behavior.

…tement> (BT-974)

Phase 1, Issue 2 of ADR 0044 (Comments as First-Class AST Nodes).

- Change Module.expressions, MethodDefinition.body, Block.body from
  Vec<Expression> to Vec<ExpressionStatement>
- Rename Module.leading_comments to Module.file_leading_comments
- Update parser to wrap with ExpressionStatement::bare()
- Update all codegen, lint, semantic, LSP, and query consumers
- Regenerate 65 parser snapshots

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Feb 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 9363816 and 0d0dd9b.

⛔ Files ignored due to path filters (65)
  • test-package-compiler/tests/snapshots/compiler_tests__abstract_class_spawn_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__actor_spawn_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__actor_spawn_with_args_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__actor_state_mutation_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__async_keyword_message_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__async_unary_message_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__async_with_await_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__binary_operators_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__blocks_no_args_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__boundary_deeply_nested_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__boundary_long_identifiers_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__boundary_mixed_errors_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__boundary_unicode_identifiers_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__cascade_complex_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__cascades_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__character_literals_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__class_definition_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__class_methods_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__comment_handling_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__control_flow_mutations_errors_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__control_flow_mutations_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__empty_blocks_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__empty_method_body_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__error_message_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__error_recovery_invalid_syntax_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__error_recovery_malformed_message_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__error_recovery_unterminated_string_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__expect_directive_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__future_pattern_matching_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__future_string_interpolation_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__hello_world_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__intrinsic_keyword_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__map_literals_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__method_lookup_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__multi_keyword_complex_args_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__nested_blocks_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__nested_keyword_messages_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__sealed_class_violation_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__sealed_method_override_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__stdlib_class_dictionary_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__stdlib_class_list_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__stdlib_class_set_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__stdlib_class_tuple_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__string_operations_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__typed_class_warnings_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__typed_methods_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__typed_value_type_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__unary_operators_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__unicode_string_literals_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__value_type_multi_expr_method_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__value_type_param_collision_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__while_true_simple_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__whitespace_handling_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__workspace_binding_cascade_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__workspace_binding_send_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_array_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_block_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_boolean_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_dictionary_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_integer_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_list_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_nil_object_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_nil_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_set_parser.snap is excluded by !**/*.snap
  • test-package-compiler/tests/snapshots/compiler_tests__ws_stdlib_string_parser.snap is excluded by !**/*.snap
📒 Files selected for processing (44)
  • crates/beamtalk-cli/src/commands/test_stdlib.rs
  • crates/beamtalk-compiler-port/src/main.rs
  • crates/beamtalk-core/src/ast.rs
  • crates/beamtalk-core/src/ast_walker.rs
  • crates/beamtalk-core/src/codegen/core_erlang/actor_codegen.rs
  • crates/beamtalk-core/src/codegen/core_erlang/block_analysis.rs
  • crates/beamtalk-core/src/codegen/core_erlang/control_flow/conditionals.rs
  • crates/beamtalk-core/src/codegen/core_erlang/control_flow/counted_loops.rs
  • crates/beamtalk-core/src/codegen/core_erlang/control_flow/exception_handling.rs
  • crates/beamtalk-core/src/codegen/core_erlang/control_flow/list_ops.rs
  • crates/beamtalk-core/src/codegen/core_erlang/control_flow/while_loops.rs
  • crates/beamtalk-core/src/codegen/core_erlang/dispatch_codegen.rs
  • crates/beamtalk-core/src/codegen/core_erlang/expressions.rs
  • crates/beamtalk-core/src/codegen/core_erlang/gen_server/dispatch.rs
  • crates/beamtalk-core/src/codegen/core_erlang/gen_server/methods.rs
  • crates/beamtalk-core/src/codegen/core_erlang/gen_server/state.rs
  • crates/beamtalk-core/src/codegen/core_erlang/intrinsics.rs
  • crates/beamtalk-core/src/codegen/core_erlang/primitive_bindings.rs
  • crates/beamtalk-core/src/codegen/core_erlang/tests.rs
  • crates/beamtalk-core/src/codegen/core_erlang/value_type_codegen.rs
  • crates/beamtalk-core/src/codegen/property_tests.rs
  • crates/beamtalk-core/src/language_service/mod.rs
  • crates/beamtalk-core/src/lint/cascade_candidate.rs
  • crates/beamtalk-core/src/lint/shadowed_block_param.rs
  • crates/beamtalk-core/src/lint/trailing_caret.rs
  • crates/beamtalk-core/src/lint/unnecessary_parens.rs
  • crates/beamtalk-core/src/queries/completion_provider.rs
  • crates/beamtalk-core/src/queries/definition_provider.rs
  • crates/beamtalk-core/src/queries/diagnostic_provider.rs
  • crates/beamtalk-core/src/queries/hover_provider.rs
  • crates/beamtalk-core/src/queries/references_provider.rs
  • crates/beamtalk-core/src/queries/signature_help_provider.rs
  • crates/beamtalk-core/src/semantic_analysis/block_analyzer.rs
  • crates/beamtalk-core/src/semantic_analysis/class_hierarchy/mod.rs
  • crates/beamtalk-core/src/semantic_analysis/method_validators.rs
  • crates/beamtalk-core/src/semantic_analysis/mod.rs
  • crates/beamtalk-core/src/semantic_analysis/name_resolver.rs
  • crates/beamtalk-core/src/semantic_analysis/primitive_validator.rs
  • crates/beamtalk-core/src/semantic_analysis/type_checker.rs
  • crates/beamtalk-core/src/semantic_analysis/validators.rs
  • crates/beamtalk-core/src/source_analysis/parser/declarations.rs
  • crates/beamtalk-core/src/source_analysis/parser/expressions.rs
  • crates/beamtalk-core/src/source_analysis/parser/mod.rs
  • crates/beamtalk-core/src/source_analysis/parser/property_tests.rs

📝 Walkthrough

Walkthrough

This PR introduces a new ExpressionStatement wrapper type to the AST that attaches comments around expressions at statement positions. All statement-level expressions in modules, blocks, and methods are migrated from Vec<Expression> to Vec<ExpressionStatement>, with consistent propagation throughout codegen, semantic analysis, queries, and linting.

Changes

Cohort / File(s) Summary
AST Core Types
crates/beamtalk-core/src/ast.rs, crates/beamtalk-core/src/source_analysis/parser/mod.rs
Introduces ExpressionStatement struct with comments and expression fields. Updates Module.expressions, Block.body, and MethodDefinition.body to store Vec<ExpressionStatement> instead of Vec<Expression>. Renames Module.leading_comments to file_leading_comments.
Parser Integration
crates/beamtalk-core/src/source_analysis/parser/expressions.rs, crates/beamtalk-core/src/source_analysis/parser/declarations.rs, crates/beamtalk-core/src/source_analysis/parser/property_tests.rs
Updates parsing to wrap expressions in ExpressionStatement::bare() when constructing blocks, method bodies, and module statements. Adjusts span calculations to access inner expression via .expression.
AST Traversal
crates/beamtalk-core/src/ast_walker.rs
Updates for_each_expr_seq signature to accept &[ExpressionStatement] instead of &[Expression]. Modifies traversal to iterate statements and access stmt.expression.
Core Erlang Codegen
crates/beamtalk-core/src/codegen/core_erlang/actor_codegen.rs, crates/beamtalk-core/src/codegen/core_erlang/block_analysis.rs, crates/beamtalk-core/src/codegen/core_erlang/expressions.rs, crates/beamtalk-core/src/codegen/core_erlang/intrinsics.rs, crates/beamtalk-core/src/codegen/core_erlang/primitive_bindings.rs, crates/beamtalk-core/src/codegen/core_erlang/value_type_codegen.rs, crates/beamtalk-core/src/codegen/core_erlang/dispatch_codegen.rs
Updates block/method body iteration to access inner expressions via .expression. Adjusts pattern matching and filtering to operate on statement expressions rather than raw expressions.
Control Flow Codegen
crates/beamtalk-core/src/codegen/core_erlang/control_flow/conditionals.rs, crates/beamtalk-core/src/codegen/core_erlang/control_flow/counted_loops.rs, crates/beamtalk-core/src/codegen/core_erlang/control_flow/exception_handling.rs, crates/beamtalk-core/src/codegen/core_erlang/control_flow/list_ops.rs, crates/beamtalk-core/src/codegen/core_erlang/control_flow/while_loops.rs
Refactors body iteration patterns from direct expression access to statement-based traversal with .expression field access.
Gen Server Codegen
crates/beamtalk-core/src/codegen/core_erlang/gen_server/dispatch.rs, crates/beamtalk-core/src/codegen/core_erlang/gen_server/methods.rs, crates/beamtalk-core/src/codegen/core_erlang/gen_server/state.rs
Updates dispatch generation, method body processing, and state initialization to iterate statements and extract expressions via .expression. Modifies is_self_error_body signature to accept &[ExpressionStatement].
Semantic Analysis
crates/beamtalk-core/src/semantic_analysis/mod.rs, crates/beamtalk-core/src/semantic_analysis/block_analyzer.rs, crates/beamtalk-core/src/semantic_analysis/name_resolver.rs, crates/beamtalk-core/src/semantic_analysis/primitive_validator.rs, crates/beamtalk-core/src/semantic_analysis/type_checker.rs, crates/beamtalk-core/src/semantic_analysis/validators.rs, crates/beamtalk-core/src/semantic_analysis/method_validators.rs
Migrates analysis loops to iterate statements and operate on stmt.expression. Updates resolve_body signature to accept &[ExpressionStatement]. Adjusts type inference, validation, and capture analysis to use statement-wrapped expressions.
Class Hierarchy
crates/beamtalk-core/src/semantic_analysis/class_hierarchy/mod.rs
Updates test fixtures and analysis to use Module.file_leading_comments instead of leading_comments.
Query Providers
crates/beamtalk-core/src/queries/completion_provider.rs, crates/beamtalk-core/src/queries/definition_provider.rs, crates/beamtalk-core/src/queries/diagnostic_provider.rs, crates/beamtalk-core/src/queries/hover_provider.rs, crates/beamtalk-core/src/queries/references_provider.rs, crates/beamtalk-core/src/queries/signature_help_provider.rs
Refactors traversal across all providers to iterate statements and pass stmt.expression to analysis functions. Updates span calculations and identifier/selector lookups to operate on statement expressions.
Language Service
crates/beamtalk-core/src/language_service/mod.rs
Updates goto-definition and reference resolution to iterate module/block/method expressions as statements and access inner expressions.
Linting
crates/beamtalk-core/src/lint/cascade_candidate.rs, crates/beamtalk-core/src/lint/shadowed_block_param.rs, crates/beamtalk-core/src/lint/trailing_caret.rs, crates/beamtalk-core/src/lint/unnecessary_parens.rs
Updates lint checks to iterate statement sequences and validate inner expressions. Adjusts span calculations to use expression spans.
CLI & Compiler
crates/beamtalk-cli/src/commands/test_stdlib.rs, crates/beamtalk-compiler-port/src/main.rs
Modifies generate_test_expression and generate_repl_expressions calls to pass inner expression strings (via .expression or mapped from module expressions).
Property Tests
crates/beamtalk-core/src/codegen/property_tests.rs
Updates proptest cases to pass &expr.expression to generate_repl_expression.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and accurately describes the main change: migration of three AST fields from Vec to Vec, with the ticket reference (BT-974) indicating the tracked work.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch worktree-BT-974

Comment @coderabbitai help to get the list of available commands and usage tips.

@jamesc jamesc merged commit afab809 into main Feb 28, 2026
5 checks passed
@jamesc jamesc deleted the worktree-BT-974 branch February 28, 2026 17:22
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.

1 participant