diff options
author | Aleksey Kladov <[email protected]> | 2018-08-27 22:20:59 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-27 22:20:59 +0100 |
commit | 8f5330cb0796670a93089107c8b15cdef3fa7c94 (patch) | |
tree | 02ce05a2222adb4ab1fb3464da926ec0fd0fb234 /crates/server/src | |
parent | 010075be6a6b866f6a3f981a61ad2e746cb44f00 (diff) |
More robust highlighting
Diffstat (limited to 'crates/server/src')
-rw-r--r-- | crates/server/src/main_loop/handlers.rs | 21 | ||||
-rw-r--r-- | crates/server/src/main_loop/mod.rs | 4 | ||||
-rw-r--r-- | crates/server/src/req.rs | 8 |
3 files changed, 30 insertions, 3 deletions
diff --git a/crates/server/src/main_loop/handlers.rs b/crates/server/src/main_loop/handlers.rs index ee4072084..ec5421f06 100644 --- a/crates/server/src/main_loop/handlers.rs +++ b/crates/server/src/main_loop/handlers.rs | |||
@@ -7,7 +7,7 @@ use languageserver_types::{ | |||
7 | CompletionItem, | 7 | CompletionItem, |
8 | }; | 8 | }; |
9 | use serde_json::{to_value, from_value}; | 9 | use serde_json::{to_value, from_value}; |
10 | use libanalysis::{Query, QuickFix}; | 10 | use libanalysis::{Query, QuickFix, FileId}; |
11 | use libeditor; | 11 | use libeditor; |
12 | use libsyntax2::{ | 12 | use libsyntax2::{ |
13 | TextUnit, | 13 | TextUnit, |
@@ -401,18 +401,33 @@ pub fn publish_diagnostics( | |||
401 | Ok(req::PublishDiagnosticsParams { uri, diagnostics }) | 401 | Ok(req::PublishDiagnosticsParams { uri, diagnostics }) |
402 | } | 402 | } |
403 | 403 | ||
404 | pub fn handle_decorations( | ||
405 | world: ServerWorld, | ||
406 | params: TextDocumentIdentifier, | ||
407 | ) -> Result<Vec<Decoration>> { | ||
408 | let file_id = params.try_conv_with(&world)?; | ||
409 | highlight(&world, file_id) | ||
410 | } | ||
411 | |||
404 | pub fn publish_decorations( | 412 | pub fn publish_decorations( |
405 | world: ServerWorld, | 413 | world: ServerWorld, |
406 | uri: Url | 414 | uri: Url |
407 | ) -> Result<req::PublishDecorationsParams> { | 415 | ) -> Result<req::PublishDecorationsParams> { |
408 | let file_id = world.uri_to_file_id(&uri)?; | 416 | let file_id = world.uri_to_file_id(&uri)?; |
417 | Ok(req::PublishDecorationsParams { | ||
418 | uri, | ||
419 | decorations: highlight(&world, file_id)? | ||
420 | }) | ||
421 | } | ||
422 | |||
423 | fn highlight(world: &ServerWorld, file_id: FileId) -> Result<Vec<Decoration>> { | ||
409 | let file = world.analysis().file_syntax(file_id)?; | 424 | let file = world.analysis().file_syntax(file_id)?; |
410 | let line_index = world.analysis().file_line_index(file_id)?; | 425 | let line_index = world.analysis().file_line_index(file_id)?; |
411 | let decorations = libeditor::highlight(&file) | 426 | let res = libeditor::highlight(&file) |
412 | .into_iter() | 427 | .into_iter() |
413 | .map(|h| Decoration { | 428 | .map(|h| Decoration { |
414 | range: h.range.conv_with(&line_index), | 429 | range: h.range.conv_with(&line_index), |
415 | tag: h.tag, | 430 | tag: h.tag, |
416 | }).collect(); | 431 | }).collect(); |
417 | Ok(req::PublishDecorationsParams { uri, decorations }) | 432 | Ok(res) |
418 | } | 433 | } |
diff --git a/crates/server/src/main_loop/mod.rs b/crates/server/src/main_loop/mod.rs index 6d6ca6ae9..da1121cb4 100644 --- a/crates/server/src/main_loop/mod.rs +++ b/crates/server/src/main_loop/mod.rs | |||
@@ -30,6 +30,7 @@ use { | |||
30 | handle_join_lines, | 30 | handle_join_lines, |
31 | handle_completion, | 31 | handle_completion, |
32 | handle_runnables, | 32 | handle_runnables, |
33 | handle_decorations, | ||
33 | }, | 34 | }, |
34 | }; | 35 | }; |
35 | 36 | ||
@@ -157,6 +158,9 @@ fn on_request( | |||
157 | handle_request_on_threadpool::<req::JoinLines>( | 158 | handle_request_on_threadpool::<req::JoinLines>( |
158 | &mut req, pool, world, sender, handle_join_lines, | 159 | &mut req, pool, world, sender, handle_join_lines, |
159 | )?; | 160 | )?; |
161 | handle_request_on_threadpool::<req::DecorationsRequest>( | ||
162 | &mut req, pool, world, sender, handle_decorations, | ||
163 | )?; | ||
160 | dispatch::handle_request::<req::ExecuteCommand, _>(&mut req, |params, resp| { | 164 | dispatch::handle_request::<req::ExecuteCommand, _>(&mut req, |params, resp| { |
161 | io.send(RawMsg::Response(resp.into_response(Ok(None))?)); | 165 | io.send(RawMsg::Response(resp.into_response(Ok(None))?)); |
162 | 166 | ||
diff --git a/crates/server/src/req.rs b/crates/server/src/req.rs index 269246dff..999fdb7c2 100644 --- a/crates/server/src/req.rs +++ b/crates/server/src/req.rs | |||
@@ -84,6 +84,14 @@ pub struct FindMatchingBraceParams { | |||
84 | pub offsets: Vec<Position>, | 84 | pub offsets: Vec<Position>, |
85 | } | 85 | } |
86 | 86 | ||
87 | pub enum DecorationsRequest {} | ||
88 | |||
89 | impl Request for DecorationsRequest { | ||
90 | type Params = TextDocumentIdentifier; | ||
91 | type Result = Vec<Decoration>; | ||
92 | const METHOD: &'static str = "m/decorationsRequest"; | ||
93 | } | ||
94 | |||
87 | pub enum PublishDecorations {} | 95 | pub enum PublishDecorations {} |
88 | 96 | ||
89 | impl Notification for PublishDecorations { | 97 | impl Notification for PublishDecorations { |