From 830abe0c1b9fdbc20a78771d0b3df37d9eabdc3e Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Wed, 2 Jan 2019 17:09:39 +0300
Subject: use navigation target in API

---
 crates/ra_lsp_server/src/conv.rs               | 11 ++++++++-
 crates/ra_lsp_server/src/main_loop/handlers.rs | 33 ++++++++++++--------------
 2 files changed, 25 insertions(+), 19 deletions(-)

(limited to 'crates/ra_lsp_server/src')

diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs
index 618486250..1107ffc8b 100644
--- a/crates/ra_lsp_server/src/conv.rs
+++ b/crates/ra_lsp_server/src/conv.rs
@@ -2,7 +2,7 @@ use languageserver_types::{
     self, Location, Position, Range, SymbolKind, TextDocumentEdit, TextDocumentIdentifier,
     TextDocumentItem, TextDocumentPositionParams, Url, VersionedTextDocumentIdentifier, InsertTextFormat,
 };
-use ra_analysis::{FileId, FileSystemEdit, SourceChange, SourceFileEdit, FilePosition,FileRange,  CompletionItem, CompletionItemKind, InsertText};
+use ra_analysis::{FileId, FileSystemEdit, SourceChange, SourceFileEdit, FilePosition,FileRange,  CompletionItem, CompletionItemKind, InsertText, NavigationTarget};
 use ra_editor::{LineCol, LineIndex, translate_offset_with_edit};
 use ra_text_edit::{AtomTextEdit, TextEdit};
 use ra_syntax::{SyntaxKind, TextRange, TextUnit};
@@ -322,6 +322,15 @@ impl TryConvWith for FileSystemEdit {
     }
 }
 
+impl TryConvWith for &NavigationTarget {
+    type Ctx = ServerWorld;
+    type Output = Location;
+    fn try_conv_with(self, world: &ServerWorld) -> Result<Location> {
+        let line_index = world.analysis().file_line_index(self.file_id());
+        to_location(self.file_id(), self.range(), &world, &line_index)
+    }
+}
+
 pub fn to_location(
     file_id: FileId,
     range: TextRange,
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs
index 5ff6219f9..26b6c7d8a 100644
--- a/crates/ra_lsp_server/src/main_loop/handlers.rs
+++ b/crates/ra_lsp_server/src/main_loop/handlers.rs
@@ -188,12 +188,11 @@ pub fn handle_workspace_symbol(
 
     fn exec_query(world: &ServerWorld, query: Query) -> Result<Vec<SymbolInformation>> {
         let mut res = Vec::new();
-        for (file_id, symbol) in world.analysis().symbol_search(query)? {
-            let line_index = world.analysis().file_line_index(file_id);
+        for nav in world.analysis().symbol_search(query)? {
             let info = SymbolInformation {
-                name: symbol.name.to_string(),
-                kind: symbol.kind.conv(),
-                location: to_location(file_id, symbol.node_range, world, &line_index)?,
+                name: nav.name().into(),
+                kind: nav.kind().conv(),
+                location: nav.try_conv_with(world)?,
                 container_name: None,
                 deprecated: None,
             };
@@ -212,12 +211,11 @@ pub fn handle_goto_definition(
         None => return Ok(None),
         Some(it) => it,
     };
-    let mut res = Vec::new();
-    for nav in rr.resolves_to {
-        let line_index = world.analysis().file_line_index(nav.file_id());
-        let location = to_location(nav.file_id(), nav.range(), &world, &line_index)?;
-        res.push(location)
-    }
+    let res = rr
+        .resolves_to
+        .into_iter()
+        .map(|nav| nav.try_conv_with(&world))
+        .collect::<Result<Vec<_>>>()?;
     Ok(Some(req::GotoDefinitionResponse::Array(res)))
 }
 
@@ -226,13 +224,12 @@ pub fn handle_parent_module(
     params: req::TextDocumentPositionParams,
 ) -> Result<Vec<Location>> {
     let position = params.try_conv_with(&world)?;
-    let mut res = Vec::new();
-    for (file_id, symbol) in world.analysis().parent_module(position)? {
-        let line_index = world.analysis().file_line_index(file_id);
-        let location = to_location(file_id, symbol.node_range, &world, &line_index)?;
-        res.push(location);
-    }
-    Ok(res)
+    world
+        .analysis()
+        .parent_module(position)?
+        .into_iter()
+        .map(|nav| nav.try_conv_with(&world))
+        .collect::<Result<Vec<_>>>()
 }
 
 pub fn handle_runnables(
-- 
cgit v1.2.3