use navigation target in API

This commit is contained in:
Aleksey Kladov 2019-01-02 17:09:39 +03:00
parent d25c89f760
commit 830abe0c1b
4 changed files with 44 additions and 26 deletions

View file

@ -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,

View file

@ -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(