diff options
Diffstat (limited to 'docs/dev')
-rw-r--r-- | docs/dev/README.md | 105 | ||||
-rw-r--r-- | docs/dev/lsp-extensions.md | 341 | ||||
-rw-r--r-- | docs/dev/lsp-features.md | 72 |
3 files changed, 411 insertions, 107 deletions
diff --git a/docs/dev/README.md b/docs/dev/README.md index 65cc9fc12..1de5a2aab 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md | |||
@@ -30,7 +30,7 @@ https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Fwg-rls-2.2E0 | |||
30 | 30 | ||
31 | * [good-first-issue](https://github.com/rust-analyzer/rust-analyzer/labels/good%20first%20issue) | 31 | * [good-first-issue](https://github.com/rust-analyzer/rust-analyzer/labels/good%20first%20issue) |
32 | are good issues to get into the project. | 32 | are good issues to get into the project. |
33 | * [E-mentor](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-mentor) | 33 | * [E-has-instructions](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-has-instructions) |
34 | issues have links to the code in question and tests. | 34 | issues have links to the code in question and tests. |
35 | * [E-easy](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy), | 35 | * [E-easy](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy), |
36 | [E-medium](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-medium), | 36 | [E-medium](https://github.com/rust-analyzer/rust-analyzer/issues?q=is%3Aopen+is%3Aissue+label%3AE-medium), |
@@ -117,6 +117,109 @@ Additionally, I use `cargo run --release -p rust-analyzer -- analysis-stats | |||
117 | path/to/some/rust/crate` to run a batch analysis. This is primarily useful for | 117 | path/to/some/rust/crate` to run a batch analysis. This is primarily useful for |
118 | performance optimizations, or for bug minimization. | 118 | performance optimizations, or for bug minimization. |
119 | 119 | ||
120 | # Code Style & Review Process | ||
121 | |||
122 | Our approach to "clean code" is two fold: | ||
123 | |||
124 | * We generally don't block PRs on style changes. | ||
125 | * At the same time, all code in rust-analyzer is constantly refactored. | ||
126 | |||
127 | It is explicitly OK for reviewer to flag only some nits in the PR, and than send a follow up cleanup PR for things which are easier to explain by example, cc-ing the original author. | ||
128 | Sending small cleanup PRs (like rename a single local variable) is encouraged. | ||
129 | |||
130 | ## Scale of Changes | ||
131 | |||
132 | Everyone knows that it's better to send small & focused pull requests. | ||
133 | The problem is, sometimes you *have* to, eg, rewrite the whole compiler, and that just doesn't fit into a set of isolated PRs. | ||
134 | |||
135 | The main thing too keep an eye on is the boundaries between various components. | ||
136 | There are three kinds of changes: | ||
137 | |||
138 | 1. Internals of a single component are changed. | ||
139 | Specifically, you don't change any `pub` items. | ||
140 | A good example here would be an addition of a new assist. | ||
141 | |||
142 | 2. API of a component is expanded. | ||
143 | Specifically, you add a new `pub` function which wasn't there before. | ||
144 | A good example here would be expansion of assist API, for example, to implement lazy assists or assists groups. | ||
145 | |||
146 | 3. A new dependency between components is introduced. | ||
147 | Specifically, you add a `pub use` reexport from another crate or you add a new line to `[dependencies]` section of `Cargo.toml`. | ||
148 | A good example here would be adding reference search capability to the assists crates. | ||
149 | |||
150 | For the first group, the change is generally merged as long as: | ||
151 | |||
152 | * it works for the happy case, | ||
153 | * it has tests, | ||
154 | * it doesn't panic for unhappy case. | ||
155 | |||
156 | For the second group, the change would be subjected to quite a bit of scrutiny and iteration. | ||
157 | The new API needs to be right (or at least easy to change later). | ||
158 | The actual implementation doesn't matter that much. | ||
159 | It's very important to minimize the amount of changed lines of code for changes of the second kind. | ||
160 | Often, you start doing change of the first kind, only to realise that you need to elevate to a change of the second kind. | ||
161 | In this case, we'll probably ask you to split API changes into a separate PR. | ||
162 | |||
163 | Changes of the third group should be pretty rare, so we don't specify any specific process for them. | ||
164 | That said, adding an innocent-looking `pub use` is a very simple way to break encapsulation, keep an eye on it! | ||
165 | |||
166 | Note: if you enjoyed this abstract hand-waving about boundaries, you might appreciate | ||
167 | https://www.tedinski.com/2018/02/06/system-boundaries.html | ||
168 | |||
169 | ## Order of Imports | ||
170 | |||
171 | We separate import groups with blank lines | ||
172 | |||
173 | ``` | ||
174 | mod x; | ||
175 | mod y; | ||
176 | |||
177 | use std::{ ... } | ||
178 | |||
179 | use crate_foo::{ ... } | ||
180 | use crate_bar::{ ... } | ||
181 | |||
182 | use crate::{} | ||
183 | |||
184 | use super::{} // but prefer `use crate::` | ||
185 | ``` | ||
186 | |||
187 | ## Order of Items | ||
188 | |||
189 | Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on. | ||
190 | People read things from top to bottom, so place most important things first. | ||
191 | |||
192 | Specifically, if all items except one are private, always put the non-private item on top. | ||
193 | |||
194 | Put `struct`s and `enum`s first, functions and impls last. | ||
195 | |||
196 | Do | ||
197 | |||
198 | ``` | ||
199 | // Good | ||
200 | struct Foo { | ||
201 | bars: Vec<Bar> | ||
202 | } | ||
203 | |||
204 | struct Bar; | ||
205 | ``` | ||
206 | |||
207 | rather than | ||
208 | |||
209 | ``` | ||
210 | // Not as good | ||
211 | struct Bar; | ||
212 | |||
213 | struct Foo { | ||
214 | bars: Vec<Bar> | ||
215 | } | ||
216 | ``` | ||
217 | |||
218 | ## Documentation | ||
219 | |||
220 | For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. | ||
221 | If the line is too long, you want to split the sentence in two :-) | ||
222 | |||
120 | # Logging | 223 | # Logging |
121 | 224 | ||
122 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to | 225 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to |
diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md index 158d3c599..647cf6107 100644 --- a/docs/dev/lsp-extensions.md +++ b/docs/dev/lsp-extensions.md | |||
@@ -3,7 +3,19 @@ | |||
3 | This document describes LSP extensions used by rust-analyzer. | 3 | This document describes LSP extensions used by rust-analyzer. |
4 | It's a best effort document, when in doubt, consult the source (and send a PR with clarification ;-) ). | 4 | It's a best effort document, when in doubt, consult the source (and send a PR with clarification ;-) ). |
5 | We aim to upstream all non Rust-specific extensions to the protocol, but this is not a top priority. | 5 | We aim to upstream all non Rust-specific extensions to the protocol, but this is not a top priority. |
6 | All capabilities are enabled via `experimental` field of `ClientCapabilities`. | 6 | All capabilities are enabled via `experimental` field of `ClientCapabilities` or `ServerCapabilities`. |
7 | Requests which we hope to upstream live under `experimental/` namespace. | ||
8 | Requests, which are likely to always remain specific to `rust-analyzer` are under `rust-analyzer/` namespace. | ||
9 | |||
10 | If you want to be notified about the changes to this document, subscribe to [#4604](https://github.com/rust-analyzer/rust-analyzer/issues/4604). | ||
11 | |||
12 | ## `initializationOptions` | ||
13 | |||
14 | As `initializationOptions`, `rust-analyzer` expects `"rust-analyzer"` section of the configuration. | ||
15 | That is, `rust-analyzer` usually sends `"workspace/configuration"` request with `{ "items": ["rust-analyzer"] }` payload. | ||
16 | `initializationOptions` should contain the same data that would be in the first item of the result. | ||
17 | It's OK to not send anything, then all the settings would take their default values. | ||
18 | However, some settings can not be changed after startup at the moment. | ||
7 | 19 | ||
8 | ## Snippet `TextEdit` | 20 | ## Snippet `TextEdit` |
9 | 21 | ||
@@ -38,6 +50,87 @@ At the moment, rust-analyzer guarantees that only a single edit will have `Inser | |||
38 | * Where exactly are `SnippetTextEdit`s allowed (only in code actions at the moment)? | 50 | * Where exactly are `SnippetTextEdit`s allowed (only in code actions at the moment)? |
39 | * Can snippets span multiple files (so far, no)? | 51 | * Can snippets span multiple files (so far, no)? |
40 | 52 | ||
53 | ## `CodeAction` Groups | ||
54 | |||
55 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/994 | ||
56 | |||
57 | **Client Capability:** `{ "codeActionGroup": boolean }` | ||
58 | |||
59 | If this capability is set, `CodeAction` returned from the server contain an additional field, `group`: | ||
60 | |||
61 | ```typescript | ||
62 | interface CodeAction { | ||
63 | title: string; | ||
64 | group?: string; | ||
65 | ... | ||
66 | } | ||
67 | ``` | ||
68 | |||
69 | All code-actions with the same `group` should be grouped under single (extendable) entry in lightbulb menu. | ||
70 | The set of actions `[ { title: "foo" }, { group: "frobnicate", title: "bar" }, { group: "frobnicate", title: "baz" }]` should be rendered as | ||
71 | |||
72 | ``` | ||
73 | 💡 | ||
74 | +-------------+ | ||
75 | | foo | | ||
76 | +-------------+-----+ | ||
77 | | frobnicate >| bar | | ||
78 | +-------------+-----+ | ||
79 | | baz | | ||
80 | +-----+ | ||
81 | ``` | ||
82 | |||
83 | Alternatively, selecting `frobnicate` could present a user with an additional menu to choose between `bar` and `baz`. | ||
84 | |||
85 | ### Example | ||
86 | |||
87 | ```rust | ||
88 | fn main() { | ||
89 | let x: Entry/*cursor here*/ = todo!(); | ||
90 | } | ||
91 | ``` | ||
92 | |||
93 | Invoking code action at this position will yield two code actions for importing `Entry` from either `collections::HashMap` or `collection::BTreeMap`, grouped under a single "import" group. | ||
94 | |||
95 | ### Unresolved Questions | ||
96 | |||
97 | * Is a fixed two-level structure enough? | ||
98 | * Should we devise a general way to encode custom interaction protocols for GUI refactorings? | ||
99 | |||
100 | ## Parent Module | ||
101 | |||
102 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/1002 | ||
103 | |||
104 | **Server Capability:** `{ "parentModule": boolean }` | ||
105 | |||
106 | This request is send from client to server to handle "Goto Parent Module" editor action. | ||
107 | |||
108 | **Method:** `experimental/parentModule` | ||
109 | |||
110 | **Request:** `TextDocumentPositionParams` | ||
111 | |||
112 | **Response:** `Location | Location[] | LocationLink[] | null` | ||
113 | |||
114 | |||
115 | ### Example | ||
116 | |||
117 | ```rust | ||
118 | // src/main.rs | ||
119 | mod foo; | ||
120 | // src/foo.rs | ||
121 | |||
122 | /* cursor here*/ | ||
123 | ``` | ||
124 | |||
125 | `experimental/parentModule` returns a single `Link` to the `mod foo;` declaration. | ||
126 | |||
127 | ### Unresolved Question | ||
128 | |||
129 | * An alternative would be to use a more general "gotoSuper" request, which would work for super methods, super classes and super modules. | ||
130 | This is the approach IntelliJ Rust is takeing. | ||
131 | However, experience shows that super module (which generally has a feeling of navigation between files) should be separate. | ||
132 | If you want super module, but the cursor happens to be inside an overriden function, the behavior with single "gotoSuper" request is surprising. | ||
133 | |||
41 | ## Join Lines | 134 | ## Join Lines |
42 | 135 | ||
43 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/992 | 136 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/992 |
@@ -46,7 +139,7 @@ At the moment, rust-analyzer guarantees that only a single edit will have `Inser | |||
46 | 139 | ||
47 | This request is send from client to server to handle "Join Lines" editor action. | 140 | This request is send from client to server to handle "Join Lines" editor action. |
48 | 141 | ||
49 | **Method:** `experimental/JoinLines` | 142 | **Method:** `experimental/joinLines` |
50 | 143 | ||
51 | **Request:** | 144 | **Request:** |
52 | 145 | ||
@@ -59,11 +152,7 @@ interface JoinLinesParams { | |||
59 | } | 152 | } |
60 | ``` | 153 | ``` |
61 | 154 | ||
62 | **Response:** | 155 | **Response:** `TextEdit[]` |
63 | |||
64 | ```typescript | ||
65 | TextEdit[] | ||
66 | ``` | ||
67 | 156 | ||
68 | ### Example | 157 | ### Example |
69 | 158 | ||
@@ -75,7 +164,7 @@ fn main() { | |||
75 | } | 164 | } |
76 | ``` | 165 | ``` |
77 | 166 | ||
78 | `experimental/joinLines` yields (curly braces are automagiacally removed) | 167 | `experimental/joinLines` yields (curly braces are automagically removed) |
79 | 168 | ||
80 | ```rust | 169 | ```rust |
81 | fn main() { | 170 | fn main() { |
@@ -89,6 +178,59 @@ fn main() { | |||
89 | Currently this is left to editor's discretion, but it might be useful to specify on the server via snippets. | 178 | Currently this is left to editor's discretion, but it might be useful to specify on the server via snippets. |
90 | However, it then becomes unclear how it works with multi cursor. | 179 | However, it then becomes unclear how it works with multi cursor. |
91 | 180 | ||
181 | ## On Enter | ||
182 | |||
183 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/1001 | ||
184 | |||
185 | **Server Capability:** `{ "onEnter": boolean }` | ||
186 | |||
187 | This request is send from client to server to handle <kbd>Enter</kbd> keypress. | ||
188 | |||
189 | **Method:** `experimental/onEnter` | ||
190 | |||
191 | **Request:**: `TextDocumentPositionParams` | ||
192 | |||
193 | **Response:** | ||
194 | |||
195 | ```typescript | ||
196 | SnippetTextEdit[] | ||
197 | ``` | ||
198 | |||
199 | ### Example | ||
200 | |||
201 | ```rust | ||
202 | fn main() { | ||
203 | // Some /*cursor here*/ docs | ||
204 | let x = 92; | ||
205 | } | ||
206 | ``` | ||
207 | |||
208 | `experimental/onEnter` returns the following snippet | ||
209 | |||
210 | ```rust | ||
211 | fn main() { | ||
212 | // Some | ||
213 | // $0 docs | ||
214 | let x = 92; | ||
215 | } | ||
216 | ``` | ||
217 | |||
218 | The primary goal of `onEnter` is to handle automatic indentation when opening a new line. | ||
219 | This is not yet implemented. | ||
220 | The secondary goal is to handle fixing up syntax, like continuing doc strings and comments, and escaping `\n` in string literals. | ||
221 | |||
222 | As proper cursor positioning is raison-d'etat for `onEnter`, it uses `SnippetTextEdit`. | ||
223 | |||
224 | ### Unresolved Question | ||
225 | |||
226 | * How to deal with synchronicity of the request? | ||
227 | One option is to require the client to block until the server returns the response. | ||
228 | Another option is to do a OT-style merging of edits from client and server. | ||
229 | A third option is to do a record-replay: client applies heuristic on enter immediatelly, then applies all user's keypresses. | ||
230 | When the server is ready with the response, the client rollbacks all the changes and applies the recorded actions on top of the correct response. | ||
231 | * How to deal with multiple carets? | ||
232 | * Should we extend this to arbitrary typed events and not just `onEnter`? | ||
233 | |||
92 | ## Structural Search Replace (SSR) | 234 | ## Structural Search Replace (SSR) |
93 | 235 | ||
94 | **Server Capability:** `{ "ssr": boolean }` | 236 | **Server Capability:** `{ "ssr": boolean }` |
@@ -124,49 +266,180 @@ SSR with query `foo($a:expr, $b:expr) ==>> ($a).foo($b)` will transform, eg `foo | |||
124 | * Probably needs search without replace mode | 266 | * Probably needs search without replace mode |
125 | * Needs a way to limit the scope to certain files. | 267 | * Needs a way to limit the scope to certain files. |
126 | 268 | ||
127 | ## `CodeAction` Groups | 269 | ## Matching Brace |
128 | 270 | ||
129 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/994 | 271 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/999 |
130 | 272 | ||
131 | **Client Capability:** `{ "codeActionGroup": boolean }` | 273 | **Server Capability:** `{ "matchingBrace": boolean }` |
132 | 274 | ||
133 | If this capability is set, `CodeAction` returned from the server contain an additional field, `group`: | 275 | This request is send from client to server to handle "Matching Brace" editor action. |
276 | |||
277 | **Method:** `experimental/matchingBrace` | ||
278 | |||
279 | **Request:** | ||
134 | 280 | ||
135 | ```typescript | 281 | ```typescript |
136 | interface CodeAction { | 282 | interface MatchingBraceParams { |
137 | title: string; | 283 | textDocument: TextDocumentIdentifier, |
138 | group?: string; | 284 | /// Position for each cursor |
139 | ... | 285 | positions: Position[], |
140 | } | 286 | } |
141 | ``` | 287 | ``` |
142 | 288 | ||
143 | All code-actions with the same `group` should be grouped under single (extendable) entry in lightbulb menu. | 289 | **Response:** |
144 | The set of actions `[ { title: "foo" }, { group: "frobnicate", title: "bar" }, { group: "frobnicate", title: "baz" }]` should be rendered as | ||
145 | 290 | ||
146 | ``` | 291 | ```typescript |
147 | 💡 | 292 | Position[] |
148 | +-------------+ | ||
149 | | foo | | ||
150 | +-------------+-----+ | ||
151 | | frobnicate >| bar | | ||
152 | +-------------+-----+ | ||
153 | | baz | | ||
154 | +-----+ | ||
155 | ``` | 293 | ``` |
156 | 294 | ||
157 | Alternatively, selecting `frobnicate` could present a user with an additional menu to choose between `bar` and `baz`. | ||
158 | |||
159 | ### Example | 295 | ### Example |
160 | 296 | ||
161 | ```rust | 297 | ```rust |
162 | fn main() { | 298 | fn main() { |
163 | let x: Entry/*cursor here*/ = todo!(); | 299 | let x: Vec<()>/*cursor here*/ = vec![] |
164 | } | 300 | } |
165 | ``` | 301 | ``` |
166 | 302 | ||
167 | Invoking code action at this position will yield two code actions for importing `Entry` from either `collections::HashMap` or `collection::BTreeMap`, grouped under a single "import" group. | 303 | `experimental/matchingBrace` yields the position of `<`. |
304 | In many cases, matching braces can be handled by the editor. | ||
305 | However, some cases (like disambiguating between generics and comparison operations) need a real parser. | ||
306 | Moreover, it would be cool if editors didn't need to implement even basic language parsing | ||
168 | 307 | ||
169 | ### Unresolved Questions | 308 | ### Unresolved Question |
170 | 309 | ||
171 | * Is a fixed two-level structure enough? | 310 | * Should we return a a nested brace structure, to allow paredit-like actions of jump *out* of the current brace pair? |
172 | * Should we devise a general way to encode custom interaction protocols for GUI refactorings? | 311 | This is how `SelectionRange` request works. |
312 | * Alternatively, should we perhaps flag certain `SelectionRange`s as being brace pairs? | ||
313 | |||
314 | ## Runnables | ||
315 | |||
316 | **Issue:** https://github.com/microsoft/language-server-protocol/issues/944 | ||
317 | |||
318 | **Server Capability:** `{ "runnables": { "kinds": string[] } }` | ||
319 | |||
320 | This request is send from client to server to get the list of things that can be run (tests, binaries, `cargo check -p`). | ||
321 | |||
322 | **Method:** `experimental/runnables` | ||
323 | |||
324 | **Request:** | ||
325 | |||
326 | ```typescript | ||
327 | interface RunnablesParams { | ||
328 | textDocument: TextDocumentIdentifier; | ||
329 | /// If null, compute runnables for the whole file. | ||
330 | position?: Position; | ||
331 | } | ||
332 | ``` | ||
333 | |||
334 | **Response:** `Runnable[]` | ||
335 | |||
336 | ```typescript | ||
337 | interface Runnable { | ||
338 | label: string; | ||
339 | /// If this Runnable is associated with a specific function/module, etc, the location of this item | ||
340 | location?: LocationLink; | ||
341 | /// Running things is necessary technology specific, `kind` needs to be advertised via server capabilities, | ||
342 | // the type of `args` is specific to `kind`. The actual running is handled by the client. | ||
343 | kind: string; | ||
344 | args: any; | ||
345 | } | ||
346 | ``` | ||
347 | |||
348 | rust-analyzer supports only one `kind`, `"cargo"`. The `args` for `"cargo"` look like this: | ||
349 | |||
350 | ```typescript | ||
351 | { | ||
352 | workspaceRoot?: string; | ||
353 | cargoArgs: string[]; | ||
354 | executableArgs: string[]; | ||
355 | } | ||
356 | ``` | ||
357 | |||
358 | ## Analyzer Status | ||
359 | |||
360 | **Method:** `rust-analyzer/analyzerStatus` | ||
361 | |||
362 | **Request:** `null` | ||
363 | |||
364 | **Response:** `string` | ||
365 | |||
366 | Returns internal status message, mostly for debugging purposes. | ||
367 | |||
368 | ## Collect Garbage | ||
369 | |||
370 | **Method:** `rust-analyzer/collectGarbage` | ||
371 | |||
372 | **Request:** `null` | ||
373 | |||
374 | **Response:** `null` | ||
375 | |||
376 | Frees some caches. For internal use, and is mostly broken at the moment. | ||
377 | |||
378 | ## Syntax Tree | ||
379 | |||
380 | **Method:** `rust-analyzer/syntaxTree` | ||
381 | |||
382 | **Request:** | ||
383 | |||
384 | ```typescript | ||
385 | interface SyntaxTeeParams { | ||
386 | textDocument: TextDocumentIdentifier, | ||
387 | range?: Range, | ||
388 | } | ||
389 | ``` | ||
390 | |||
391 | **Response:** `string` | ||
392 | |||
393 | Returns textual representation of a parse tree for the file/selected region. | ||
394 | Primarily for debugging, but very useful for all people working on rust-analyzer itself. | ||
395 | |||
396 | ## Expand Macro | ||
397 | |||
398 | **Method:** `rust-analyzer/expandMacro` | ||
399 | |||
400 | **Request:** | ||
401 | |||
402 | ```typescript | ||
403 | interface ExpandMacroParams { | ||
404 | textDocument: TextDocumentIdentifier, | ||
405 | position: Position, | ||
406 | } | ||
407 | ``` | ||
408 | |||
409 | **Response:** | ||
410 | |||
411 | ```typescript | ||
412 | interface ExpandedMacro { | ||
413 | name: string, | ||
414 | expansion: string, | ||
415 | } | ||
416 | ``` | ||
417 | |||
418 | Expands macro call at a given position. | ||
419 | |||
420 | ## Inlay Hints | ||
421 | |||
422 | **Method:** `rust-analyzer/inlayHints` | ||
423 | |||
424 | This request is send from client to server to render "inlay hints" -- virtual text inserted into editor to show things like inferred types. | ||
425 | Generally, the client should re-query inlay hints after every modification. | ||
426 | Note that we plan to move this request to `experimental/inlayHints`, as it is not really Rust-specific, but the current API is not necessary the right one. | ||
427 | Upstream issue: https://github.com/microsoft/language-server-protocol/issues/956 | ||
428 | |||
429 | **Request:** | ||
430 | |||
431 | ```typescript | ||
432 | interface InlayHintsParams { | ||
433 | textDocument: TextDocumentIdentifier, | ||
434 | } | ||
435 | ``` | ||
436 | |||
437 | **Response:** `InlayHint[]` | ||
438 | |||
439 | ```typescript | ||
440 | interface InlayHint { | ||
441 | kind: "TypeHint" | "ParameterHint" | "ChainingHint", | ||
442 | range: Range, | ||
443 | label: string, | ||
444 | } | ||
445 | ``` | ||
diff --git a/docs/dev/lsp-features.md b/docs/dev/lsp-features.md deleted file mode 100644 index 00b0867d7..000000000 --- a/docs/dev/lsp-features.md +++ /dev/null | |||
@@ -1,72 +0,0 @@ | |||
1 | # Supported LSP features | ||
2 | |||
3 | This list documents LSP features, supported by rust-analyzer. | ||
4 | |||
5 | ## General | ||
6 | - [x] [initialize](https://microsoft.github.io/language-server-protocol/specification#initialize) | ||
7 | - [x] [initialized](https://microsoft.github.io/language-server-protocol/specification#initialized) | ||
8 | - [x] [shutdown](https://microsoft.github.io/language-server-protocol/specification#shutdown) | ||
9 | - [ ] [exit](https://microsoft.github.io/language-server-protocol/specification#exit) | ||
10 | - [x] [$/cancelRequest](https://microsoft.github.io/language-server-protocol/specification#cancelRequest) | ||
11 | |||
12 | ## Workspace | ||
13 | - [ ] [workspace/workspaceFolders](https://microsoft.github.io/language-server-protocol/specification#workspace_workspaceFolders) | ||
14 | - [ ] [workspace/didChangeWorkspaceFolders](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWorkspaceFolders) | ||
15 | - [x] [workspace/didChangeConfiguration](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeConfiguration) | ||
16 | - [ ] [workspace/configuration](https://microsoft.github.io/language-server-protocol/specification#workspace_configuration) | ||
17 | - [x] [workspace/didChangeWatchedFiles](https://microsoft.github.io/language-server-protocol/specification#workspace_didChangeWatchedFiles) | ||
18 | - [x] [workspace/symbol](https://microsoft.github.io/language-server-protocol/specification#workspace_symbol) | ||
19 | - [ ] [workspace/applyEdit](https://microsoft.github.io/language-server-protocol/specification#workspace_applyEdit) | ||
20 | |||
21 | ## Text Synchronization | ||
22 | - [x] [textDocument/didOpen](https://microsoft.github.io/language-server-protocol/specification#textDocument_didOpen) | ||
23 | - [x] [textDocument/didChange](https://microsoft.github.io/language-server-protocol/specification#textDocument_didChange) | ||
24 | - [ ] [textDocument/willSave](https://microsoft.github.io/language-server-protocol/specification#textDocument_willSave) | ||
25 | - [ ] [textDocument/willSaveWaitUntil](https://microsoft.github.io/language-server-protocol/specification#textDocument_willSaveWaitUntil) | ||
26 | - [x] [textDocument/didSave](https://microsoft.github.io/language-server-protocol/specification#textDocument_didSave) | ||
27 | - [x] [textDocument/didClose](https://microsoft.github.io/language-server-protocol/specification#textDocument_didClose) | ||
28 | |||
29 | ## Diagnostics | ||
30 | - [x] [textDocument/publishDiagnostics](https://microsoft.github.io/language-server-protocol/specification#textDocument_publishDiagnostics) | ||
31 | |||
32 | ## Lanuguage Features | ||
33 | - [x] [textDocument/completion](https://microsoft.github.io/language-server-protocol/specification#textDocument_completion) | ||
34 | - open close: false | ||
35 | - change: Full | ||
36 | - will save: false | ||
37 | - will save wait until: false | ||
38 | - save: false | ||
39 | - [x] [completionItem/resolve](https://microsoft.github.io/language-server-protocol/specification#completionItem_resolve) | ||
40 | - resolve provider: none | ||
41 | - trigger characters: `:`, `.` | ||
42 | - [x] [textDocument/hover](https://microsoft.github.io/language-server-protocol/specification#textDocument_hover) | ||
43 | - [x] [textDocument/signatureHelp](https://microsoft.github.io/language-server-protocol/specification#textDocument_signatureHelp) | ||
44 | - trigger characters: `(`, `,` | ||
45 | - [ ] [textDocument/declaration](https://microsoft.github.io/language-server-protocol/specification#textDocument_declaration) | ||
46 | - [x] [textDocument/definition](https://microsoft.github.io/language-server-protocol/specification#textDocument_definition) | ||
47 | - [x] [textDocument/typeDefinition](https://microsoft.github.io/language-server-protocol/specification#textDocument_typeDefinition) | ||
48 | - [x] [textDocument/implementation](https://microsoft.github.io/language-server-protocol/specification#textDocument_implementation) | ||
49 | - [x] [textDocument/references](https://microsoft.github.io/language-server-protocol/specification#textDocument_references) | ||
50 | - [x] [textDocument/documentHighlight](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentHighlight) | ||
51 | - [x] [textDocument/documentSymbol](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentSymbol) | ||
52 | - [x] [textDocument/codeAction](https://microsoft.github.io/language-server-protocol/specification#textDocument_codeAction) | ||
53 | - [x] [textDocument/selectionRange](https://github.com/Microsoft/language-server-protocol/issues/613) | ||
54 | - rust-analyzer.syntaxTree | ||
55 | - rust-analyzer.matchingBrace | ||
56 | - rust-analyzer.parentModule | ||
57 | - rust-analyzer.joinLines | ||
58 | - rust-analyzer.run | ||
59 | - rust-analyzer.analyzerStatus | ||
60 | - [x] [textDocument/codeLens](https://microsoft.github.io/language-server-protocol/specification#textDocument_codeLens) | ||
61 | - [x] [codeLens/resolve](https://microsoft.github.io/language-server-protocol/specification#codeLens_resolve) | ||
62 | - [ ] [documentLink/resolve](https://microsoft.github.io/language-server-protocol/specification#documentLink_resolve) | ||
63 | - [ ] [textDocument/documentColor](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor) | ||
64 | - [ ] [textDocument/colorPresentation](https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation) | ||
65 | - [x] [textDocument/formatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_formatting) | ||
66 | - [ ] [textDocument/rangeFormatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_rangeFormatting) | ||
67 | - [x] [textDocument/onTypeFormatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_onTypeFormatting) | ||
68 | - first trigger character: `=` | ||
69 | - more trigger character `.` | ||
70 | - [x] [textDocument/rename](https://microsoft.github.io/language-server-protocol/specification#textDocument_rename) | ||
71 | - [x] [textDocument/prepareRename](https://microsoft.github.io/language-server-protocol/specification#textDocument_prepareRename) | ||
72 | - [x] [textDocument/foldingRange](https://microsoft.github.io/language-server-protocol/specification#textDocument_foldingRange) | ||