@@ -37,11 +37,17 @@ pub use self::search_scope::SearchScope;
37
37
38
38
#[ derive( Debug , Clone ) ]
39
39
pub struct ReferenceSearchResult {
40
- declaration : NavigationTarget ,
41
- declaration_kind : ReferenceKind ,
40
+ declaration : Declaration ,
42
41
references : Vec < Reference > ,
43
42
}
44
43
44
+ #[ derive( Debug , Clone ) ]
45
+ pub struct Declaration {
46
+ pub nav : NavigationTarget ,
47
+ pub kind : ReferenceKind ,
48
+ pub access : Option < ReferenceAccess > ,
49
+ }
50
+
45
51
#[ derive( Debug , Clone ) ]
46
52
pub struct Reference {
47
53
pub file_range : FileRange ,
@@ -62,10 +68,14 @@ pub enum ReferenceAccess {
62
68
}
63
69
64
70
impl ReferenceSearchResult {
65
- pub fn declaration ( & self ) -> & NavigationTarget {
71
+ pub fn declaration ( & self ) -> & Declaration {
66
72
& self . declaration
67
73
}
68
74
75
+ pub fn decl_target ( & self ) -> & NavigationTarget {
76
+ & self . declaration . nav
77
+ }
78
+
69
79
pub fn references ( & self ) -> & [ Reference ] {
70
80
& self . references
71
81
}
@@ -88,11 +98,11 @@ impl IntoIterator for ReferenceSearchResult {
88
98
let mut v = Vec :: with_capacity ( self . len ( ) ) ;
89
99
v. push ( Reference {
90
100
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 ( ) ,
93
103
} ,
94
- kind : self . declaration_kind ,
95
- access : None ,
104
+ kind : self . declaration . kind ,
105
+ access : self . declaration . access ,
96
106
} ) ;
97
107
v. append ( & mut self . references ) ;
98
108
v. into_iter ( )
@@ -139,15 +149,14 @@ pub(crate) fn find_all_refs(
139
149
}
140
150
} ;
141
151
152
+ let declaration = Declaration { nav : declaration, kind : ReferenceKind :: Other , access : None } ;
153
+
142
154
let references = process_definition ( db, def, name, search_scope)
143
155
. into_iter ( )
144
156
. filter ( |r| search_kind == ReferenceKind :: Other || search_kind == r. kind )
145
157
. collect ( ) ;
146
158
147
- Some ( RangeInfo :: new (
148
- range,
149
- ReferenceSearchResult { declaration, references, declaration_kind : ReferenceKind :: Other } ,
150
- ) )
159
+ Some ( RangeInfo :: new ( range, ReferenceSearchResult { declaration, references } ) )
151
160
}
152
161
153
162
fn find_name < ' a > (
@@ -259,7 +268,7 @@ fn access_mode(kind: NameKind, name_ref: &ast::NameRef) -> Option<ReferenceAcces
259
268
mod tests {
260
269
use crate :: {
261
270
mock_analysis:: { analysis_and_position, single_file_with_position, MockAnalysis } ,
262
- Reference , ReferenceKind , ReferenceSearchResult , SearchScope ,
271
+ Declaration , Reference , ReferenceSearchResult , SearchScope ,
263
272
} ;
264
273
265
274
#[ test]
@@ -279,8 +288,7 @@ mod tests {
279
288
let refs = get_all_refs ( code) ;
280
289
check_result (
281
290
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" ,
284
292
& [ "FileId(1) [142; 145) StructLiteral" ] ,
285
293
) ;
286
294
}
@@ -303,8 +311,7 @@ mod tests {
303
311
let refs = get_all_refs ( code) ;
304
312
check_result (
305
313
refs,
306
- "i BIND_PAT FileId(1) [33; 34)" ,
307
- ReferenceKind :: Other ,
314
+ "i BIND_PAT FileId(1) [33; 34) Other" ,
308
315
& [
309
316
"FileId(1) [67; 68) Other Write" ,
310
317
"FileId(1) [71; 72) Other Read" ,
@@ -324,8 +331,7 @@ mod tests {
324
331
let refs = get_all_refs ( code) ;
325
332
check_result (
326
333
refs,
327
- "i BIND_PAT FileId(1) [12; 13)" ,
328
- ReferenceKind :: Other ,
334
+ "i BIND_PAT FileId(1) [12; 13) Other" ,
329
335
& [ "FileId(1) [38; 39) Other Read" ] ,
330
336
) ;
331
337
}
@@ -340,8 +346,7 @@ mod tests {
340
346
let refs = get_all_refs ( code) ;
341
347
check_result (
342
348
refs,
343
- "i BIND_PAT FileId(1) [12; 13)" ,
344
- ReferenceKind :: Other ,
349
+ "i BIND_PAT FileId(1) [12; 13) Other" ,
345
350
& [ "FileId(1) [38; 39) Other Read" ] ,
346
351
) ;
347
352
}
@@ -362,8 +367,7 @@ mod tests {
362
367
let refs = get_all_refs ( code) ;
363
368
check_result (
364
369
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" ,
367
371
& [ "FileId(1) [152; 156) Other Read" ] ,
368
372
) ;
369
373
}
@@ -379,7 +383,7 @@ mod tests {
379
383
"# ;
380
384
381
385
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" , & [ ] ) ;
383
387
}
384
388
385
389
#[ test]
@@ -394,7 +398,7 @@ mod tests {
394
398
"# ;
395
399
396
400
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" , & [ ] ) ;
398
402
}
399
403
400
404
#[ test]
@@ -435,8 +439,7 @@ mod tests {
435
439
let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
436
440
check_result (
437
441
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" ,
440
443
& [ "FileId(1) [52; 55) StructLiteral" , "FileId(3) [77; 80) StructLiteral" ] ,
441
444
) ;
442
445
}
@@ -466,8 +469,7 @@ mod tests {
466
469
let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
467
470
check_result (
468
471
refs,
469
- "foo SOURCE_FILE FileId(2) [0; 35)" ,
470
- ReferenceKind :: Other ,
472
+ "foo SOURCE_FILE FileId(2) [0; 35) Other" ,
471
473
& [ "FileId(1) [13; 16) Other" ] ,
472
474
) ;
473
475
}
@@ -496,8 +498,7 @@ mod tests {
496
498
let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
497
499
check_result (
498
500
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" ,
501
502
& [ "FileId(2) [20; 23) Other" , "FileId(2) [46; 49) StructLiteral" ] ,
502
503
) ;
503
504
}
@@ -525,17 +526,15 @@ mod tests {
525
526
let refs = analysis. find_all_refs ( pos, None ) . unwrap ( ) . unwrap ( ) ;
526
527
check_result (
527
528
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" ,
530
530
& [ "FileId(2) [16; 20) Other" , "FileId(3) [16; 20) Other" ] ,
531
531
) ;
532
532
533
533
let refs =
534
534
analysis. find_all_refs ( pos, Some ( SearchScope :: single_file ( bar) ) ) . unwrap ( ) . unwrap ( ) ;
535
535
check_result (
536
536
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" ,
539
538
& [ "FileId(3) [16; 20) Other" ] ,
540
539
) ;
541
540
}
@@ -554,8 +553,7 @@ mod tests {
554
553
let refs = get_all_refs ( code) ;
555
554
check_result (
556
555
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" ,
559
557
& [ "FileId(1) [96; 98) Other" , "FileId(1) [114; 116) Other" ] ,
560
558
) ;
561
559
}
@@ -571,8 +569,7 @@ mod tests {
571
569
let refs = get_all_refs ( code) ;
572
570
check_result (
573
571
refs,
574
- "i BIND_PAT FileId(1) [36; 37)" ,
575
- ReferenceKind :: Other ,
572
+ "i BIND_PAT FileId(1) [36; 37) Other" ,
576
573
& [ "FileId(1) [55; 56) Other Write" , "FileId(1) [59; 60) Other Read" ] ,
577
574
) ;
578
575
}
@@ -592,8 +589,7 @@ mod tests {
592
589
let refs = get_all_refs ( code) ;
593
590
check_result (
594
591
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" ,
597
593
& [ "FileId(1) [96; 97) Other Read" , "FileId(1) [117; 118) Other Write" ] ,
598
594
) ;
599
595
}
@@ -603,19 +599,27 @@ mod tests {
603
599
analysis. find_all_refs ( position, None ) . unwrap ( ) . unwrap ( )
604
600
}
605
601
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 ] ) {
612
603
res. declaration ( ) . assert_match ( expected_decl) ;
613
- assert_eq ! ( res. declaration_kind, decl_kind) ;
614
-
615
604
assert_eq ! ( res. references. len( ) , expected_refs. len( ) ) ;
616
605
res. references ( ) . iter ( ) . enumerate ( ) . for_each ( |( i, r) | r. assert_match ( expected_refs[ i] ) ) ;
617
606
}
618
607
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
+
619
623
impl Reference {
620
624
fn debug_render ( & self ) -> String {
621
625
let mut s = format ! (
0 commit comments