@@ -3,7 +3,7 @@ use ide_db::{
3
3
base_db:: FilePosition ,
4
4
defs:: { Definition , NameClass , NameRefClass } ,
5
5
helpers:: { for_each_break_expr, for_each_tail_expr, node_ext:: walk_expr, pick_best_token} ,
6
- search:: { FileReference , ReferenceAccess , SearchScope } ,
6
+ search:: { FileReference , ReferenceCategory , SearchScope } ,
7
7
RootDatabase ,
8
8
} ;
9
9
use rustc_hash:: FxHashSet ;
@@ -19,7 +19,10 @@ use crate::{display::TryToNav, references, NavigationTarget};
19
19
#[ derive( PartialEq , Eq , Hash ) ]
20
20
pub struct HighlightedRange {
21
21
pub range : TextRange ,
22
- pub access : Option < ReferenceAccess > ,
22
+ // FIXME: This needs to be more precise. Reference category makes sense only
23
+ // for references, but we also have defs. And things like exit points are
24
+ // neither.
25
+ pub category : Option < ReferenceCategory > ,
23
26
}
24
27
25
28
#[ derive( Default , Clone ) ]
@@ -87,7 +90,10 @@ fn highlight_references(
87
90
. remove ( & file_id)
88
91
} )
89
92
. flatten ( )
90
- . map ( |FileReference { access, range, .. } | HighlightedRange { range, access } ) ;
93
+ . map ( |FileReference { category : access, range, .. } | HighlightedRange {
94
+ range,
95
+ category : access,
96
+ } ) ;
91
97
92
98
let declarations = defs. iter ( ) . flat_map ( |def| {
93
99
match def {
@@ -99,8 +105,12 @@ fn highlight_references(
99
105
. filter ( |decl| decl. file_id == file_id)
100
106
. and_then ( |decl| {
101
107
let range = decl. focus_range ?;
102
- let access = references:: decl_access ( & def, syntax, range) ;
103
- Some ( HighlightedRange { range, access } )
108
+ let category = if references:: decl_mutability ( & def, syntax, range) {
109
+ Some ( ReferenceCategory :: Write )
110
+ } else {
111
+ None
112
+ } ;
113
+ Some ( HighlightedRange { range, category } )
104
114
} )
105
115
} ) ;
106
116
@@ -125,18 +135,20 @@ fn highlight_exit_points(
125
135
walk_expr ( & body, & mut |expr| match expr {
126
136
ast:: Expr :: ReturnExpr ( expr) => {
127
137
if let Some ( token) = expr. return_token ( ) {
128
- highlights. push ( HighlightedRange { access : None , range : token. text_range ( ) } ) ;
138
+ highlights. push ( HighlightedRange { category : None , range : token. text_range ( ) } ) ;
129
139
}
130
140
}
131
141
ast:: Expr :: TryExpr ( try_) => {
132
142
if let Some ( token) = try_. question_mark_token ( ) {
133
- highlights. push ( HighlightedRange { access : None , range : token. text_range ( ) } ) ;
143
+ highlights. push ( HighlightedRange { category : None , range : token. text_range ( ) } ) ;
134
144
}
135
145
}
136
146
ast:: Expr :: MethodCallExpr ( _) | ast:: Expr :: CallExpr ( _) | ast:: Expr :: MacroCall ( _) => {
137
147
if sema. type_of_expr ( & expr) . map_or ( false , |ty| ty. original . is_never ( ) ) {
138
- highlights
139
- . push ( HighlightedRange { access : None , range : expr. syntax ( ) . text_range ( ) } ) ;
148
+ highlights. push ( HighlightedRange {
149
+ category : None ,
150
+ range : expr. syntax ( ) . text_range ( ) ,
151
+ } ) ;
140
152
}
141
153
}
142
154
_ => ( ) ,
@@ -154,7 +166,7 @@ fn highlight_exit_points(
154
166
. map_or_else ( || tail. syntax ( ) . text_range ( ) , |tok| tok. text_range ( ) ) ,
155
167
_ => tail. syntax ( ) . text_range ( ) ,
156
168
} ;
157
- highlights. push ( HighlightedRange { access : None , range } )
169
+ highlights. push ( HighlightedRange { category : None , range } )
158
170
} ) ;
159
171
}
160
172
Some ( highlights)
@@ -187,13 +199,13 @@ fn highlight_break_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
187
199
token. map ( |tok| tok. text_range ( ) ) ,
188
200
label. as_ref ( ) . map ( |it| it. syntax ( ) . text_range ( ) ) ,
189
201
) ;
190
- highlights. extend ( range. map ( |range| HighlightedRange { access : None , range } ) ) ;
202
+ highlights. extend ( range. map ( |range| HighlightedRange { category : None , range } ) ) ;
191
203
for_each_break_expr ( label, body, & mut |break_| {
192
204
let range = cover_range (
193
205
break_. break_token ( ) . map ( |it| it. text_range ( ) ) ,
194
206
break_. lifetime ( ) . map ( |it| it. syntax ( ) . text_range ( ) ) ,
195
207
) ;
196
- highlights. extend ( range. map ( |range| HighlightedRange { access : None , range } ) ) ;
208
+ highlights. extend ( range. map ( |range| HighlightedRange { category : None , range } ) ) ;
197
209
} ) ;
198
210
Some ( highlights)
199
211
}
@@ -241,13 +253,13 @@ fn highlight_yield_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
241
253
body : Option < ast:: Expr > ,
242
254
) -> Option < Vec < HighlightedRange > > {
243
255
let mut highlights =
244
- vec ! [ HighlightedRange { access : None , range: async_token?. text_range( ) } ] ;
256
+ vec ! [ HighlightedRange { category : None , range: async_token?. text_range( ) } ] ;
245
257
if let Some ( body) = body {
246
258
walk_expr ( & body, & mut |expr| {
247
259
if let ast:: Expr :: AwaitExpr ( expr) = expr {
248
260
if let Some ( token) = expr. await_token ( ) {
249
261
highlights
250
- . push ( HighlightedRange { access : None , range : token. text_range ( ) } ) ;
262
+ . push ( HighlightedRange { category : None , range : token. text_range ( ) } ) ;
251
263
}
252
264
}
253
265
} ) ;
@@ -353,10 +365,10 @@ mod tests {
353
365
. map ( |hl| {
354
366
(
355
367
hl. range ,
356
- hl. access . map ( |it| {
368
+ hl. category . map ( |it| {
357
369
match it {
358
- ReferenceAccess :: Read => "read" ,
359
- ReferenceAccess :: Write => "write" ,
370
+ ReferenceCategory :: Read => "read" ,
371
+ ReferenceCategory :: Write => "write" ,
360
372
}
361
373
. to_string ( )
362
374
} ) ,
0 commit comments