**Reminder: All AI usage must be disclosed in commit messages, see CONTRIBUTING.md for more details.** ## Build Commands ```bash cargo build # Build all crates cargo test # Run all tests cargo test -p # 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: `crate` → `krate`, `fn` → `func`, `struct` → `strukt`, `type` → `ty`