aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-06-06 18:55:13 +0100
committerGitHub <[email protected]>2020-06-06 18:55:13 +0100
commitdc340f12a39e7cd8b495b84c009052c4d441d867 (patch)
treea36b249c79f1f944793ff21ed5a739fe26f5ddf4 /docs
parentd4a92b4fefecbd63d8c7c82a5553cd209c068144 (diff)
parent81ffe973ac265507419024048c166bbeef9aa275 (diff)
Merge #4772
4772: Document certain invariants r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'docs')
-rw-r--r--docs/dev/README.md48
1 files changed, 48 insertions, 0 deletions
diff --git a/docs/dev/README.md b/docs/dev/README.md
index 194a40e15..903cb4055 100644
--- a/docs/dev/README.md
+++ b/docs/dev/README.md
@@ -184,6 +184,27 @@ use crate::{}
184use super::{} // but prefer `use crate::` 184use super::{} // but prefer `use crate::`
185``` 185```
186 186
187## Import Style
188
189Items from `hir` and `ast` should be used qualified:
190
191```rust
192// Good
193use ra_syntax::ast;
194
195fn frobnicate(func: hir::Function, strukt: ast::StructDef) {}
196
197// Not as good
198use hir::Function;
199use ra_syntax::ast::StructDef;
200
201fn frobnicate(func: Function, strukt: StructDef) {}
202```
203
204Avoid local `use MyEnum::*` imports.
205
206Prefer `use crate::foo::bar` to `use super::bar`.
207
187## Order of Items 208## Order of Items
188 209
189Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on. 210Optimize 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 {
220For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. 241For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
221If the line is too long, you want to split the sentence in two :-) 242If the line is too long, you want to split the sentence in two :-)
222 243
244# Architecture Invariants
245
246This section tries to document high-level design constraints, which are not
247always obvious from the low-level code.
248
249## Incomplete syntax trees
250
251Syntax trees are by design incomplete and do not enforce well-formedness.
252If ast method returns an `Option`, it *can* be `None` at runtime, even if this is forbidden by the grammar.
253
254## LSP indenpendence
255
256rust-analyzer is independent from LSP.
257It provides features for a hypothetical perfect Rust-specific IDE client.
258Internal representations are lowered to LSP in the `rust-analyzer` crate (the only crate which is allowed to use LSP types).
259
260## IDE/Compiler split
261
262There's a semi-hard split between "compiler" and "IDE", at the `ra_hir` crate.
263Compiler derives new facts about source code.
264It explicitly acknowledges that not all info is available (ie, you can't look at types during name resolution).
265
266IDE assumes that all information is available at all times.
267
268IDE should use only types from `ra_hir`, and should not depend on the underling compiler types.
269`ra_hir` is a facade.
270
223# Logging 271# Logging
224 272
225Logging is done by both rust-analyzer and VS Code, so it might be tricky to 273Logging is done by both rust-analyzer and VS Code, so it might be tricky to