aboutsummaryrefslogtreecommitdiff
path: root/crates/server/src/main_loop
diff options
context:
space:
mode:
Diffstat (limited to 'crates/server/src/main_loop')
-rw-r--r--crates/server/src/main_loop/handlers.rs23
-rw-r--r--crates/server/src/main_loop/mod.rs4
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};
8use serde_json::{to_value, from_value}; 9use serde_json::{to_value, from_value};
9use libanalysis::{Query}; 10use libanalysis::{Query};
@@ -259,6 +260,28 @@ pub fn handle_parent_module(
259 Ok(res) 260 Ok(res)
260} 261}
261 262
263pub 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
262pub fn handle_execute_command( 285pub 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 )?;