aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-10-09 19:30:41 +0100
committerAleksey Kladov <[email protected]>2018-10-14 23:05:18 +0100
commitf77fdbc9d24c0bea82f38ac73cdc1bf9ff00f39a (patch)
treeba754d6438dd50e2081a15723204be88a1d999fc /README.md
parent7e55aaeeed318a13b429d4b23c68569033bae0a3 (diff)
brush up docs
Diffstat (limited to 'README.md')
-rw-r--r--README.md88
1 files changed, 7 insertions, 81 deletions
diff --git a/README.md b/README.md
index 481d065b0..1c6facbbd 100644
--- a/README.md
+++ b/README.md
@@ -61,99 +61,20 @@ fold:
61* to quickly bootstrap usable and useful language server: solution 61* to quickly bootstrap usable and useful language server: solution
62 that covers 80% of Rust code will be useful for IDEs, and will be 62 that covers 80% of Rust code will be useful for IDEs, and will be
63 vastly simpler than 100% solution. 63 vastly simpler than 100% solution.
64 64
65* to understand how the consumer-side of compiler API should look like 65* to understand how the consumer-side of compiler API should look like
66 (especially it's on-demand aspects). If you have 66 (especially it's on-demand aspects). If you have
67 `get_expression_type` function, you can write a ton of purely-IDE 67 `get_expression_type` function, you can write a ton of purely-IDE
68 features on top of it, even if the function is only partially 68 features on top of it, even if the function is only partially
69 correct. Plugin in the precise function afterwards should just make 69 correct. Plugin in the precise function afterwards should just make
70 IDE features more reliable. 70 IDE features more reliable.
71 71
72The long term plan is to merge with the mainline rustc compiler, 72The long term plan is to merge with the mainline rustc compiler,
73probably around the HIR boundary? That is, use rust analyzer for 73probably around the HIR boundary? That is, use rust analyzer for
74parsing, macro expansion and related bits of name resolution, but 74parsing, macro expansion and related bits of name resolution, but
75leave the rest (including type inference and trait selection) to the 75leave the rest (including type inference and trait selection) to the
76existing rustc. 76existing rustc.
77 77
78## Code Walk-Through
79
80### `crates/ra_syntax`
81
82Rust syntax tree structure and parser. See
83[RFC](https://github.com/rust-lang/rfcs/pull/2256) for some design
84notes.
85
86- `yellow`, red/green syntax tree, heavily inspired [by this](https://github.com/apple/swift/tree/ab68f0d4cbf99cdfa672f8ffe18e433fddc8b371/lib/Syntax)
87- `grammar`, the actual parser
88- `parser_api/parser_impl` bridges the tree-agnostic parser from `grammar` with `yellow` trees
89- `grammar.ron` RON description of the grammar, which is used to
90 generate `syntax_kinds` and `ast` modules.
91- `algo`: generic tree algorithms, including `walk` for O(1) stack
92 space tree traversal (this is cool) and `visit` for type-driven
93 visiting the nodes (this is double plus cool, if you understand how
94 `Visitor` works, you understand rust-analyzer).
95
96
97### `crates/ra_editor`
98
99All IDE features which can be implemented if you only have access to a
100single file. `ra_editor` could be used to enhance editing of Rust code
101without the need to fiddle with build-systems, file
102synchronization and such.
103
104In a sense, `ra_editor` is just a bunch of pure functions which take a
105syntax tree as an input.
106
107### `crates/salsa`
108
109An implementation of red-green incremental compilation algorithm from
110rust compiler. It makes all rust-analyzer features on-demand.
111
112
113### `crates/ra_analysis`
114
115A stateful library for analyzing many Rust files as they change.
116`AnalysisHost` is a mutable entity (clojure's atom) which holds
117current state, incorporates changes and handles out `Analysis` --- an
118immutable consistent snapshot of world state at a point in time, which
119actually powers analysis.
120
121
122### `crates/ra_lsp_server`
123
124An LSP implementation which uses `ra_analysis` for managing state and
125`ra_editor` for actually doing useful stuff.
126
127
128### `crates/cli`
129
130A CLI interface to libsyntax
131
132### `crate/tools`
133
134Code-gen tasks, used to develop rust-analyzer:
135
136- `cargo gen-kinds` -- generate `ast` and `syntax_kinds`
137- `cargo gen-tests` -- collect inline tests from grammar
138- `cargo install-code` -- build and install VS Code extension and server
139
140### `editors/code`
141
142VS Code plugin
143
144
145## Performance
146
147Non-incremental, but seems pretty fast:
148
149```
150$ cargo build --release --package ra_cli
151$ wc -l ~/projects/rust/src/libsyntax/parse/parser.rs
1527546 /home/matklad/projects/rust/src/libsyntax/parse/parser.rs
153$ ./target/release/ra_cli parse < ~/projects/rust/src/libsyntax/parse/parser.rs --no-dump > /dev/null
154parsing: 21.067065ms
155```
156
157## Getting in touch 78## Getting in touch
158 79
159@matklad can be found at Rust 80@matklad can be found at Rust
@@ -161,6 +82,11 @@ parsing: 21.067065ms
161#ides-and-editors. 82#ides-and-editors.
162 83
163 84
85## Contributing
86
87See [CONTRIBUTING.md](./CONTRIBUTING.md) and [ARCHITECTURE.md](./ARCHITECTURE.md)
88
89
164## License 90## License
165 91
166Rust analyzer is primarily distributed under the terms of both the MIT 92Rust analyzer is primarily distributed under the terms of both the MIT