@@ -37,11 +37,17 @@ pub use self::search_scope::SearchScope;
3737
3838#[ derive( Debug , Clone ) ]
3939pub struct ReferenceSearchResult {
40- declaration : NavigationTarget ,
41- declaration_kind : ReferenceKind ,
40+ declaration : Declaration ,
4241 references : Vec < Reference > ,
4342}
4443
44+ #[ derive( Debug , Clone ) ]
45+ pub struct Declaration {
46+ pub nav : NavigationTarget ,
47+ pub kind : ReferenceKind ,
48+ pub access : Option < ReferenceAccess > ,
49+ }
50+
4551#[ derive( Debug , Clone ) ]
4652pub struct Reference {
4753 pub file_range : FileRange ,
@@ -62,10 +68,14 @@ pub enum ReferenceAccess {
6268}
6369
6470impl ReferenceSearchResult {
65- pub fn declaration ( & self ) -> & NavigationTarget {
71+ pub fn declaration ( & self ) -> & Declaration {
6672 & self . declaration
6773 }
6874
75+ pub fn decl_target ( & self ) -> & NavigationTarget {
76+ & self . declaration . nav
77+ }
78+
6979 pub fn references ( & self ) -> & [ Reference ] {
7080 & self . references
7181 }
@@ -88,11 +98,11 @@ impl IntoIterator for ReferenceSearchResult {
8898 let mut v = Vec :: with_capacity ( self . len ( ) ) ;
8999 v. push ( Reference {
90100 file_range : FileRange {
91- file_id : self . declaration . file_id ( ) ,
92- range : self . declaration . range ( ) ,
101+ file_id : self . declaration . nav . file_id ( ) ,
102+ range : self . declaration . nav . range ( ) ,
93103 } ,
94- kind : self . declaration_kind ,
95- access : None ,
104+ kind : self . declaration . kind ,
105+ access : self . declaration . access ,
96106 } ) ;
97107 v. append ( & mut self . references ) ;
98108 v. into_iter ( )
@@ -139,15 +149,14 @@ pub(crate) fn find_all_refs(
139149 }
140150 } ;
141151
152+ let declaration = Declaration { nav : declaration, kind : ReferenceKind :: Other , access : None } ;
153+
142154 let references = process_definition ( db, def, name, search_scope)
143155 . into_iter ( )
144156 . filter ( |r| search_kind == ReferenceKind :: Other || search_kind == r. kind )
145157 . collect ( ) ;
146158
147- Some ( RangeInfo :: new (
148- range,
149- ReferenceSearchResult { declaration, references, declaration_kind : ReferenceKind :: Other } ,
150- ) )
159+ Some ( RangeInfo :: new ( range, ReferenceSearchResult { declaration, references } ) )
151160}
152161
153162fn find_name < ' a > (
@@ -259,7 +268,7 @@ fn access_mode(kind: NameKind, name_ref: &ast::NameRef) -> Option<ReferenceAcces
259268mod tests {
260269 use crate :: {
261270 mock_analysis:: { analysis_and_position, single_file_with_position, MockAnalysis } ,
262- Reference , ReferenceKind , ReferenceSearchResult , SearchScope ,
271+ Declaration , Reference , ReferenceSearchResult , SearchScope ,
263272 } ;
264273
265274 #[ test]
@@ -279,8 +288,7 @@ mod tests {
279288 let refs = get_all_refs ( code) ;
280289 check_result (
281290 refs,
282- "Foo STRUCT_DEF FileId(1) [5; 39) [12; 15)" ,
283- ReferenceKind :: Other ,
291+ "Foo STRUCT_DEF FileId(1) [5; 39) [12; 15) Other" ,
284292 & [ "FileId(1) [142; 145) StructLiteral" ] ,
285293 ) ;
286294 }
@@ -303,8 +311,7 @@ mod tests {
303311 let refs = get_all_refs ( code) ;
304312 check_result (
305313 refs,
306- "i BIND_PAT FileId(1) [33; 34)" ,
307- ReferenceKind :: Other ,
314+ "i BIND_PAT FileId(1) [33; 34) Other" ,
308315 & [
309316 "FileId(1) [67; 68) Other Write" ,
310317 "FileId(1) [71; 72) Other Read" ,
@@ -324,8 +331,7 @@ mod tests {
324331 let refs = get_all_refs ( code) ;
325332 check_result (
326333 refs,
327- "i BIND_PAT FileId(1) [12; 13)" ,
328- ReferenceKind :: Other ,
334+ "i BIND_PAT FileId(1) [12; 13) Other" ,
329335 & [ "FileId(1) [38; 39) Other Read" ] ,
330336 ) ;
331337 }
@@ -340,8 +346,7 @@ mod tests {
340346 let refs = get_all_refs ( code) ;
341347 check_result (
342348 refs,
343- "i BIND_PAT FileId(1) [12; 13)" ,
344- ReferenceKind :: Other ,
349+ "i BIND_PAT FileId(1) [12; 13) Other" ,
345350 & [ "FileId(1) [38; 39) Other Read" ] ,
346351 ) ;
347352 }
@@ -362,8 +367,7 @@ mod tests {
362367 let refs = get_all_refs ( code) ;
363368 check_result (
364369 refs,
365- "spam RECORD_FIELD_DEF FileId(1) [66; 79) [70; 74)" ,
366- ReferenceKind :: Other ,
370+ "spam RECORD_FIELD_DEF FileId(1) [66; 79) [70; 74) Other" ,
367371 & [ "FileId(1) [152; 156) Other Read" ] ,
368372 ) ;
369373 }
@@ -379,7 +383,7 @@ mod tests {
379383 "# ;
380384
381385 let refs = get_all_refs ( code) ;
382- check_result ( refs, "f FN_DEF FileId(1) [88; 104) [91; 92)" , ReferenceKind :: Other , & [ ] ) ;
386+ check_result ( refs, "f FN_DEF FileId(1) [88; 104) [91; 92) Other" , & [ ] ) ;
383387 }
384388
385389 #[ test]
@@ -394,7 +398,7 @@ mod tests {
394398 "# ;
395399
396400 let refs = get_all_refs ( code) ;
397- check_result ( refs, "B ENUM_VARIANT FileId(1) [83; 84) [83; 84)" , ReferenceKind :: Other , & [ ] ) ;
401+ check_result ( refs, "B ENUM_VARIANT FileId(1) [83; 84) [83; 84) Other" , & [ ] ) ;
398402 }
399403
400404 #[ test]
@@ -435,8 +439,7 @@ mod tests {
435439 let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
436440 check_result (
437441 refs,
438- "Foo STRUCT_DEF FileId(2) [16; 50) [27; 30)" ,
439- ReferenceKind :: Other ,
442+ "Foo STRUCT_DEF FileId(2) [16; 50) [27; 30) Other" ,
440443 & [ "FileId(1) [52; 55) StructLiteral" , "FileId(3) [77; 80) StructLiteral" ] ,
441444 ) ;
442445 }
@@ -466,8 +469,7 @@ mod tests {
466469 let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
467470 check_result (
468471 refs,
469- "foo SOURCE_FILE FileId(2) [0; 35)" ,
470- ReferenceKind :: Other ,
472+ "foo SOURCE_FILE FileId(2) [0; 35) Other" ,
471473 & [ "FileId(1) [13; 16) Other" ] ,
472474 ) ;
473475 }
@@ -496,8 +498,7 @@ mod tests {
496498 let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
497499 check_result (
498500 refs,
499- "Foo STRUCT_DEF FileId(3) [0; 41) [18; 21)" ,
500- ReferenceKind :: Other ,
501+ "Foo STRUCT_DEF FileId(3) [0; 41) [18; 21) Other" ,
501502 & [ "FileId(2) [20; 23) Other" , "FileId(2) [46; 49) StructLiteral" ] ,
502503 ) ;
503504 }
@@ -525,17 +526,15 @@ mod tests {
525526 let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
526527 check_result (
527528 refs,
528- "quux FN_DEF FileId(1) [18; 34) [25; 29)" ,
529- ReferenceKind :: Other ,
529+ "quux FN_DEF FileId(1) [18; 34) [25; 29) Other" ,
530530 & [ "FileId(2) [16; 20) Other" , "FileId(3) [16; 20) Other" ] ,
531531 ) ;
532532
533533 let refs =
534534 analysis. find_all_refs ( pos, Some ( SearchScope :: single_file ( bar) ) ) . unwrap ( ) . unwrap ( ) ;
535535 check_result (
536536 refs,
537- "quux FN_DEF FileId(1) [18; 34) [25; 29)" ,
538- ReferenceKind :: Other ,
537+ "quux FN_DEF FileId(1) [18; 34) [25; 29) Other" ,
539538 & [ "FileId(3) [16; 20) Other" ] ,
540539 ) ;
541540 }
@@ -554,8 +553,7 @@ mod tests {
554553 let refs = get_all_refs ( code) ;
555554 check_result (
556555 refs,
557- "m1 MACRO_CALL FileId(1) [9; 63) [46; 48)" ,
558- ReferenceKind :: Other ,
556+ "m1 MACRO_CALL FileId(1) [9; 63) [46; 48) Other" ,
559557 & [ "FileId(1) [96; 98) Other" , "FileId(1) [114; 116) Other" ] ,
560558 ) ;
561559 }
@@ -571,8 +569,7 @@ mod tests {
571569 let refs = get_all_refs ( code) ;
572570 check_result (
573571 refs,
574- "i BIND_PAT FileId(1) [36; 37)" ,
575- ReferenceKind :: Other ,
572+ "i BIND_PAT FileId(1) [36; 37) Other" ,
576573 & [ "FileId(1) [55; 56) Other Write" , "FileId(1) [59; 60) Other Read" ] ,
577574 ) ;
578575 }
@@ -592,8 +589,7 @@ mod tests {
592589 let refs = get_all_refs ( code) ;
593590 check_result (
594591 refs,
595- "f RECORD_FIELD_DEF FileId(1) [32; 38) [32; 33)" ,
596- ReferenceKind :: Other ,
592+ "f RECORD_FIELD_DEF FileId(1) [32; 38) [32; 33) Other" ,
597593 & [ "FileId(1) [96; 97) Other Read" , "FileId(1) [117; 118) Other Write" ] ,
598594 ) ;
599595 }
@@ -603,19 +599,27 @@ mod tests {
603599 analysis. find_all_refs ( position, None ) . unwrap ( ) . unwrap ( )
604600 }
605601
606- fn check_result (
607- res : ReferenceSearchResult ,
608- expected_decl : & str ,
609- decl_kind : ReferenceKind ,
610- expected_refs : & [ & str ] ,
611- ) {
602+ fn check_result ( res : ReferenceSearchResult , expected_decl : & str , expected_refs : & [ & str ] ) {
612603 res. declaration ( ) . assert_match ( expected_decl) ;
613- assert_eq ! ( res. declaration_kind, decl_kind) ;
614-
615604 assert_eq ! ( res. references. len( ) , expected_refs. len( ) ) ;
616605 res. references ( ) . iter ( ) . enumerate ( ) . for_each ( |( i, r) | r. assert_match ( expected_refs[ i] ) ) ;
617606 }
618607
608+ impl Declaration {
609+ fn debug_render ( & self ) -> String {
610+ let mut s = format ! ( "{} {:?}" , self . nav. debug_render( ) , self . kind) ;
611+ if let Some ( access) = self . access {
612+ s. push_str ( & format ! ( " {:?}" , access) ) ;
613+ }
614+ s
615+ }
616+
617+ fn assert_match ( & self , expected : & str ) {
618+ let actual = self . debug_render ( ) ;
619+ test_utils:: assert_eq_text!( expected. trim( ) , actual. trim( ) , ) ;
620+ }
621+ }
622+
619623 impl Reference {
620624 fn debug_render ( & self ) -> String {
621625 let mut s = format ! (
0 commit comments