blob: e8f699d92813a51c4f804efeb1867e13cc62ddc4 [file] [log] [blame] [view] [edit]
**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`