---
tags: "2021-10-18"
---
# rust-analyzer overview
---
## History
---
### Started out as an error-resilient parser
---
### Few years later [RFC2912](https://github.com/rust-lang/rfcs/pull/2912), transition to r-a as the official LSP implementation, was filed
---
## Implementation Details <!-- differences between r-a and rls -->
---
- `ungrammar` for concrete syntax tree definitions
- `rowan` for syntax trees, inspired by Roslyn, Swift's `libsyntax`
- lexer shared with `rustc`
- handwritten recursive-descent parser, different needs
- low latency incremental reparses
- Concrete Syntax Tree
---
- `salsa`, similar to `rustc`'s query system
- `chalk` for trait solving
---
## Big Milestones
---
### Semantic Highlighting <!-- most advanced piece of code in terms of analyzing semantics, not used as much as a lot of themes just do not support it/needs special theme support for specific language parts -->

---
### Inlay Hints <!-- fan favourite, VSCode hacked in via decorators, native api now exists -->

---
### Procedural-Macro and Attribute support <!-- Note how everything resolves even in the helper attributes thanks to spans -->

---
## Current Shortcomings
---
- no as-you-type error checking
- need to run `cargo check` to get most errors and lints
- no persistent state
- new session takes time to index dependencies
- completion slower than we would like
- proc-macro ABI is unstable
---
### Type System
- type inference does not always agree with rustc
- missing const generics support
- missing lifetime generics support
- `'static` all the things
---
## Contributor Experience <!-- what's it liek to contribute -->
---
- architecture docs and videos, style guide <!-- compare to rustc dev guide? -->
- point out style guide/architecture doc entries in PR reviews
- Reduces need to write lengthy reviews for repeating problems
- don't bother with `clippy`
- defaults are subjectively questionable
---
### Workflow differences from `rust-lang`
---
- builds with and targets latest stable Rust <!-- simpler to build, no changes required when features change, not everyone has a nightly compiler, mention stdx? -->
- No compiler internals -> easier to reuse
- low entry bar, just cargo
- `git clone` -> `cargo test`
- merge PRs optimistically, refactor later <!-- faster merging, less likely to have the PR become stale due to inactivity -->
- it's okay for team members to self-approve PRs
- no auto assigned reviewers
- causes some PRs to not get reviewed for a long time
---
## Meetings
---
- weekly sync meeting
- what has happened the past week
- every 6 weeks steering meeting
- plan ahead for the next 6 weeks
---
## Showcase
---
- @HKalbasi's WASM demos
- Monaco/Playground integration
- Mdbook hover hints for rust snippets
- `cargo-modules`
- A cargo plugin for showing an overview of a crate's modules.
- `evcxr`
- A Jupyter kernel and REPL
- ...
---
# What's Next
---
Better const generics support <!-- one of the bigger fish to fry, so a next long term goal -->
- tracking issue [r-a#8655](https://github.com/rust-analyzer/rust-analyzer/issues/8655)
- lots of work yet to be done
---
Librarification of `rustc`'s exhaustiveness checking
- so we can replace our sometimes incorrect copy
---
A request for Procedural (Attribute) Macro authors
- Try to recover on parse errors, don't just discard the input and emit a `compile_error!`
- Consider not using `syn` unless it is really required
- Or explore an `infallible` alternative to `syn`