mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Fix spelling mistakes in docs/dev
This commit is contained in:
parent
81a9ad3672
commit
f82ce500a9
@ -115,7 +115,7 @@ This is important because it is possible to useful tooling using only syntax tre
|
|||||||
Without semantic information, you don't need to be able to _build_ code, which makes the tooling more robust.
|
Without semantic information, you don't need to be able to _build_ code, which makes the tooling more robust.
|
||||||
See also https://web.stanford.edu/~mlfbrown/paper.pdf.
|
See also https://web.stanford.edu/~mlfbrown/paper.pdf.
|
||||||
You can view the `syntax` crate as an entry point to rust-analyzer.
|
You can view the `syntax` crate as an entry point to rust-analyzer.
|
||||||
`sytax` crate is an **API Boundary**.
|
`syntax` crate is an **API Boundary**.
|
||||||
|
|
||||||
**Architecture Invariant:** syntax tree is a value type.
|
**Architecture Invariant:** syntax tree is a value type.
|
||||||
The tree is fully determined by the contents of its syntax nodes, it doesn't need global context (like an interner) and doesn't store semantic info.
|
The tree is fully determined by the contents of its syntax nodes, it doesn't need global context (like an interner) and doesn't store semantic info.
|
||||||
@ -198,14 +198,14 @@ It is an **API Boundary**.
|
|||||||
If you want to use IDE parts of rust-analyzer via LSP, custom flatbuffers-based protocol or just as a library in your text editor, this is the right API.
|
If you want to use IDE parts of rust-analyzer via LSP, custom flatbuffers-based protocol or just as a library in your text editor, this is the right API.
|
||||||
|
|
||||||
**Architecture Invariant:** `ide` crate's API is build out of POD types with public fields.
|
**Architecture Invariant:** `ide` crate's API is build out of POD types with public fields.
|
||||||
The API uses editor's terminology, it talks about offsets and string labels rathe than in terms of definitions or types.
|
The API uses editor's terminology, it talks about offsets and string labels rather than in terms of definitions or types.
|
||||||
It is effectively the view in MVC and viewmodel in [MVVM](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel).
|
It is effectively the view in MVC and viewmodel in [MVVM](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel).
|
||||||
All arguments and return types are conceptually serializable.
|
All arguments and return types are conceptually serializable.
|
||||||
In particular, syntax tress and and hir types are generally absent from the API (but are used heavily in the implementation).
|
In particular, syntax tress and and hir types are generally absent from the API (but are used heavily in the implementation).
|
||||||
Shout outs to LSP developers for popularizing the idea that "UI" is a good place to draw a boundary at.
|
Shout outs to LSP developers for popularizing the idea that "UI" is a good place to draw a boundary at.
|
||||||
|
|
||||||
`ide` is also the first crate which has the notion of change over time.
|
`ide` is also the first crate which has the notion of change over time.
|
||||||
`AnalysisHost` is a state to which you can transactonally `apply_change`.
|
`AnalysisHost` is a state to which you can transactionally `apply_change`.
|
||||||
`Analysis` is an immutable snapshot of the state.
|
`Analysis` is an immutable snapshot of the state.
|
||||||
|
|
||||||
Internally, `ide` is split across several crates. `ide_assists`, `ide_completion` and `ide_ssr` implement large isolated features.
|
Internally, `ide` is split across several crates. `ide_assists`, `ide_completion` and `ide_ssr` implement large isolated features.
|
||||||
@ -254,6 +254,10 @@ A single `rust-analyzer` process can serve many projects, so it is important tha
|
|||||||
These crates implement macros as token tree -> token tree transforms.
|
These crates implement macros as token tree -> token tree transforms.
|
||||||
They are independent from the rest of the code.
|
They are independent from the rest of the code.
|
||||||
|
|
||||||
|
### `crates/cfg`
|
||||||
|
|
||||||
|
This crate is responsible for parsing, evaluation and general definition of `cfg` attributes.
|
||||||
|
|
||||||
### `crates/vfs`, `crates/vfs-notify`
|
### `crates/vfs`, `crates/vfs-notify`
|
||||||
|
|
||||||
These crates implement a virtual fils system.
|
These crates implement a virtual fils system.
|
||||||
@ -265,7 +269,8 @@ For this reason, all path APIs generally take some existing path as a "file syst
|
|||||||
|
|
||||||
### `crates/stdx`
|
### `crates/stdx`
|
||||||
|
|
||||||
This crate contains various non-rust-analyzer specific utils, which could have been in std.
|
This crate contains various non-rust-analyzer specific utils, which could have been in std, as well
|
||||||
|
as copies of unstable std items we would like to make use of already, like `std::str::split_once`.
|
||||||
|
|
||||||
### `crates/profile`
|
### `crates/profile`
|
||||||
|
|
||||||
@ -285,7 +290,7 @@ There are tests to check that the generated code is fresh.
|
|||||||
|
|
||||||
In particular, we generate:
|
In particular, we generate:
|
||||||
|
|
||||||
* API for working with syntax trees (`syntax::ast`, the `ungrammar` crate).
|
* API for working with syntax trees (`syntax::ast`, the [`ungrammar`](https://github.com/rust-analyzer/ungrammar) crate).
|
||||||
* Various sections of the manual:
|
* Various sections of the manual:
|
||||||
|
|
||||||
* features
|
* features
|
||||||
|
@ -238,7 +238,7 @@ As proper cursor positioning is raison-d'etat for `onEnter`, it uses `SnippetTex
|
|||||||
* How to deal with synchronicity of the request?
|
* How to deal with synchronicity of the request?
|
||||||
One option is to require the client to block until the server returns the response.
|
One option is to require the client to block until the server returns the response.
|
||||||
Another option is to do a OT-style merging of edits from client and server.
|
Another option is to do a OT-style merging of edits from client and server.
|
||||||
A third option is to do a record-replay: client applies heuristic on enter immediatelly, then applies all user's keypresses.
|
A third option is to do a record-replay: client applies heuristic on enter immediately, then applies all user's keypresses.
|
||||||
When the server is ready with the response, the client rollbacks all the changes and applies the recorded actions on top of the correct response.
|
When the server is ready with the response, the client rollbacks all the changes and applies the recorded actions on top of the correct response.
|
||||||
* How to deal with multiple carets?
|
* How to deal with multiple carets?
|
||||||
* Should we extend this to arbitrary typed events and not just `onEnter`?
|
* Should we extend this to arbitrary typed events and not just `onEnter`?
|
||||||
|
@ -159,7 +159,7 @@ Express function preconditions in types and force the caller to provide them (ra
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
// GOOD
|
// GOOD
|
||||||
fn frbonicate(walrus: Walrus) {
|
fn frobnicate(walrus: Walrus) {
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,7 +374,7 @@ Avoid making a lot of code type parametric, *especially* on the boundaries betwe
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
// GOOD
|
// GOOD
|
||||||
fn frbonicate(f: impl FnMut()) {
|
fn frobnicate(f: impl FnMut()) {
|
||||||
frobnicate_impl(&mut f)
|
frobnicate_impl(&mut f)
|
||||||
}
|
}
|
||||||
fn frobnicate_impl(f: &mut dyn FnMut()) {
|
fn frobnicate_impl(f: &mut dyn FnMut()) {
|
||||||
@ -382,7 +382,7 @@ fn frobnicate_impl(f: &mut dyn FnMut()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BAD
|
// BAD
|
||||||
fn frbonicate(f: impl FnMut()) {
|
fn frobnicate(f: impl FnMut()) {
|
||||||
// lots of code
|
// lots of code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -391,11 +391,11 @@ Avoid `AsRef` polymorphism, it pays back only for widely used libraries:
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
// GOOD
|
// GOOD
|
||||||
fn frbonicate(f: &Path) {
|
fn frobnicate(f: &Path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// BAD
|
// BAD
|
||||||
fn frbonicate(f: impl AsRef<Path>) {
|
fn frobnicate(f: impl AsRef<Path>) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -705,7 +705,7 @@ fn foo() -> Option<Bar> {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Rationale:** reduce congnitive stack usage.
|
**Rationale:** reduce cognitive stack usage.
|
||||||
|
|
||||||
## Comparisons
|
## Comparisons
|
||||||
|
|
||||||
|
@ -92,19 +92,18 @@ FN@0..17
|
|||||||
R_PAREN@5..6 ")"
|
R_PAREN@5..6 ")"
|
||||||
WHITESPACE@6..7 " "
|
WHITESPACE@6..7 " "
|
||||||
BLOCK_EXPR@7..17
|
BLOCK_EXPR@7..17
|
||||||
BLOCK@7..17
|
L_CURLY@7..8 "{"
|
||||||
L_CURLY@7..8 "{"
|
WHITESPACE@8..9 " "
|
||||||
WHITESPACE@8..9 " "
|
BIN_EXPR@9..15
|
||||||
BIN_EXPR@9..15
|
LITERAL@9..11
|
||||||
LITERAL@9..11
|
INT_NUMBER@9..11 "90"
|
||||||
INT_NUMBER@9..11 "90"
|
WHITESPACE@11..12 " "
|
||||||
WHITESPACE@11..12 " "
|
PLUS@12..13 "+"
|
||||||
PLUS@12..13 "+"
|
WHITESPACE@13..14 " "
|
||||||
WHITESPACE@13..14 " "
|
LITERAL@14..15
|
||||||
LITERAL@14..15
|
INT_NUMBER@14..15 "2"
|
||||||
INT_NUMBER@14..15 "2"
|
WHITESPACE@15..16 " "
|
||||||
WHITESPACE@15..16 " "
|
R_CURLY@16..17 "}"
|
||||||
R_CURLY@16..17 "}"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Optimizations
|
#### Optimizations
|
||||||
@ -387,7 +386,7 @@ trait HasVisibility: AstNode {
|
|||||||
fn visibility(&self) -> Option<Visibility>;
|
fn visibility(&self) -> Option<Visibility>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HasVisbility for FnDef {
|
impl HasVisibility for FnDef {
|
||||||
fn visibility(&self) -> Option<Visibility> {
|
fn visibility(&self) -> Option<Visibility> {
|
||||||
self.syntax.children().find_map(Visibility::cast)
|
self.syntax.children().find_map(Visibility::cast)
|
||||||
}
|
}
|
||||||
@ -527,7 +526,7 @@ In practice, incremental reparsing doesn't actually matter much for IDE use-case
|
|||||||
|
|
||||||
### Parsing Algorithm
|
### Parsing Algorithm
|
||||||
|
|
||||||
We use a boring hand-crafted recursive descent + pratt combination, with a special effort of continuting the parsing if an error is detected.
|
We use a boring hand-crafted recursive descent + pratt combination, with a special effort of continuing the parsing if an error is detected.
|
||||||
|
|
||||||
### Parser Recap
|
### Parser Recap
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user