Skip to content

baml_fmt: basically a formatter#3111

Merged
2kai2kai2 merged 36 commits into
canaryfrom
kai/baml_fmt
Feb 18, 2026
Merged

baml_fmt: basically a formatter#3111
2kai2kai2 merged 36 commits into
canaryfrom
kai/baml_fmt

Conversation

@2kai2kai2

@2kai2kai2 2kai2kai2 commented Feb 12, 2026

Copy link
Copy Markdown
Collaborator

Core formatter (crates/baml_fmt/, ~7,900 lines):

  • lib.rs — Public API: format(source, options) -> Result<String, FormatterError>. Refuses to format files with parse errors.
  • trivia_classifier.rs — Single forward pass over the CST that tags each comment and blank line as leading, trailing, or before-EOF. Keeps the printer free of lookahead.
  • ast/ — Strong AST layer with FromCST trait. Converts the lossless Rowan CST into typed structs that are easy for the printer to consume, similar to syn for rust.
    printer.rs — Output engine with Printable/PrintMultiLine traits and Shape-based width tracking. Uses the "try single-line, fallback to multi-line" strategy throughout.

Key formatting behaviors:

  • Line width default: 100 columns, indent: 4 spaces
  • Greedy width-fitting: nodes try to fit on one line before splitting
  • LLM function body field ordering normalized to client first, prompt second
  • Trivia attachment: trailing comments stay trailing, leading comments re-indent to match context
  • Raw/block strings: content preserved, baseline indentation adjusted (currently we emit as-is)
  • TODO: Formatting expressions in attribute args (changes needed upstream in the parser, currently we emit as-is)
  • TODO: Formatting attributes inside of types (changes needed upstream in the parser, currently we emit as-is)
  • Chained expressions (a.b.c().d) flatten and break at field access points
  • Binary operator chains group by precedence family
  • Trailing commas added in multi-line lists

Parser fixes (prerequisite changes):

  • >> token splitting when expecting > (e.g. for Map<string, Map<string, int>>)
  • Improved > handling in the parser
  • Comment parsing at file end

Test infrastructure (crates/baml_tests/):

  • Idempotency verification: format(format(x)) == format(x) for all valid files
  • ~70 snapshot files covering all major language features
┌──────────────────────────────────┐
│       Source text (.baml)        │
└────────────────┬─────────────────┘
                 │
        lex + parse (external crates)
                 │
                 ▼
┌────────────────┴─────────────────┐
│    Rowan CST (lossless tree)     │
└───────┬─────────────────┬────────┘
        │                 │
        ▼                 ▼
 Phase 1:            Phase 2:
 classify_trivia()   SourceFile::from_cst()
 Tags each comment   CST → Strong AST via
 as leading,         the FromCST trait.
 trailing, or        Validates structure &
 before-EOF.         extracts typed fields.
        │                 │
        └────────┬────────┘
                 │
                 ▼
┌────────────────┴─────────────────┐
│  Printer::print()                │
│  Recursive Printable walk.       │
│  try single-line → multi-line.   │
└────────────────┬─────────────────┘
┌────────────────┴─────────────────┐
│      Formatted source text       │
└──────────────────────────────────┘

Summary by CodeRabbit

  • New Features

    • Full BAML formatter with configurable line width/indent, CLI integration, and per-file formatter tests.
  • Refactors

    • Comprehensive AST/printer/trivia framework improving multi-line layouts and comment placement.
    • Parser improvements for generics/type-arguments and expanded keyword recognition.
  • Tests

    • Added idempotency and snapshot tests for formatting.
  • Bug Fixes

    • Adjusted diagnostic positioning for an extra '>' case.

@vercel

vercel Bot commented Feb 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
beps Ready Ready Preview, Comment Feb 18, 2026 8:07am
promptfiddle Ready Ready Preview, Comment Feb 18, 2026 8:07am

Request Review

@coderabbitai

coderabbitai Bot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • ✅ Review completed - (🔄 Check again to review again)
📝 Walkthrough

Walkthrough

Adds a new baml_fmt formatter crate (AST, printer, trivia classifier, Salsa entry), integrates formatter tests and tools, updates parser to handle pending '>'/ '>>' in type arguments, and adds SyntaxKind::is_keyword.

Changes

Cohort / File(s) Summary
Workspace manifests
baml_language/Cargo.toml, baml_language/crates/baml_fmt/Cargo.toml, baml_language/crates/baml_tests/Cargo.toml, baml_language/crates/tools_onionskin/Cargo.toml
Add new baml_fmt crate to workspace, add ouroboros workspace dependency, and add baml_fmt as dependency in tests/tools manifests.
Formatter crate entry & API
baml_language/crates/baml_fmt/src/lib.rs
Introduce top-level format entry points, FormatOptions, FormatterError; export ast, printer, and trivia typings.
AST core & traversal
baml_language/crates/baml_fmt/src/ast/mod.rs
Add FromCST/KnownKind traits, StrongAstError, SyntaxNodeIter, SourceFile, and top-level AST wiring & tests.
Tokens layer
baml_language/crates/baml_fmt/src/ast/tokens.rs
Define token traits, many keyword/punctuation token types, literal token structs, operator enums, and FromCST/KnownKind/Printable impls.
AST: declarations
baml_language/crates/baml_fmt/src/ast/declarations.rs
Large module: Top-level declarations (functions, classes, enums, clients, config blocks, type builders, tests, retry policies, template strings, type aliases) with FromCST/KnownKind/Printable.
AST: expressions
baml_language/crates/baml_fmt/src/ast/expressions.rs
Comprehensive expression AST and printing (literals, paths, calls, binary/unary, if/match, blocks, arrays/maps, chain printing).
AST: types & attributes
baml_language/crates/baml_fmt/src/ast/types.rs, baml_language/crates/baml_fmt/src/ast/attributes.rs
Type expression AST (generics, unions, optionals, arrays, function types) and attribute AST (dotted names, args) with parsing and printing.
AST: patterns & statements
baml_language/crates/baml_fmt/src/ast/pattern.rs, baml_language/crates/baml_fmt/src/ast/statements.rs
Match pattern AST and Statement AST (let, for, while, return, assert, etc.) with FromCST/Printable.
Printer & trivia classifier
baml_language/crates/baml_fmt/src/printer.rs, baml_language/crates/baml_fmt/src/trivia_classifier.rs
Shape-aware Printer API (Printable/PrintMultiLine) and TriviaInfo/EmittableTrivia classification for leading/trailing/EOF trivia.
Parser updates
baml_language/crates/baml_compiler_parser/src/parser.rs, baml_language/crates/baml_compiler_syntax/src/syntax_kind.rs
Introduce pending_greaters and type_args_depth to split/emit '>' and '>>' correctly, flush pending greaters in contexts; add pub fn is_keyword(self) -> bool on SyntaxKind.
Test integration & runner
baml_language/crates/baml_tests/build.rs, baml_language/crates/baml_tests/projects/..., baml_language/crates/tools_onionskin/src/compiler.rs, baml_language/crates/tools_onionskin/src/main.rs
Generate per-file formatter tests (idempotency + snapshots), add CompilerPhase::Formatter and runner support to run formatting and annotate outputs.
Test fixtures updates
baml_language/crates/baml_lsp_actions_tests/test_files/..., baml_language/crates/baml_tests/projects/config_dictionary/valid_dictionary.baml, baml_language/crates/baml_tests/projects/basic_types/types.baml
Small fixture edits: diagnostic pointer shift, removal of three dictionary entries, and addition of a long map type test.

Sequence Diagram(s)

sequenceDiagram
    participant Source as Source
    participant Lexer as Lexer
    participant Parser as Parser/CST
    participant Trivia as TriviaClassifier
    participant AST as AST Builder
    participant Printer as Formatter

    Source->>Lexer: lex -> tokens
    Lexer->>Parser: token stream
    Parser->>Parser: build CST (handle pending '>' / '>>')
    Parser->>Trivia: provide CST root
    Trivia->>AST: provide EmittableTrivia for tokens
    Parser->>AST: provide SOURCE_FILE CST
    AST->>Printer: Strong AST + FormatOptions + TriviaInfo
    Printer->>Printer: Printable.print with Shape decisions
    Printer->>Source: formatted output
Loading

Estimated Code Review Effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 72.91% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'baml_fmt: basically a formatter' directly and clearly describes the main change—introduction of a formatter component (baml_fmt crate) with ~7.9k LOC, public format API, and supporting infrastructure (AST, printer, trivia classifier).
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch kai/baml_fmt

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

@codspeed-hq

codspeed-hq Bot commented Feb 12, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

⚠️ Unknown Walltime execution environment detected

Using the Walltime instrument on standard Hosted Runners will lead to inconsistent data.

For the most accurate results, we recommend using CodSpeed Macro Runners: bare-metal machines fine-tuned for performance measurement consistency.

✅ 15 untouched benchmarks
⏩ 84 skipped benchmarks1


Comparing kai/baml_fmt (2b14910) with canary (8f2cd35)

Open in CodSpeed

Footnotes

  1. 84 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 14

Comment thread baml_language/crates/baml_compiler_parser/src/parser.rs Outdated
Comment thread baml_language/crates/baml_fmt/src/ast/attributes.rs
Comment thread baml_language/crates/baml_fmt/src/ast/attributes.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/pattern.rs
Comment thread baml_language/crates/baml_fmt/src/ast/pattern.rs
Comment thread baml_language/crates/baml_fmt/src/ast/statements.rs
Comment thread baml_language/crates/baml_fmt/src/ast/statements.rs
Comment thread baml_language/crates/tools_onionskin/src/compiler.rs
@github-actions

github-actions Bot commented Feb 13, 2026

Copy link
Copy Markdown

Binary size checks passed

7 passed

Artifact Platform Gzip Baseline Delta Status
bridge_cffi Linux 4.0 MB 4.0 MB +45.7 KB (+1.1%) OK
bridge_cffi-stripped Linux 2.2 MB 2.1 MB +48.1 KB (+2.2%) OK
bridge_cffi macOS 3.3 MB 3.3 MB +34.9 KB (+1.1%) OK
bridge_cffi-stripped macOS 1.8 MB 1.7 MB +38.5 KB (+2.2%) OK
bridge_cffi Windows 3.3 MB 3.3 MB +43.7 KB (+1.3%) OK
bridge_cffi-stripped Windows 1.8 MB 1.8 MB +42.1 KB (+2.4%) OK
bridge_wasm WASM 1.3 MB 1.3 MB +29.3 KB (+2.2%) OK

Generated by cargo size-gate · workflow run

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
baml_language/crates/baml_compiler_parser/src/parser.rs (1)

606-616: ⚠️ Potential issue | 🟡 Minor

Update stale comment in pending > handling.

The comment says nothing is emitted, but the code now emits a GREATER token.

✏️ Suggested doc fix
-        // First check if we have a pending '>' from a previous '>>' split.
-        // Don't emit anything - the '>>' token is already in the tree.
+        // First check if we have a pending '>' from a previous '>>' split.
+        // Emit that pending token now to keep the CST balanced.

Comment thread baml_language/crates/baml_compiler_syntax/src/syntax_kind.rs
Comment thread baml_language/crates/baml_fmt/src/ast/attributes.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/pattern.rs Outdated
Comment thread baml_language/crates/baml_fmt/src/ast/statements.rs Outdated
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs
Comment thread baml_language/crates/baml_fmt/src/lib.rs
Comment thread baml_language/crates/baml_fmt/src/trivia_classifier.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Comment thread baml_language/crates/baml_fmt/src/ast/attributes.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs
Comment thread baml_language/crates/baml_fmt/src/printer.rs Outdated
Comment thread baml_language/crates/baml_tests/build.rs Outdated
@coderabbitai

coderabbitai Bot commented Feb 17, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":401,"request":{"method":"PATCH","url":"https://api.github.com/repos/BoundaryML/baml/issues/comments/3893829606","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR introduces a complete BAML formatter crate with comprehensive AST parsing, shape-aware pretty-printing, and trivia classification. It enhances the parser for generic angle bracket handling, adds keyword detection to syntax kinds, and integrates formatting into the test suite and compiler tooling.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**New baml_fmt Crate Setup** <br> `baml_language/Cargo.toml`, `baml_fmt/Cargo.toml`, `baml_fmt/src/lib.rs`|Created new baml_fmt workspace crate with manifest dependencies and top-level format entry point that orchestrates lexing, parsing, trivia classification, AST construction, and printing.|\n|**AST Infrastructure & Tokens** <br> `baml_fmt/src/ast/mod.rs`, `baml_fmt/src/ast/tokens.rs`|Established FromCST and KnownKind traits for CST-to-AST conversion, StrongAstError for error handling, SyntaxNodeIter for traversal, and comprehensive token definitions (keywords, punctuation, literals, operators) with span tracking and printing support.|\n|**AST Declaration Nodes** <br> `baml_fmt/src/ast/declarations.rs`|Comprehensive AST for top-level BAML declarations including functions, classes, enums, clients, config blocks, type builders, tests, retry policies, and template strings, with FromCST parsing and Printable rendering implementations.|\n|**AST Expression Nodes** <br> `baml_fmt/src/ast/expressions.rs`|Rich expression AST covering literals, paths, operations, control flow (if/match), calls, indexing, field access, blocks, and collections with multi-line printing support and chain rendering for postfix operations.|\n|**AST Statement & Pattern Nodes** <br> `baml_fmt/src/ast/statements.rs`, `baml_fmt/src/ast/pattern.rs`|Statement variants (expressions, let, while, for, return, break, continue, assert) with flexible semicolon handling; match pattern AST with binding, enum variants, unions, and nested forms.|\n|**AST Type & Attribute Nodes** <br> `baml_fmt/src/ast/types.rs`, `baml_fmt/src/ast/attributes.rs`|Type expressions supporting generics, unions, optionals, arrays, functions, and constraints; attribute nodes for dotted names and parenthesized argument lists with multi-line strategies.|\n|**Printer System** <br> `baml_fmt/src/printer.rs`, `baml_fmt/src/trivia_classifier.rs`|Shape-aware Printer with multi-step formatting, nested composition, and line metrics; trivia classifier that tracks comments, whitespace, and empty lines with leading/trailing attachment metadata.|\n|**Parser & Syntax Enhancements** <br> `baml_compiler_parser/src/parser.rs`, `baml_compiler_syntax/src/syntax_kind.rs`|Enhanced parser with improved greater-than token handling (pending_greaters, type_args_depth tracking) and header/footer trivia emission; added `is_keyword()` method to SyntaxKind.|\n|**Test Suite Integration** <br> `baml_tests/Cargo.toml`, `baml_tests/build.rs`, `tools_onionskin/Cargo.toml`, `tools_onionskin/src/compiler.rs`, `tools_onionskin/src/main.rs`|Integrated formatter into test generation (per-file idempotency testing with snapshots), added baml_fmt dependency, introduced Formatter compiler phase with execution and metrics tracking.|\n|**Test File Updates** <br> `baml_lsp_actions_tests/test_files/syntax/class/extra_greater_in_generic.baml`, `baml_lsp_actions_tests/test_files/syntax/dictionary/valid_dictionary.baml`, `baml_tests/projects/config_dictionary/valid_dictionary.baml`|Minor diagnostic pointer shift for generic angle bracket error; removed three unquoted string dictionary entries from valid test cases.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Source as Source Code\n    participant Lexer\n    participant Parser as Parser/CST\n    participant Trivia as Trivia Classifier\n    participant AST as AST Builder\n    participant Printer\n\n    Source->>Lexer: Raw BAML text\n    Lexer->>Parser: Token stream\n    Parser->>Parser: Build CST\n    Parser->>Trivia: Emit SyntaxNode tree\n    Trivia->>Trivia: Classify comments/whitespace\n    Trivia->>AST: EmittableTrivia sequence\n    Parser->>AST: CST root (SOURCE_FILE)\n    AST->>AST: FromCST: Convert CST to AST\n    AST->>Printer: Strong AST + options\n    Printer->>Printer: Printable trait: render with Shape\n    Printer->>Printer: Multi-line decisions\n    Printer->>Source: Formatted output\n```\n\n## Estimated Code Review Effort\n\n🎯 4 (Complex) | ⏱️ ~60 minutes\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 1 | ❌ 3</summary>\n\n### ❌ Failed checks (2 warnings, 1 inconclusive)\n\n|        Check name        | Status         | Explanation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Resolution                                                                                                                                                                                                                                         |\n| :----------------------: | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|    Docstring Coverage    | ⚠️ Warning     | Docstring coverage is 60.31% which is insufficient. The required threshold is 80.00%.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Write docstrings for the functions missing them to satisfy the coverage threshold.                                                                                                                                                                 |\n| Merge Conflict Detection | ⚠️ Warning     | ❌ Merge conflicts detected (61 files):<br><br>  ⚔️ `.gitignore` (content)<br>  ⚔️ `baml_language/.cargo/size-gate.toml` (content)<br>  ⚔️ `baml_language/.ci/size-gate/aarch64-apple-darwin.toml` (content)<br>  ⚔️ `baml_language/.ci/size-gate/wasm32-unknown-unknown.toml` (content)<br>  ⚔️ `baml_language/.ci/size-gate/x86_64-pc-windows-msvc.toml` (content)<br>  ⚔️ `baml_language/.ci/size-gate/x86_64-unknown-linux-gnu.toml` (content)<br>  ⚔️ `baml_language/Cargo.lock` (content)<br>  ⚔️ `baml_language/Cargo.toml` (content)<br>  ⚔️ `baml_language/crates/baml_compiler_emit/src/emit.rs` (content)<br>  ⚔️ `baml_language/crates/baml_compiler_emit/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/baml_compiler_parser/src/parser.rs` (content)<br>  ⚔️ `baml_language/crates/baml_compiler_syntax/src/syntax_kind.rs` (content)<br>  ⚔️ `baml_language/crates/baml_lsp_actions_tests/test_files/syntax/class/extra_greater_in_generic.baml` (content)<br>  ⚔️ `baml_language/crates/baml_lsp_actions_tests/test_files/syntax/dictionary/valid_dictionary.baml` (content)<br>  ⚔️ `baml_language/crates/baml_tests/Cargo.toml` (content)<br>  ⚔️ `baml_language/crates/baml_tests/build.rs` (content)<br>  ⚔️ `baml_language/crates/baml_tests/projects/config_dictionary/valid_dictionary.baml` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/comment_after_string_in_config/baml_tests__comment_after_string_in_config__02_parser__test.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/config_dictionary/baml_tests__config_dictionary__01_lexer__valid_dictionary.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/config_dictionary/baml_tests__config_dictionary__02_parser__valid_dictionary.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/config_dictionary/baml_tests__config_dictionary__03_hir.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/config_dictionary/baml_tests__config_dictionary__04_5_mir.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/config_dictionary/baml_tests__config_dictionary__06_codegen.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/parser_stress/baml_tests__parser_stress__02_parser__deeply_nested.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/pending_greaters_fix/baml_tests__pending_greaters_fix__02_parser__extra_greater.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/pending_greaters_fix/baml_tests__pending_greaters_fix__05_diagnostics.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/snapshots/simple_function/baml_tests__simple_function__02_parser__main.snap` (content)<br>  ⚔️ `baml_language/crates/baml_tests/src/bytecode.rs` (content)<br>  ⚔️ `baml_language/crates/baml_tests/src/codegen.rs` (content)<br>  ⚔️ `baml_language/crates/baml_tests/src/vm.rs` (content)<br>  ⚔️ `baml_language/crates/baml_type/src/typetag.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/Cargo.toml` (content)<br>  ⚔️ `baml_language/crates/bex_engine/src/conversion.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/tests/common/mod.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/tests/concurrent.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/tests/gc.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/tests/llm_render.rs` (content)<br>  ⚔️ `baml_language/crates/bex_engine/tests/net.rs` (content)<br>  ⚔️ `baml_language/crates/bex_external_types/src/bex_external_value.rs` (content)<br>  ⚔️ `baml_language/crates/bex_factory/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/bex_heap/src/accessor.rs` (content)<br>  ⚔️ `baml_language/crates/bex_heap/src/gc.rs` (content)<br>  ⚔️ `baml_language/crates/bex_heap/src/heap_debugger/real.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm/src/native.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm/src/vm.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm_types/src/bytecode.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm_types/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/bex_vm_types/src/types.rs` (content)<br>  ⚔️ `baml_language/crates/bridge_cffi/Cargo.toml` (content)<br>  ⚔️ `baml_language/crates/bridge_cffi/src/lib.rs` (content)<br>  ⚔️ `baml_language/crates/bridge_ctypes/src/value_encode.rs` (content)<br>  ⚔️ `baml_language/crates/sys_llm/src/jinja/value_conversion.rs` (content)<br>  ⚔️ `baml_language/crates/tools_onionskin/Cargo.toml` (content)<br>  ⚔️ `baml_language/crates/tools_onionskin/src/compiler.rs` (content)<br>  ⚔️ `baml_language/crates/tools_onionskin/src/main.rs` (content)<br>  ⚔️ `baml_language/stow.toml` (content)<br>  ⚔️ `engine/baml-lib/baml-types/src/ir_type/converters/streaming.rs` (content)<br>  ⚔️ `engine/baml-lib/jsonish/src/tests/test_streaming.rs` (content)<br>  ⚔️ `fern/01-guide/04-baml-basics/streaming.mdx` (content)<br><br>These conflicts must be resolved before merging into `canary`. | Resolve conflicts locally and push changes to this branch.                                                                                                                                                                                         |\n|        Title check       | ❓ Inconclusive | The title 'baml_fmt: basically a formatter' is partially related to the changeset. It references the main addition (baml_fmt crate), but uses the vague term 'basically a formatter' which undersells the actual implementation scope.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | Consider a more descriptive title like 'Add baml_fmt initial formatter with AST and printer infrastructure' or 'Introduce BAML formatter with CST-to-AST conversion and pretty-printing' to better convey the comprehensive nature of the changes. |\n\n<details>\n<summary>✅ Passed checks (1 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                 |\n| :---------------: | :------- | :---------------------------------------------------------- |\n| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `kai/baml_fmt`\n\n</details>\n<details>\n<summary>⚔️ Resolve merge conflicts (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"c3a5b2e1-4d7f-4a8c-b9d6-e1f2c3d4a5b6\", \"radioGroupId\": \"merge-conflict-output-choice-group-unknown_comment_id\"} -->   Auto-commit resolved conflicts to branch `kai/baml_fmt`\n- [ ] <!-- {\"checkboxId\": \"d4b6c3f2-5e8g-5b9d-c0e7-f2g3d4e5b6c7\", \"radioGroupId\": \"merge-conflict-output-choice-group-unknown_comment_id\"} -->   Create stacked PR with resolved conflicts\n- [ ] <!-- {\"checkboxId\": \"e5c7d4g3-6f9h-6c0e-d1f8-g3h4e5f6c7d8\", \"radioGroupId\": \"merge-conflict-output-choice-group-unknown_comment_id\"} -->   Post resolved changes as copyable diffs in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n\n\n<!-- tips_start -->\n\n---\n\n\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":1}},"response":{"url":"https://api.github.com/repos/BoundaryML/baml/issues/comments/3893829606","status":401,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","connection":"close","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Tue, 17 Feb 2026 17:02:43 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-media-type":"github.v3; format=json","x-github-request-id":"043F:1FFB6A:73C865:1F13EAB:69949F2F","x-xss-protection":"0"},"data":{"message":"Bad credentials","documentation_url":"https://docs.github.com/rest","status":"401"}}}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
baml_language/crates/baml_compiler_parser/src/parser.rs (1)

605-640: ⚠️ Potential issue | 🟡 Minor

Fix the stale comment about pending > emission.
The code now emits a GREATER token when pending_greaters > 0, but the comment still says “Don’t emit anything,” which is misleading.

📝 Proposed comment tweak
-        // First check if we have a pending '>' from a previous '>>' split.
-        // Don't emit anything - the '>>' token is already in the tree.
+        // First check if we have a pending '>' from a previous '>>' split.
+        // Emit a virtual '>' token for the pending split.

Comment thread baml_language/crates/baml_compiler_parser/src/parser.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs Outdated
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs
Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs
Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs Outdated
pub struct ClientField {
pub keyword: t::Client,
// not currently allowed
// pub colon: Option<t::Colon>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

what do you mean -- are colons not allowed inside of clients? It should be possible.

pub struct ConfigItem {
pub key: ConfigItemKey,
// /// Colons are currently invalid, it seems
// pub colon: Option<t::Colon>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh yeah this should definitely also be possible. Like either whitespace or colon

Comment thread baml_language/crates/baml_fmt/src/ast/expressions.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
baml_language/crates/baml_compiler_parser/src/parser.rs (1)

3074-3084: ⚠️ Potential issue | 🟠 Major

Emit a parse error for trailing commas in generic args.

Lines 3079-3083 currently treat , > / , >> as a silent break, which can allow invalid trailing commas to pass parsing and later fail during formatting. Consider emitting an unexpected-token error when the comma is trailing.

🛠️ Suggested change
                 while p.eat(TokenKind::Comma) {
-                    if p.at(TokenKind::Greater) || p.at(TokenKind::GreaterGreater) {
-                        break; // Trailing comma
-                    }
+                    if p.at(TokenKind::Greater) || p.at(TokenKind::GreaterGreater) {
+                        p.error_unexpected_token("type argument after comma".to_string());
+                        break; // Trailing comma
+                    }
                     p.parse_type();
                 }

Based on learnings: In BAML, when formatting generic type parameter lists (angle-bracket syntax), do not use a trailing comma after the last type parameter.

Comment thread baml_language/crates/baml_cli/src/format.rs
Comment thread baml_language/crates/baml_cli/src/format.rs
Comment thread baml_language/crates/baml_fmt/src/ast/attributes.rs
Comment thread baml_language/crates/baml_fmt/src/ast/declarations.rs
Comment thread baml_language/crates/baml_fmt/src/ast/mod.rs
Comment thread baml_language/crates/baml_fmt/src/ast/tokens.rs
Comment thread baml_language/crates/baml_fmt/src/ast/types.rs
Comment thread baml_language/crates/baml_fmt/src/trivia_classifier.rs
@2kai2kai2
2kai2kai2 enabled auto-merge February 18, 2026 07:47
@2kai2kai2
2kai2kai2 added this pull request to the merge queue Feb 18, 2026
Merged via the queue into canary with commit a00a043 Feb 18, 2026
43 of 44 checks passed
@2kai2kai2
2kai2kai2 deleted the kai/baml_fmt branch February 18, 2026 08:06
@2kai2kai2
2kai2kai2 restored the kai/baml_fmt branch February 18, 2026 16:58
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