mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-12-09 10:55:42 +00:00
Return both field and local references for shorthands in goto_def
This commit is contained in:
parent
c41f1279a3
commit
ab2647769c
3 changed files with 92 additions and 56 deletions
|
|
@ -24,36 +24,35 @@ pub(crate) fn goto_declaration(
|
|||
let def = match_ast! {
|
||||
match parent {
|
||||
ast::NameRef(name_ref) => match NameRefClass::classify(&sema, &name_ref)? {
|
||||
NameRefClass::Definition(def) => def,
|
||||
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
|
||||
Definition::Local(local_ref)
|
||||
}
|
||||
NameRefClass::Definition(it) => Some(it),
|
||||
_ => None
|
||||
},
|
||||
ast::Name(name) => match NameClass::classify(&sema, &name)? {
|
||||
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
|
||||
NameClass::PatFieldShorthand { local_def, field_ref: _ } => Definition::Local(local_def),
|
||||
NameClass::Definition(it) => Some(it),
|
||||
_ => None
|
||||
},
|
||||
_ => return None,
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
match def {
|
||||
match def? {
|
||||
Definition::ModuleDef(hir::ModuleDef::Module(module)) => Some(RangeInfo::new(
|
||||
original_token.text_range(),
|
||||
vec![NavigationTarget::from_module_to_decl(db, module)],
|
||||
)),
|
||||
_ => return None,
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use ide_db::base_db::FileRange;
|
||||
use itertools::Itertools;
|
||||
|
||||
use crate::fixture;
|
||||
|
||||
fn check(ra_fixture: &str) {
|
||||
let (analysis, position, expected) = fixture::nav_target_annotation(ra_fixture);
|
||||
let mut navs = analysis
|
||||
let (analysis, position, expected) = fixture::annotations(ra_fixture);
|
||||
let navs = analysis
|
||||
.goto_declaration(position)
|
||||
.unwrap()
|
||||
.expect("no declaration or definition found")
|
||||
|
|
@ -61,10 +60,19 @@ mod tests {
|
|||
if navs.len() == 0 {
|
||||
panic!("unresolved reference")
|
||||
}
|
||||
assert_eq!(navs.len(), 1);
|
||||
|
||||
let nav = navs.pop().unwrap();
|
||||
assert_eq!(expected, FileRange { file_id: nav.file_id, range: nav.focus_or_full_range() });
|
||||
let cmp = |&FileRange { file_id, range }: &_| (file_id, range.start());
|
||||
let navs = navs
|
||||
.into_iter()
|
||||
.map(|nav| FileRange { file_id: nav.file_id, range: nav.focus_or_full_range() })
|
||||
.sorted_by_key(cmp)
|
||||
.collect::<Vec<_>>();
|
||||
let expected = expected
|
||||
.into_iter()
|
||||
.map(|(FileRange { file_id, range }, _)| FileRange { file_id, range })
|
||||
.sorted_by_key(cmp)
|
||||
.collect::<Vec<_>>();
|
||||
assert_eq!(expected, navs);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue