aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/rust-analyzer/src/lsp_ext.rs26
-rw-r--r--crates/rust-analyzer/src/main_loop.rs4
-rw-r--r--crates/rust-analyzer/src/main_loop/handlers.rs8
-rw-r--r--docs/dev/lsp-extensions.md109
-rw-r--r--editors/code/src/commands/matching_brace.ts4
-rw-r--r--editors/code/src/rust-analyzer-api.ts7
6 files changed, 131 insertions, 27 deletions
diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs
index c25d90a50..52e4fcbec 100644
--- a/crates/rust-analyzer/src/lsp_ext.rs
+++ b/crates/rust-analyzer/src/lsp_ext.rs
@@ -38,13 +38,6 @@ pub struct SyntaxTreeParams {
38 pub range: Option<Range>, 38 pub range: Option<Range>,
39} 39}
40 40
41#[derive(Deserialize, Serialize, Debug)]
42#[serde(rename_all = "camelCase")]
43pub struct ExpandedMacro {
44 pub name: String,
45 pub expansion: String,
46}
47
48pub enum ExpandMacro {} 41pub enum ExpandMacro {}
49 42
50impl Request for ExpandMacro { 43impl Request for ExpandMacro {
@@ -60,19 +53,26 @@ pub struct ExpandMacroParams {
60 pub position: Option<Position>, 53 pub position: Option<Position>,
61} 54}
62 55
63pub enum FindMatchingBrace {} 56#[derive(Deserialize, Serialize, Debug)]
57#[serde(rename_all = "camelCase")]
58pub struct ExpandedMacro {
59 pub name: String,
60 pub expansion: String,
61}
62
63pub enum MatchingBrace {}
64 64
65impl Request for FindMatchingBrace { 65impl Request for MatchingBrace {
66 type Params = FindMatchingBraceParams; 66 type Params = MatchingBraceParams;
67 type Result = Vec<Position>; 67 type Result = Vec<Position>;
68 const METHOD: &'static str = "rust-analyzer/findMatchingBrace"; 68 const METHOD: &'static str = "experimental/matchingBrace";
69} 69}
70 70
71#[derive(Deserialize, Serialize, Debug)] 71#[derive(Deserialize, Serialize, Debug)]
72#[serde(rename_all = "camelCase")] 72#[serde(rename_all = "camelCase")]
73pub struct FindMatchingBraceParams { 73pub struct MatchingBraceParams {
74 pub text_document: TextDocumentIdentifier, 74 pub text_document: TextDocumentIdentifier,
75 pub offsets: Vec<Position>, 75 pub positions: Vec<Position>,
76} 76}
77 77
78pub enum ParentModule {} 78pub enum ParentModule {}
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 87795fffb..f1287d52c 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -509,9 +509,7 @@ fn on_request(
509 .on_sync::<lsp_types::request::SelectionRangeRequest>(|s, p| { 509 .on_sync::<lsp_types::request::SelectionRangeRequest>(|s, p| {
510 handlers::handle_selection_range(s.snapshot(), p) 510 handlers::handle_selection_range(s.snapshot(), p)
511 })? 511 })?
512 .on_sync::<lsp_ext::FindMatchingBrace>(|s, p| { 512 .on_sync::<lsp_ext::MatchingBrace>(|s, p| handlers::handle_matching_brace(s.snapshot(), p))?
513 handlers::handle_find_matching_brace(s.snapshot(), p)
514 })?
515 .on::<lsp_ext::AnalyzerStatus>(handlers::handle_analyzer_status)? 513 .on::<lsp_ext::AnalyzerStatus>(handlers::handle_analyzer_status)?
516 .on::<lsp_ext::SyntaxTree>(handlers::handle_syntax_tree)? 514 .on::<lsp_ext::SyntaxTree>(handlers::handle_syntax_tree)?
517 .on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)? 515 .on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)?
diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs
index 2aaff3ea4..d73107968 100644
--- a/crates/rust-analyzer/src/main_loop/handlers.rs
+++ b/crates/rust-analyzer/src/main_loop/handlers.rs
@@ -126,15 +126,15 @@ pub fn handle_selection_range(
126 Ok(Some(res?)) 126 Ok(Some(res?))
127} 127}
128 128
129pub fn handle_find_matching_brace( 129pub fn handle_matching_brace(
130 world: WorldSnapshot, 130 world: WorldSnapshot,
131 params: lsp_ext::FindMatchingBraceParams, 131 params: lsp_ext::MatchingBraceParams,
132) -> Result<Vec<Position>> { 132) -> Result<Vec<Position>> {
133 let _p = profile("handle_find_matching_brace"); 133 let _p = profile("handle_matching_brace");
134 let file_id = from_proto::file_id(&world, &params.text_document.uri)?; 134 let file_id = from_proto::file_id(&world, &params.text_document.uri)?;
135 let line_index = world.analysis().file_line_index(file_id)?; 135 let line_index = world.analysis().file_line_index(file_id)?;
136 let res = params 136 let res = params
137 .offsets 137 .positions
138 .into_iter() 138 .into_iter()
139 .map(|position| { 139 .map(|position| {
140 let offset = from_proto::offset(&line_index, position); 140 let offset = from_proto::offset(&line_index, position);
diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md
index 1cc51410b..55035cfae 100644
--- a/docs/dev/lsp-extensions.md
+++ b/docs/dev/lsp-extensions.md
@@ -95,7 +95,7 @@ Invoking code action at this position will yield two code actions for importing
95 95
96This request is send from client to server to handle "Join Lines" editor action. 96This request is send from client to server to handle "Join Lines" editor action.
97 97
98**Method:** `experimental/JoinLines` 98**Method:** `experimental/joinLines`
99 99
100**Request:** 100**Request:**
101 101
@@ -172,3 +172,110 @@ SSR with query `foo($a:expr, $b:expr) ==>> ($a).foo($b)` will transform, eg `foo
172 172
173* Probably needs search without replace mode 173* Probably needs search without replace mode
174* Needs a way to limit the scope to certain files. 174* Needs a way to limit the scope to certain files.
175
176## Matching Brace
177
178**Issue:** https://github.com/microsoft/language-server-protocol/issues/999
179
180**Server Capability:** `{ "matchingBrace": boolean }`
181
182This request is send from client to server to handle "Matching Brace" editor action.
183
184**Method:** `experimental/matchingBrace`
185
186**Request:**
187
188```typescript
189interface MatchingBraceParams {
190 textDocument: TextDocumentIdentifier,
191 /// Position for each cursor
192 positions: Position[],
193}
194```
195
196**Response:**
197
198```typescript
199Position[]
200```
201
202### Example
203
204```rust
205fn main() {
206 let x: Vec<()>/*cursor here*/ = vec![]
207}
208```
209
210`experimental/matchingBrace` yields the position of `<`.
211In many cases, matching braces can be handled by the editor.
212However, some cases (like disambiguating between generics and comparison operations) need a real parser.
213Moreover, it would be cool if editors didn't need to implement even basic language parsing
214
215### Unresolved Question
216
217* Should we return a a nested brace structure, to allow paredit-like actions of jump *out* of the current brace pair?
218 This is how `SelectionRange` request works.
219* Alternatively, should we perhaps flag certain `SelectionRange`s as being brace pairs?
220
221## Analyzer Status
222
223**Method:** `rust-analyzer/analyzerStatus`
224
225**Request:** `null`
226
227**Response:** `string`
228
229Returns internal status message, mostly for debugging purposes.
230
231## Collect Garbage
232
233**Method:** `rust-analyzer/collectGarbage`
234
235**Request:** `null`
236
237**Response:** `null`
238
239Frees some caches. For internal use, and is mostly broken at the moment.
240
241## Syntax Tree
242
243**Method:** `rust-analyzer/syntaxTree`
244
245**Request:**
246
247```typescript
248interface SyntaxTeeParams {
249 textDocument: TextDocumentIdentifier,
250 range?: Range,
251}
252```
253
254**Response:** `string`
255
256Returns textual representation of a parse tree for the file/selected region.
257Primarily for debugging, but very useful for all people working on rust-analyzer itself.
258
259## Expand Macro
260
261**Method:** `rust-analyzer/expandMacro`
262
263**Request:**
264
265```typescript
266interface ExpandMacroParams {
267 textDocument: TextDocumentIdentifier,
268 position?: Position,
269}
270```
271
272**Response:**
273
274```typescript
275interface ExpandedMacro {
276 name: string,
277 expansion: string,
278}
279```
280
281Expands macro call at a given position.
diff --git a/editors/code/src/commands/matching_brace.ts b/editors/code/src/commands/matching_brace.ts
index a60776e2d..9c418b887 100644
--- a/editors/code/src/commands/matching_brace.ts
+++ b/editors/code/src/commands/matching_brace.ts
@@ -9,9 +9,9 @@ export function matchingBrace(ctx: Ctx): Cmd {
9 const client = ctx.client; 9 const client = ctx.client;
10 if (!editor || !client) return; 10 if (!editor || !client) return;
11 11
12 const response = await client.sendRequest(ra.findMatchingBrace, { 12 const response = await client.sendRequest(ra.matchingBrace, {
13 textDocument: { uri: editor.document.uri.toString() }, 13 textDocument: { uri: editor.document.uri.toString() },
14 offsets: editor.selections.map(s => 14 positions: editor.selections.map(s =>
15 client.code2ProtocolConverter.asPosition(s.active), 15 client.code2ProtocolConverter.asPosition(s.active),
16 ), 16 ),
17 }); 17 });
diff --git a/editors/code/src/rust-analyzer-api.ts b/editors/code/src/rust-analyzer-api.ts
index 73f36432f..900c5cd5b 100644
--- a/editors/code/src/rust-analyzer-api.ts
+++ b/editors/code/src/rust-analyzer-api.ts
@@ -40,12 +40,11 @@ export interface ExpandedMacro {
40export const expandMacro = request<ExpandMacroParams, Option<ExpandedMacro>>("expandMacro"); 40export const expandMacro = request<ExpandMacroParams, Option<ExpandedMacro>>("expandMacro");
41 41
42 42
43export interface FindMatchingBraceParams { 43export interface MatchingBraceParams {
44 textDocument: lc.TextDocumentIdentifier; 44 textDocument: lc.TextDocumentIdentifier;
45 offsets: Vec<lc.Position>; 45 positions: lc.Position[];
46} 46}
47export const findMatchingBrace = request<FindMatchingBraceParams, Vec<lc.Position>>("findMatchingBrace"); 47export const matchingBrace = new lc.RequestType<MatchingBraceParams, lc.Position[], unknown>('experimental/matchingBrace');
48
49 48
50export interface PublishDecorationsParams { 49export interface PublishDecorationsParams {
51 uri: string; 50 uri: string;