| **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 <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: `crate` → `krate`, `fn` → `func`, `struct` → `strukt`, `type` → `ty` |