@@ -19,28 +19,35 @@ pub(crate) fn goto_declaration(
19
19
let original_token = file
20
20
. token_at_offset ( position. offset )
21
21
. 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) )
44
51
}
45
52
46
53
#[ cfg( test) ]
0 commit comments