aboutsummaryrefslogtreecommitdiff
path: root/ARCHITECTURE.md
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-12-17 21:13:50 +0000
committerAleksey Kladov <[email protected]>2018-12-17 21:13:50 +0000
commitee2dc9969fd46d710b7d17c297f3768f57a40e57 (patch)
tree26011ecbaf6c28ef6202385ece9337f32b4ab260 /ARCHITECTURE.md
parent620970b06e61b9380c668e3e5267c750b7cc4971 (diff)
big picture
Diffstat (limited to 'ARCHITECTURE.md')
-rw-r--r--ARCHITECTURE.md29
1 files changed, 28 insertions, 1 deletions
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index d31290483..3b200bbc8 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -4,6 +4,33 @@ This document describes high-level architecture of rust-analyzer.
4If you want to familiarize yourself with the code base, you are just 4If you want to familiarize yourself with the code base, you are just
5in the right place! 5in the right place!
6 6
7## The Big Picture
8
9![](https://user-images.githubusercontent.com/1711539/50114578-e8a34280-0255-11e9-902c-7cfc70747966.png)
10
11On the highest level, rust-analyzer is a thing which accepts input source code
12from the client and produces a structured semantic model of the code.
13
14More specifically, input data consists of a set of test files (`(PathBuf,
15String)` pairs) and an information about project structure, the so called
16`CrateGraph`. Crate graph specifies which files are crate roots, which cfg flags
17are specified for each crate (TODO: actually implement this) and what are
18dependencies between the crate. The analyzer keeps all these input data in
19memory and never does any IO. Because the input data is source code, which
20typically measures in tens of megabytes at most, keeping all input data in
21memory is OK.
22
23A "structured semantic model" is basically an object-oriented representations of
24modules, functions and types which appear in the source code. This representation
25is fully "resolved": all expressions have types, all references are bound to
26declarations, etc.
27
28The client can submit a small delta of input data (typically, a change to a
29single file) and get a fresh code model which accounts for changes.
30
31Underlying engine makes sure that model is computed lazily (on-demand) and can
32be quickly updated for small modifications.
33
7 34
8## Code generation 35## Code generation
9 36
@@ -86,7 +113,7 @@ current state, incorporates changes and handles out `Analysis` --- an
86immutable consistent snapshot of world state at a point in time, which 113immutable consistent snapshot of world state at a point in time, which
87actually powers analysis. 114actually powers analysis.
88 115
89One interesting aspect of analysis is its support for cancelation. When a change 116One interesting aspect of analysis is its support for cancellation. When a change
90is applied to `AnalysisHost`, first all currently active snapshots are 117is applied to `AnalysisHost`, first all currently active snapshots are
91cancelled. Only after all snapshots are dropped the change actually affects the 118cancelled. Only after all snapshots are dropped the change actually affects the
92database. 119database.