@@ -184,6 +184,27 @@ use crate::{}
184
184
use super :: {} // but prefer `use crate::`
185
185
```
186
186
187
+ ## Import Style
188
+
189
+ Items from `hir` and `ast` should be used qualified:
190
+
191
+ ```rust
192
+ // Good
193
+ use ra_syntax :: ast;
194
+
195
+ fn frobnicate (func : hir :: Function , strukt : ast :: StructDef ) {}
196
+
197
+ // Not as good
198
+ use hir :: Function ;
199
+ use ra_syntax :: ast :: StructDef ;
200
+
201
+ fn frobnicate (func : Function , strukt : StructDef ) {}
202
+ ```
203
+
204
+ Avoid local ` use MyEnum::* ` imports.
205
+
206
+ Prefer ` use crate::foo::bar ` to ` use super::bar ` .
207
+
187
208
## Order of Items
188
209
189
210
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 {
220
241
For ` .md ` and ` .adoc ` files, prefer a sentence-per-line format, don't wrap lines.
221
242
If the line is too long, you want to split the sentence in two :-)
222
243
244
+ # Architecture Invariants
245
+
246
+ This section tries to document high-level design constraints, which are not
247
+ always obvious from the low-level code.
248
+
249
+ ## Incomplete syntax trees
250
+
251
+ Syntax trees are by design incomplete and do not enforce well-formedness.
252
+ If ast method returns an ` Option ` , it * can* be ` None ` at runtime, even if this is forbidden by the grammar.
253
+
254
+ ## LSP indenpendence
255
+
256
+ rust-analyzer is independent from LSP.
257
+ It provides features for a hypothetical perfect Rust-specific IDE client.
258
+ Internal 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
+
262
+ There's a semi-hard split between "compiler" and "IDE", at the ` ra_hir ` crate.
263
+ Compiler derives new facts about source code.
264
+ It explicitly acknowledges that not all info is available (ie, you can't look at types during name resolution).
265
+
266
+ IDE assumes that all information is available at all times.
267
+
268
+ IDE should use only types from ` ra_hir ` , and should not depend on the underling compiler types.
269
+ ` ra_hir ` is a facade.
270
+
223
271
# Logging
224
272
225
273
Logging is done by both rust-analyzer and VS Code, so it might be tricky to
0 commit comments