diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 88 |
1 files changed, 7 insertions, 81 deletions
@@ -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 | ||
72 | The long term plan is to merge with the mainline rustc compiler, | 72 | The long term plan is to merge with the mainline rustc compiler, |
73 | probably around the HIR boundary? That is, use rust analyzer for | 73 | probably around the HIR boundary? That is, use rust analyzer for |
74 | parsing, macro expansion and related bits of name resolution, but | 74 | parsing, macro expansion and related bits of name resolution, but |
75 | leave the rest (including type inference and trait selection) to the | 75 | leave the rest (including type inference and trait selection) to the |
76 | existing rustc. | 76 | existing rustc. |
77 | 77 | ||
78 | ## Code Walk-Through | ||
79 | |||
80 | ### `crates/ra_syntax` | ||
81 | |||
82 | Rust syntax tree structure and parser. See | ||
83 | [RFC](https://github.com/rust-lang/rfcs/pull/2256) for some design | ||
84 | notes. | ||
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 | |||
99 | All IDE features which can be implemented if you only have access to a | ||
100 | single file. `ra_editor` could be used to enhance editing of Rust code | ||
101 | without the need to fiddle with build-systems, file | ||
102 | synchronization and such. | ||
103 | |||
104 | In a sense, `ra_editor` is just a bunch of pure functions which take a | ||
105 | syntax tree as an input. | ||
106 | |||
107 | ### `crates/salsa` | ||
108 | |||
109 | An implementation of red-green incremental compilation algorithm from | ||
110 | rust compiler. It makes all rust-analyzer features on-demand. | ||
111 | |||
112 | |||
113 | ### `crates/ra_analysis` | ||
114 | |||
115 | A stateful library for analyzing many Rust files as they change. | ||
116 | `AnalysisHost` is a mutable entity (clojure's atom) which holds | ||
117 | current state, incorporates changes and handles out `Analysis` --- an | ||
118 | immutable consistent snapshot of world state at a point in time, which | ||
119 | actually powers analysis. | ||
120 | |||
121 | |||
122 | ### `crates/ra_lsp_server` | ||
123 | |||
124 | An LSP implementation which uses `ra_analysis` for managing state and | ||
125 | `ra_editor` for actually doing useful stuff. | ||
126 | |||
127 | |||
128 | ### `crates/cli` | ||
129 | |||
130 | A CLI interface to libsyntax | ||
131 | |||
132 | ### `crate/tools` | ||
133 | |||
134 | Code-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 | |||
142 | VS Code plugin | ||
143 | |||
144 | |||
145 | ## Performance | ||
146 | |||
147 | Non-incremental, but seems pretty fast: | ||
148 | |||
149 | ``` | ||
150 | $ cargo build --release --package ra_cli | ||
151 | $ wc -l ~/projects/rust/src/libsyntax/parse/parser.rs | ||
152 | 7546 /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 | ||
154 | parsing: 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 | |||
87 | See [CONTRIBUTING.md](./CONTRIBUTING.md) and [ARCHITECTURE.md](./ARCHITECTURE.md) | ||
88 | |||
89 | |||
164 | ## License | 90 | ## License |
165 | 91 | ||
166 | Rust analyzer is primarily distributed under the terms of both the MIT | 92 | Rust analyzer is primarily distributed under the terms of both the MIT |