4772: Document certain invariants r=matklad a=matklad



bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-06-06 17:55:13 +00:00 committed by GitHub
commit dc340f12a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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