diff options
author | Aleksey Kladov <[email protected]> | 2018-08-26 10:51:45 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-26 10:51:45 +0100 |
commit | 71722c047f96cb754c958c52591ca53f2a9c4d3c (patch) | |
tree | 981f344602900130acdae20509e5e0cb029f508b /crates/server/src/main_loop | |
parent | ac226021cfd26a9332b5971f3e05118d77822af5 (diff) |
Simple scope completion
Diffstat (limited to 'crates/server/src/main_loop')
-rw-r--r-- | crates/server/src/main_loop/handlers.rs | 23 | ||||
-rw-r--r-- | crates/server/src/main_loop/mod.rs | 4 |
2 files changed, 27 insertions, 0 deletions
diff --git a/crates/server/src/main_loop/handlers.rs b/crates/server/src/main_loop/handlers.rs index b68e93e46..e7ac53028 100644 --- a/crates/server/src/main_loop/handlers.rs +++ b/crates/server/src/main_loop/handlers.rs | |||
@@ -4,6 +4,7 @@ use languageserver_types::{ | |||
4 | Diagnostic, DiagnosticSeverity, Url, DocumentSymbol, | 4 | Diagnostic, DiagnosticSeverity, Url, DocumentSymbol, |
5 | Command, TextDocumentIdentifier, WorkspaceEdit, | 5 | Command, TextDocumentIdentifier, WorkspaceEdit, |
6 | SymbolInformation, Position, Location, TextEdit, | 6 | SymbolInformation, Position, Location, TextEdit, |
7 | CompletionItem, | ||
7 | }; | 8 | }; |
8 | use serde_json::{to_value, from_value}; | 9 | use serde_json::{to_value, from_value}; |
9 | use libanalysis::{Query}; | 10 | use libanalysis::{Query}; |
@@ -259,6 +260,28 @@ pub fn handle_parent_module( | |||
259 | Ok(res) | 260 | Ok(res) |
260 | } | 261 | } |
261 | 262 | ||
263 | pub fn handle_completion( | ||
264 | world: ServerWorld, | ||
265 | params: req::CompletionParams, | ||
266 | ) -> Result<Option<req::CompletionResponse>> { | ||
267 | let file_id = params.text_document.try_conv_with(&world)?; | ||
268 | let file = world.analysis().file_syntax(file_id)?; | ||
269 | let line_index = world.analysis().file_line_index(file_id)?; | ||
270 | let offset = params.position.conv_with(&line_index); | ||
271 | let items = match libeditor::scope_completion(&file, offset) { | ||
272 | None => return Ok(None), | ||
273 | Some(items) => items, | ||
274 | }; | ||
275 | let items = items.into_iter() | ||
276 | .map(|item| CompletionItem { | ||
277 | label: item.name, | ||
278 | .. Default::default() | ||
279 | }) | ||
280 | .collect(); | ||
281 | |||
282 | Ok(Some(req::CompletionResponse::Array(items))) | ||
283 | } | ||
284 | |||
262 | pub fn handle_execute_command( | 285 | pub fn handle_execute_command( |
263 | world: ServerWorld, | 286 | world: ServerWorld, |
264 | mut params: req::ExecuteCommandParams, | 287 | mut params: req::ExecuteCommandParams, |
diff --git a/crates/server/src/main_loop/mod.rs b/crates/server/src/main_loop/mod.rs index 1e65041e2..5213ecc04 100644 --- a/crates/server/src/main_loop/mod.rs +++ b/crates/server/src/main_loop/mod.rs | |||
@@ -28,6 +28,7 @@ use { | |||
28 | handle_find_matching_brace, | 28 | handle_find_matching_brace, |
29 | handle_parent_module, | 29 | handle_parent_module, |
30 | handle_join_lines, | 30 | handle_join_lines, |
31 | handle_completion, | ||
31 | }, | 32 | }, |
32 | }; | 33 | }; |
33 | 34 | ||
@@ -143,6 +144,9 @@ fn on_request( | |||
143 | handle_request_on_threadpool::<req::GotoDefinition>( | 144 | handle_request_on_threadpool::<req::GotoDefinition>( |
144 | &mut req, pool, world, sender, handle_goto_definition, | 145 | &mut req, pool, world, sender, handle_goto_definition, |
145 | )?; | 146 | )?; |
147 | handle_request_on_threadpool::<req::Completion>( | ||
148 | &mut req, pool, world, sender, handle_completion, | ||
149 | )?; | ||
146 | handle_request_on_threadpool::<req::ParentModule>( | 150 | handle_request_on_threadpool::<req::ParentModule>( |
147 | &mut req, pool, world, sender, handle_parent_module, | 151 | &mut req, pool, world, sender, handle_parent_module, |
148 | )?; | 152 | )?; |