Skip to content

Commit c48730c

Browse files
bors[bot]Anatol Ulrich
andauthored
Merge #10639 #10640
10639: fix: make `goto_declaration` multi-token mapping aware r=Veykril a=spookyvision 10640: assume valid identifier r=Veykril a=spookyvision improve #10637 by always returning `Some(potentially_empty_vec)` instead of `None` in the empty case Co-authored-by: Anatol Ulrich <anatol.ulrich@ferrous-systems.com>
3 parents ba2b599 + d8ed15b + 53be26d commit c48730c

File tree

2 files changed

+30
-27
lines changed

2 files changed

+30
-27
lines changed

crates/ide/src/goto_declaration.rs

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,35 @@ pub(crate) fn goto_declaration(
1919
let original_token = file
2020
.token_at_offset(position.offset)
2121
.find(|it| matches!(it.kind(), IDENT | T![self] | T![super] | T![crate]))?;
22-
let token = sema.descend_into_macros_single(original_token.clone());
23-
let parent = token.parent()?;
24-
let def = match_ast! {
25-
match parent {
26-
ast::NameRef(name_ref) => match NameRefClass::classify(&sema, &name_ref)? {
27-
NameRefClass::Definition(it) => Some(it),
28-
_ => None
29-
},
30-
ast::Name(name) => match NameClass::classify(&sema, &name)? {
31-
NameClass::Definition(it) => Some(it),
32-
_ => None
33-
},
34-
_ => None,
35-
}
36-
};
37-
match def? {
38-
Definition::ModuleDef(hir::ModuleDef::Module(module)) => Some(RangeInfo::new(
39-
original_token.text_range(),
40-
vec![NavigationTarget::from_module_to_decl(db, module)],
41-
)),
42-
_ => None,
43-
}
22+
let range = original_token.text_range();
23+
let info: Vec<NavigationTarget> = sema
24+
.descend_into_macros(original_token)
25+
.iter()
26+
.filter_map(|token| {
27+
let parent = token.parent()?;
28+
let def = match_ast! {
29+
match parent {
30+
ast::NameRef(name_ref) => match NameRefClass::classify(&sema, &name_ref)? {
31+
NameRefClass::Definition(it) => Some(it),
32+
_ => None
33+
},
34+
ast::Name(name) => match NameClass::classify(&sema, &name)? {
35+
NameClass::Definition(it) => Some(it),
36+
_ => None
37+
},
38+
_ => None
39+
}
40+
};
41+
match def? {
42+
Definition::ModuleDef(hir::ModuleDef::Module(module)) => {
43+
Some(NavigationTarget::from_module_to_decl(db, module))
44+
}
45+
_ => None,
46+
}
47+
})
48+
.collect();
49+
50+
Some(RangeInfo::new(range, info))
4451
}
4552

4653
#[cfg(test)]

crates/ide/src/goto_type_definition.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,7 @@ pub(crate) fn goto_type_definition(
8181
}
8282
});
8383
});
84-
if res.is_empty() {
85-
None
86-
} else {
87-
Some(RangeInfo::new(range, res))
88-
}
84+
Some(RangeInfo::new(range, res))
8985
}
9086

9187
#[cfg(test)]

0 commit comments

Comments
 (0)