Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
40 changes: 40 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
**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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This can likely be improved more (in the future), its not really much stuff


- 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`