@@ -24,13 +24,14 @@ pub(crate) fn goto_definition(
2424 let original_token = pick_best ( file. token_at_offset ( position. offset ) ) ?;
2525 let token = descend_into_macros ( db, position. file_id , original_token. clone ( ) ) ;
2626
27+ let mut sb = SourceBinder :: new ( db) ;
2728 let nav_targets = match_ast ! {
2829 match ( token. value. parent( ) ) {
2930 ast:: NameRef ( name_ref) => {
30- reference_definition( db , token. with_value( & name_ref) ) . to_vec( )
31+ reference_definition( & mut sb , token. with_value( & name_ref) ) . to_vec( )
3132 } ,
3233 ast:: Name ( name) => {
33- name_definition( db , token. with_value( & name) ) ?
34+ name_definition( & mut sb , token. with_value( & name) ) ?
3435 } ,
3536 _ => return None ,
3637 }
@@ -67,57 +68,56 @@ impl ReferenceResult {
6768}
6869
6970pub ( crate ) fn reference_definition (
70- db : & RootDatabase ,
71+ sb : & mut SourceBinder < RootDatabase > ,
7172 name_ref : InFile < & ast:: NameRef > ,
7273) -> ReferenceResult {
7374 use self :: ReferenceResult :: * ;
7475
75- let mut sb = SourceBinder :: new ( db) ;
76- let name_kind = classify_name_ref ( & mut sb, name_ref) . map ( |d| d. kind ) ;
76+ let name_kind = classify_name_ref ( sb, name_ref) . map ( |d| d. kind ) ;
7777 match name_kind {
78- Some ( Macro ( it) ) => return Exact ( it. to_nav ( db) ) ,
79- Some ( Field ( it) ) => return Exact ( it. to_nav ( db) ) ,
80- Some ( TypeParam ( it) ) => return Exact ( it. to_nav ( db) ) ,
81- Some ( AssocItem ( it) ) => return Exact ( it. to_nav ( db) ) ,
82- Some ( Local ( it) ) => return Exact ( it. to_nav ( db) ) ,
83- Some ( Def ( def) ) => match NavigationTarget :: from_def ( db, def) {
78+ Some ( Macro ( it) ) => return Exact ( it. to_nav ( sb . db ) ) ,
79+ Some ( Field ( it) ) => return Exact ( it. to_nav ( sb . db ) ) ,
80+ Some ( TypeParam ( it) ) => return Exact ( it. to_nav ( sb . db ) ) ,
81+ Some ( AssocItem ( it) ) => return Exact ( it. to_nav ( sb . db ) ) ,
82+ Some ( Local ( it) ) => return Exact ( it. to_nav ( sb . db ) ) ,
83+ Some ( Def ( def) ) => match NavigationTarget :: from_def ( sb . db , def) {
8484 Some ( nav) => return Exact ( nav) ,
8585 None => return Approximate ( vec ! [ ] ) ,
8686 } ,
8787 Some ( SelfType ( imp) ) => {
8888 // FIXME: ideally, this should point to the type in the impl, and
8989 // not at the whole impl. And goto **type** definition should bring
9090 // us to the actual type
91- return Exact ( imp. to_nav ( db) ) ;
91+ return Exact ( imp. to_nav ( sb . db ) ) ;
9292 }
9393 None => { }
9494 } ;
9595
9696 // Fallback index based approach:
97- let navs = crate :: symbol_index:: index_resolve ( db, name_ref. value )
97+ let navs = crate :: symbol_index:: index_resolve ( sb . db , name_ref. value )
9898 . into_iter ( )
99- . map ( |s| s. to_nav ( db) )
99+ . map ( |s| s. to_nav ( sb . db ) )
100100 . collect ( ) ;
101101 Approximate ( navs)
102102}
103103
104- pub ( crate ) fn name_definition (
105- db : & RootDatabase ,
104+ fn name_definition (
105+ sb : & mut SourceBinder < RootDatabase > ,
106106 name : InFile < & ast:: Name > ,
107107) -> Option < Vec < NavigationTarget > > {
108108 let parent = name. value . syntax ( ) . parent ( ) ?;
109109
110110 if let Some ( module) = ast:: Module :: cast ( parent. clone ( ) ) {
111111 if module. has_semi ( ) {
112112 let src = name. with_value ( module) ;
113- if let Some ( child_module) = hir :: Module :: from_declaration ( db , src) {
114- let nav = child_module. to_nav ( db) ;
113+ if let Some ( child_module) = sb . to_def ( src) {
114+ let nav = child_module. to_nav ( sb . db ) ;
115115 return Some ( vec ! [ nav] ) ;
116116 }
117117 }
118118 }
119119
120- if let Some ( nav) = named_target ( db, name. with_value ( & parent) ) {
120+ if let Some ( nav) = named_target ( sb . db , name. with_value ( & parent) ) {
121121 return Some ( vec ! [ nav] ) ;
122122 }
123123
0 commit comments