mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-14 17:48:10 +00:00
Merge #4772
4772: Document certain invariants r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
dc340f12a3
@ -184,6 +184,27 @@ use crate::{}
|
|||||||
use super::{} // but prefer `use crate::`
|
use super::{} // but prefer `use crate::`
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Import Style
|
||||||
|
|
||||||
|
Items from `hir` and `ast` should be used qualified:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Good
|
||||||
|
use ra_syntax::ast;
|
||||||
|
|
||||||
|
fn frobnicate(func: hir::Function, strukt: ast::StructDef) {}
|
||||||
|
|
||||||
|
// Not as good
|
||||||
|
use hir::Function;
|
||||||
|
use ra_syntax::ast::StructDef;
|
||||||
|
|
||||||
|
fn frobnicate(func: Function, strukt: StructDef) {}
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid local `use MyEnum::*` imports.
|
||||||
|
|
||||||
|
Prefer `use crate::foo::bar` to `use super::bar`.
|
||||||
|
|
||||||
## Order of Items
|
## Order of Items
|
||||||
|
|
||||||
Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on.
|
Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on.
|
||||||
@ -220,6 +241,33 @@ struct Foo {
|
|||||||
For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
|
For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
|
||||||
If the line is too long, you want to split the sentence in two :-)
|
If the line is too long, you want to split the sentence in two :-)
|
||||||
|
|
||||||
|
# Architecture Invariants
|
||||||
|
|
||||||
|
This section tries to document high-level design constraints, which are not
|
||||||
|
always obvious from the low-level code.
|
||||||
|
|
||||||
|
## Incomplete syntax trees
|
||||||
|
|
||||||
|
Syntax trees are by design incomplete and do not enforce well-formedness.
|
||||||
|
If ast method returns an `Option`, it *can* be `None` at runtime, even if this is forbidden by the grammar.
|
||||||
|
|
||||||
|
## LSP indenpendence
|
||||||
|
|
||||||
|
rust-analyzer is independent from LSP.
|
||||||
|
It provides features for a hypothetical perfect Rust-specific IDE client.
|
||||||
|
Internal representations are lowered to LSP in the `rust-analyzer` crate (the only crate which is allowed to use LSP types).
|
||||||
|
|
||||||
|
## IDE/Compiler split
|
||||||
|
|
||||||
|
There's a semi-hard split between "compiler" and "IDE", at the `ra_hir` crate.
|
||||||
|
Compiler derives new facts about source code.
|
||||||
|
It explicitly acknowledges that not all info is available (ie, you can't look at types during name resolution).
|
||||||
|
|
||||||
|
IDE assumes that all information is available at all times.
|
||||||
|
|
||||||
|
IDE should use only types from `ra_hir`, and should not depend on the underling compiler types.
|
||||||
|
`ra_hir` is a facade.
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
|
|
||||||
Logging is done by both rust-analyzer and VS Code, so it might be tricky to
|
Logging is done by both rust-analyzer and VS Code, so it might be tricky to
|
||||||
|
Loading…
Reference in New Issue
Block a user