diff options
author | Aleksey Kladov <[email protected]> | 2020-06-06 18:54:41 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-06-06 18:54:41 +0100 |
commit | 81ffe973ac265507419024048c166bbeef9aa275 (patch) | |
tree | 18686b03811a4e52ea8e365535dd3dc780c4b07f /docs/dev/README.md | |
parent | ae1acbd09c8e98e4e23f01f633ad551dabd5c578 (diff) |
Document certain invariants
Diffstat (limited to 'docs/dev/README.md')
-rw-r--r-- | docs/dev/README.md | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/docs/dev/README.md b/docs/dev/README.md index 6f74d4223..903cb4055 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md | |||
@@ -241,6 +241,33 @@ struct Foo { | |||
241 | For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. | 241 | For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. |
242 | If the line is too long, you want to split the sentence in two :-) | 242 | If the line is too long, you want to split the sentence in two :-) |
243 | 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 | |||
244 | # Logging | 271 | # Logging |
245 | 272 | ||
246 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to | 273 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to |