@@ -39,9 +39,8 @@ pub(crate) fn goto_definition(
3939 kind if kind. is_trivia ( ) => 0 ,
4040 _ => 1 ,
4141 } ) ?;
42- let token = sema. descend_into_macros ( original_token. clone ( ) ) ;
43- let parent = token. parent ( ) ?;
44- if let Some ( _) = ast:: Comment :: cast ( token. clone ( ) ) {
42+ if let Some ( _) = ast:: Comment :: cast ( original_token. clone ( ) ) {
43+ let parent = original_token. parent ( ) ?;
4544 let ( attributes, def) = doc_attributes ( & sema, & parent) ?;
4645 let ( docs, doc_mapping) = attributes. docs_with_rangemap ( db) ?;
4746 let ( _, link, ns) =
@@ -54,33 +53,41 @@ pub(crate) fn goto_definition(
5453 return Some ( RangeInfo :: new ( original_token. text_range ( ) , vec ! [ nav] ) ) ;
5554 }
5655
57- let navs = match_ast ! {
58- match parent {
59- ast:: NameRef ( name_ref) => {
60- reference_definition( & sema, Either :: Right ( & name_ref) )
61- } ,
62- ast:: Name ( name) => {
63- match NameClass :: classify( & sema, & name) ? {
64- NameClass :: Definition ( def) | NameClass :: ConstReference ( def) => {
65- try_find_trait_item_definition( sema. db, & def) . unwrap_or_else( || def_to_nav( sema. db, def) )
66- }
67- NameClass :: PatFieldShorthand { local_def, field_ref } => {
68- local_and_field_to_nav( sema. db, local_def, field_ref)
56+ let navs = sema. descend_into_macros_many ( original_token. clone ( ) )
57+ . into_iter ( )
58+ . filter_map ( |token| {
59+ let parent = token. parent ( ) ?;
60+ let navs = match_ast ! {
61+ match parent {
62+ ast:: NameRef ( name_ref) => {
63+ reference_definition( & sema, Either :: Right ( & name_ref) )
6964 } ,
70- }
71- } ,
72- ast:: Lifetime ( lt) => if let Some ( name_class) = NameClass :: classify_lifetime( & sema, & lt) {
73- match name_class {
74- NameClass :: Definition ( def) => def_to_nav( sema. db, def) ,
65+ ast:: Name ( name) => {
66+ match NameClass :: classify( & sema, & name) ? {
67+ NameClass :: Definition ( def) | NameClass :: ConstReference ( def) => {
68+ try_find_trait_item_definition( sema. db, & def) . unwrap_or_else( || def_to_nav( sema. db, def) )
69+ }
70+ NameClass :: PatFieldShorthand { local_def, field_ref } => {
71+ local_and_field_to_nav( sema. db, local_def, field_ref)
72+ } ,
73+ }
74+ } ,
75+ ast:: Lifetime ( lt) => if let Some ( name_class) = NameClass :: classify_lifetime( & sema, & lt) {
76+ match name_class {
77+ NameClass :: Definition ( def) => def_to_nav( sema. db, def) ,
78+ _ => return None ,
79+ }
80+ } else {
81+ reference_definition( & sema, Either :: Left ( & lt) )
82+ } ,
83+ ast:: TokenTree ( tt) => try_lookup_include_path_or_derive( & sema, tt, token, position. file_id) ?,
7584 _ => return None ,
7685 }
77- } else {
78- reference_definition( & sema, Either :: Left ( & lt) )
79- } ,
80- ast:: TokenTree ( tt) => try_lookup_include_path_or_derive( & sema, tt, token, position. file_id) ?,
81- _ => return None ,
82- }
83- } ;
86+ } ;
87+ Some ( navs)
88+ } )
89+ . flatten ( )
90+ . collect :: < Vec < NavigationTarget > > ( ) ;
8491
8592 Some ( RangeInfo :: new ( original_token. text_range ( ) , navs) )
8693}
0 commit comments