reach fixed-point for rust-analyzer spelling

This commit is contained in:
Aleksey Kladov 2019-01-20 20:31:05 +03:00
parent 7433842040
commit ce47d6b7b6

View file

@ -2,7 +2,7 @@
## About the guide ## About the guide
This guide describes the current state of `rust-analyzer` as of 2019-01-20 This guide describes the current state of rust-analyzer as of 2019-01-20
(git tag [guide-2019-01]). Its purpose is to document various problems and (git tag [guide-2019-01]). Its purpose is to document various problems and
architectural solutions related to the problem of building IDE-first compiler architectural solutions related to the problem of building IDE-first compiler
for Rust. for Rust.
@ -11,7 +11,7 @@ for Rust.
## The big picture ## The big picture
On the highest possible level, rust analyzer is a stateful component. A client may On the highest possible level, rust-analyzer is a stateful component. A client may
apply changes to the analyzer (new contents of `foo.rs` file is "fn main() {}") apply changes to the analyzer (new contents of `foo.rs` file is "fn main() {}")
and it may ask semantic questions about the current state (what is the and it may ask semantic questions about the current state (what is the
definition of the identifier with offset 92 in file `bar.rs`?). Two important definition of the identifier with offset 92 in file `bar.rs`?). Two important
@ -117,7 +117,7 @@ Yet another problem is that we really-really want to avoid doing IO, but with
Rust the set of "input" files is not necessary known up-front. In theory, you Rust the set of "input" files is not necessary known up-front. In theory, you
can have `#[path="/dev/random"] mod foo;`. can have `#[path="/dev/random"] mod foo;`.
To solve (or explicitly refuse to solve) these problems rust analyzer uses the To solve (or explicitly refuse to solve) these problems rust-analyzer uses the
concept of source root. Roughly speaking, source roots is a contents of a concept of source root. Roughly speaking, source roots is a contents of a
directory on a file systems, like `/home/matklad/projects/rustraytracer/**.rs`. directory on a file systems, like `/home/matklad/projects/rustraytracer/**.rs`.
@ -282,11 +282,11 @@ The first step of building the model is parsing the source code.
An important property of the Rust language is that each file can be parsed in An important property of the Rust language is that each file can be parsed in
isolation. Unlike, say, `C++`, an `include` can't change the meaning of the isolation. Unlike, say, `C++`, an `include` can't change the meaning of the
syntax. For this reason, Rust analyzer can build a syntax tree for each "source syntax. For this reason, rust-analyzer can build a syntax tree for each "source
file", which could then be reused by several semantic models if this file file", which could then be reused by several semantic models if this file
happens to be a part of several crates. happens to be a part of several crates.
Rust analyzer uses a similar representation of syntax trees to that of `Roslyn` Rust-analyzer uses a similar representation of syntax trees to that of `Roslyn`
and Swift's new [libsyntax]. Swift's docs give an excellent overview of the and Swift's new [libsyntax]. Swift's docs give an excellent overview of the
approach, so I skip this part here and instead outline the main characteristics approach, so I skip this part here and instead outline the main characteristics
of the syntax trees: of the syntax trees:
@ -333,7 +333,7 @@ declarations and recursively process child modules. This is handled by the
[`module_tree_query`]: https://github.com/rust-analyzer/rust-analyzer/blob/guide-2019-01/crates/ra_hir/src/module_tree.rs#L116-L123 [`module_tree_query`]: https://github.com/rust-analyzer/rust-analyzer/blob/guide-2019-01/crates/ra_hir/src/module_tree.rs#L116-L123
First, rust analyzer builds a module tree for all crates in a source root First, rust-analyzer builds a module tree for all crates in a source root
simultaneously. The main reason for this is historical (`module_tree` predates simultaneously. The main reason for this is historical (`module_tree` predates
`CrateGraph`), but this approach also enables accounting for files which are not `CrateGraph`), but this approach also enables accounting for files which are not
part of any crate. That is, if you create a file but do not include it as a part of any crate. That is, if you create a file but do not include it as a
@ -493,7 +493,7 @@ Naturally, name resolution [uses] this stable projection query.
## Type inference ## Type inference
First of all, implementation of type inference in rust analyzer was spearheaded First of all, implementation of type inference in rust-analyzer was spearheaded
by [@flodiebold]. [#327] was an awesome Christmas present, thank you, Florian! by [@flodiebold]. [#327] was an awesome Christmas present, thank you, Florian!
Type inference runs on per-function granularity and uses the patterns we've Type inference runs on per-function granularity and uses the patterns we've
@ -518,7 +518,7 @@ construct a mapping from `ExprId`s to types.
## Tying it all together: completion ## Tying it all together: completion
To conclude the overview of the rust analyzer, let's trace the request for To conclude the overview of the rust-analyzer, let's trace the request for
(type-inference powered!) code completion! (type-inference powered!) code completion!
We start by [receiving a message] from the language client. We decode the We start by [receiving a message] from the language client. We decode the