Reminder: All AI usage must be disclosed in commit messages, see CONTRIBUTING.md for more details.

Build Commands

cargo build                    # Build all crates
cargo test                     # Run all tests
cargo test -p <crate>          # Run tests for a specific crate (e.g., cargo test -p hir-ty)
cargo lint                     # Run clippy on all targets
cargo xtask codegen            # Run code generation
cargo xtask tidy               # Run tidy checks
UPDATE_EXPECT=1 cargo test     # Update test expectations (snapshot tests)
RUN_SLOW_TESTS=1 cargo test    # Run heavy/slow tests

Key Architectural Invariants

  • Typing in a function body never invalidates global derived data
  • Parser/syntax tree is built per-file to enable parallel parsing
  • The server is stateless (HTTP-like); context must be re-created from request parameters
  • Cancellation uses salsa's cancellation mechanism; computations panic with a Cancelled payload

Code Generation

Generated code is committed to the repo. Grammar and AST are generated from ungrammar. Run cargo test -p xtask after adding inline parser tests (// test test_name comments).

Testing

Tests are snapshot-based using expect-test. Test fixtures use a mini-language:

  • $0 marks cursor position
  • // ^^^^ labels attach to the line above
  • //- minicore: sized, fn includes parts of minicore (minimal core library)
  • //- /path/to/file.rs crate:name deps:dep1,dep2 declares files/crates

Style Notes

  • Use stdx::never! and stdx::always! instead of assert! for recoverable invariants
  • Use T![fn] macro instead of SyntaxKind::FN_KW
  • Use keyword name mangling over underscore prefixing for identifiers: cratekrate, fnfunc, structstrukt, typety