Skip to content

Commit 81ffe97

Browse files
committed
Document certain invariants
1 parent ae1acbd commit 81ffe97

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

docs/dev/README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,33 @@ struct Foo {
241241
For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
242242
If the line is too long, you want to split the sentence in two :-)
243243

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+
244271
# Logging
245272

246273
Logging is done by both rust-analyzer and VS Code, so it might be tricky to

0 commit comments

Comments
 (0)