diff options
Diffstat (limited to 'docs/dev')
-rw-r--r-- | docs/dev/README.md | 4 | ||||
-rw-r--r-- | docs/dev/debugging.md | 6 | ||||
-rw-r--r-- | docs/dev/lsp-extensions.md | 121 |
3 files changed, 126 insertions, 5 deletions
diff --git a/docs/dev/README.md b/docs/dev/README.md index a20ead0b6..65cc9fc12 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md | |||
@@ -74,7 +74,7 @@ relevant test and execute it (VS Code includes an action for running a single | |||
74 | test). | 74 | test). |
75 | 75 | ||
76 | However, launching a VS Code instance with locally build language server is | 76 | However, launching a VS Code instance with locally build language server is |
77 | possible. There's **"Run Extension (Dev Server)"** launch configuration for this. | 77 | possible. There's **"Run Extension (Debug Build)"** launch configuration for this. |
78 | 78 | ||
79 | In general, I use one of the following workflows for fixing bugs and | 79 | In general, I use one of the following workflows for fixing bugs and |
80 | implementing features. | 80 | implementing features. |
@@ -86,7 +86,7 @@ then just do printf-driven development/debugging. As a sanity check after I'm | |||
86 | done, I use `cargo xtask install --server` and **Reload Window** action in VS | 86 | done, I use `cargo xtask install --server` and **Reload Window** action in VS |
87 | Code to sanity check that the thing works as I expect. | 87 | Code to sanity check that the thing works as I expect. |
88 | 88 | ||
89 | If the problem concerns only the VS Code extension, I use **Run Extension** | 89 | If the problem concerns only the VS Code extension, I use **Run Installed Extension** |
90 | launch configuration from `launch.json`. Notably, this uses the usual | 90 | launch configuration from `launch.json`. Notably, this uses the usual |
91 | `rust-analyzer` binary from `PATH`. For this it is important to have the following | 91 | `rust-analyzer` binary from `PATH`. For this it is important to have the following |
92 | in `setting.json` file: | 92 | in `setting.json` file: |
diff --git a/docs/dev/debugging.md b/docs/dev/debugging.md index 1aa392935..59a83f7d7 100644 --- a/docs/dev/debugging.md +++ b/docs/dev/debugging.md | |||
@@ -22,8 +22,8 @@ where **only** the `rust-analyzer` extension being debugged is enabled. | |||
22 | 22 | ||
23 | ## Debug TypeScript VSCode extension | 23 | ## Debug TypeScript VSCode extension |
24 | 24 | ||
25 | - `Run Extension` - runs the extension with the globally installed `rust-analyzer` binary. | 25 | - `Run Installed Extension` - runs the extension with the globally installed `rust-analyzer` binary. |
26 | - `Run Extension (Dev Server)` - runs extension with the locally built LSP server (`target/debug/rust-analyzer`). | 26 | - `Run Extension (Debug Build)` - runs extension with the locally built LSP server (`target/debug/rust-analyzer`). |
27 | 27 | ||
28 | TypeScript debugging is configured to watch your source edits and recompile. | 28 | TypeScript debugging is configured to watch your source edits and recompile. |
29 | To apply changes to an already running debug process, press <kbd>Ctrl+Shift+P</kbd> and run the following command in your `[Extension Development Host]` | 29 | To apply changes to an already running debug process, press <kbd>Ctrl+Shift+P</kbd> and run the following command in your `[Extension Development Host]` |
@@ -47,7 +47,7 @@ To apply changes to an already running debug process, press <kbd>Ctrl+Shift+P</k | |||
47 | debug = 2 | 47 | debug = 2 |
48 | ``` | 48 | ``` |
49 | 49 | ||
50 | - Select `Run Extension (Dev Server)` to run your locally built `target/debug/rust-analyzer`. | 50 | - Select `Run Extension (Debug Build)` to run your locally built `target/debug/rust-analyzer`. |
51 | 51 | ||
52 | - In the original VSCode window once again select the `Attach To Server` debug configuration. | 52 | - In the original VSCode window once again select the `Attach To Server` debug configuration. |
53 | 53 | ||
diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md new file mode 100644 index 000000000..7c45aef4c --- /dev/null +++ b/docs/dev/lsp-extensions.md | |||
@@ -0,0 +1,121 @@ | |||
1 | # LSP Extensions | ||
2 | |||
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 ;-) ). | ||
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`. | ||
7 | |||
8 | ## `SnippetTextEdit` | ||
9 | |||
10 | **Client Capability:** `{ "snippetTextEdit": boolean }` | ||
11 | |||
12 | If this capability is set, `WorkspaceEdit`s returned from `codeAction` requests might contain `SnippetTextEdit`s instead of usual `TextEdit`s: | ||
13 | |||
14 | ```typescript | ||
15 | interface SnippetTextEdit extends TextEdit { | ||
16 | insertTextFormat?: InsertTextFormat; | ||
17 | } | ||
18 | ``` | ||
19 | |||
20 | ```typescript | ||
21 | export interface TextDocumentEdit { | ||
22 | textDocument: VersionedTextDocumentIdentifier; | ||
23 | edits: (TextEdit | SnippetTextEdit)[]; | ||
24 | } | ||
25 | ``` | ||
26 | |||
27 | When applying such code action, the editor should insert snippet, with tab stops and placeholder. | ||
28 | At the moment, rust-analyzer guarantees that only a single edit will have `InsertTextFormat.Snippet`. | ||
29 | |||
30 | ### Example | ||
31 | |||
32 | "Add `derive`" code action transforms `struct S;` into `#[derive($0)] struct S;` | ||
33 | |||
34 | ### Unresolved Questions | ||
35 | |||
36 | * Where exactly are `SnippetTextEdit`s allowed (only in code actions at the moment)? | ||
37 | * Can snippets span multiple files (so far, no)? | ||
38 | |||
39 | ## `joinLines` | ||
40 | |||
41 | **Server Capability:** `{ "joinLines": boolean }` | ||
42 | |||
43 | This request is send from client to server to handle "Join Lines" editor action. | ||
44 | |||
45 | **Method:** `experimental/JoinLines` | ||
46 | |||
47 | **Request:** | ||
48 | |||
49 | ```typescript | ||
50 | interface JoinLinesParams { | ||
51 | textDocument: TextDocumentIdentifier, | ||
52 | /// Currently active selections/cursor offsets. | ||
53 | /// This is an array to support multiple cursors. | ||
54 | ranges: Range[], | ||
55 | } | ||
56 | ``` | ||
57 | |||
58 | **Response:** | ||
59 | |||
60 | ```typescript | ||
61 | TextEdit[] | ||
62 | ``` | ||
63 | |||
64 | ### Example | ||
65 | |||
66 | ```rust | ||
67 | fn main() { | ||
68 | /*cursor here*/let x = { | ||
69 | 92 | ||
70 | }; | ||
71 | } | ||
72 | ``` | ||
73 | |||
74 | `experimental/joinLines` yields (curly braces are automagiacally removed) | ||
75 | |||
76 | ```rust | ||
77 | fn main() { | ||
78 | let x = 92; | ||
79 | } | ||
80 | ``` | ||
81 | |||
82 | ### Unresolved Question | ||
83 | |||
84 | * What is the position of the cursor after `joinLines`? | ||
85 | Currently this is left to editor's discretion, but it might be useful to specify on the server via snippets. | ||
86 | However, it then becomes unclear how it works with multi cursor. | ||
87 | |||
88 | ## Structural Search Replace (SSR) | ||
89 | |||
90 | **Server Capability:** `{ "ssr": boolean }` | ||
91 | |||
92 | This request is send from client to server to handle structural search replace -- automated syntax tree based transformation of the source. | ||
93 | |||
94 | **Method:** `experimental/ssr` | ||
95 | |||
96 | **Request:** | ||
97 | |||
98 | ```typescript | ||
99 | interface SsrParams { | ||
100 | /// Search query. | ||
101 | /// The specific syntax is specified outside of the protocol. | ||
102 | query: string, | ||
103 | /// If true, only check the syntax of the query and don't compute the actual edit. | ||
104 | parseOnly: bool, | ||
105 | } | ||
106 | ``` | ||
107 | |||
108 | **Response:** | ||
109 | |||
110 | ```typescript | ||
111 | WorkspaceEdit | ||
112 | ``` | ||
113 | |||
114 | ### Example | ||
115 | |||
116 | SSR with query `foo($a:expr, $b:expr) ==>> ($a).foo($b)` will transform, eg `foo(y + 5, z)` into `(y + 5).foo(z)`. | ||
117 | |||
118 | ### Unresolved Question | ||
119 | |||
120 | * Probably needs search without replace mode | ||
121 | * Needs a way to limit the scope to certain files. | ||