return ref ranges from gotodef

This commit is contained in:
Aleksey Kladov 2019-01-11 14:14:09 +03:00
parent f9ed8d4d23
commit 3aaf20bd6e
4 changed files with 24 additions and 10 deletions

View file

@ -4,19 +4,21 @@ use ra_syntax::{
algo::find_node_at_offset,
};
use crate::{FilePosition, NavigationTarget, db::RootDatabase};
use crate::{FilePosition, NavigationTarget, db::RootDatabase, RangeInfo};
pub(crate) fn goto_definition(
db: &RootDatabase,
position: FilePosition,
) -> Cancelable<Option<Vec<NavigationTarget>>> {
) -> Cancelable<Option<RangeInfo<Vec<NavigationTarget>>>> {
let file = db.source_file(position.file_id);
let syntax = file.syntax();
if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) {
return Ok(Some(reference_definition(db, position.file_id, name_ref)?));
let navs = reference_definition(db, position.file_id, name_ref)?;
return Ok(Some(RangeInfo::new(name_ref.syntax().range(), navs)));
}
if let Some(name) = find_node_at_offset::<ast::Name>(syntax, position.offset) {
return name_definition(db, position.file_id, name);
let navs = ctry!(name_definition(db, position.file_id, name)?);
return Ok(Some(RangeInfo::new(name.syntax().range(), navs)));
}
Ok(None)
}

View file

@ -251,7 +251,7 @@ pub struct RangeInfo<T> {
}
impl<T> RangeInfo<T> {
fn new(range: TextRange, info: T) -> RangeInfo<T> {
pub fn new(range: TextRange, info: T) -> RangeInfo<T> {
RangeInfo { range, info }
}
}
@ -391,7 +391,7 @@ impl Analysis {
pub fn goto_definition(
&self,
position: FilePosition,
) -> Cancelable<Option<Vec<NavigationTarget>>> {
) -> Cancelable<Option<RangeInfo<Vec<NavigationTarget>>>> {
self.db
.catch_canceled(|db| goto_definition::goto_definition(db, position))?
}