@@ -171,85 +171,88 @@ impl IntoIterator for SearchScope {
171
171
}
172
172
}
173
173
174
- pub fn find_refs_to_def (
175
- db : & RootDatabase ,
176
- def : & Definition ,
177
- search_scope : Option < SearchScope > ,
178
- ) -> Vec < Reference > {
179
- let _p = profile ( "find_refs_to_def" ) ;
180
-
181
- let search_scope = {
182
- let base = SearchScope :: for_def ( & def, db) ;
183
- match search_scope {
184
- None => base,
185
- Some ( scope) => base. intersection ( & scope) ,
186
- }
187
- } ;
174
+ impl Definition {
175
+ pub fn find_usages (
176
+ & self ,
177
+ db : & RootDatabase ,
178
+ search_scope : Option < SearchScope > ,
179
+ ) -> Vec < Reference > {
180
+ let _p = profile ( "Definition::find_usages" ) ;
181
+
182
+ let search_scope = {
183
+ let base = SearchScope :: for_def ( self , db) ;
184
+ match search_scope {
185
+ None => base,
186
+ Some ( scope) => base. intersection ( & scope) ,
187
+ }
188
+ } ;
188
189
189
- let name = match def . name ( db) {
190
- None => return Vec :: new ( ) ,
191
- Some ( it) => it. to_string ( ) ,
192
- } ;
190
+ let name = match self . name ( db) {
191
+ None => return Vec :: new ( ) ,
192
+ Some ( it) => it. to_string ( ) ,
193
+ } ;
193
194
194
- let pat = name. as_str ( ) ;
195
- let mut refs = vec ! [ ] ;
195
+ let pat = name. as_str ( ) ;
196
+ let mut refs = vec ! [ ] ;
196
197
197
- for ( file_id, search_range) in search_scope {
198
- let text = db. file_text ( file_id) ;
199
- let search_range =
200
- search_range. unwrap_or ( TextRange :: offset_len ( 0 . into ( ) , TextUnit :: of_str ( & text) ) ) ;
198
+ for ( file_id, search_range) in search_scope {
199
+ let text = db. file_text ( file_id) ;
200
+ let search_range =
201
+ search_range. unwrap_or ( TextRange :: offset_len ( 0 . into ( ) , TextUnit :: of_str ( & text) ) ) ;
201
202
202
- let sema = Semantics :: new ( db) ;
203
- let tree = Lazy :: new ( || sema. parse ( file_id) . syntax ( ) . clone ( ) ) ;
203
+ let sema = Semantics :: new ( db) ;
204
+ let tree = Lazy :: new ( || sema. parse ( file_id) . syntax ( ) . clone ( ) ) ;
204
205
205
- for ( idx, _) in text. match_indices ( pat) {
206
- let offset = TextUnit :: from_usize ( idx) ;
207
- if !search_range. contains_inclusive ( offset) {
208
- // tested_by!(search_filters_by_range);
209
- continue ;
210
- }
206
+ for ( idx, _) in text. match_indices ( pat) {
207
+ let offset = TextUnit :: from_usize ( idx) ;
208
+ if !search_range. contains_inclusive ( offset) {
209
+ // tested_by!(search_filters_by_range);
210
+ continue ;
211
+ }
211
212
212
- let name_ref =
213
- if let Some ( name_ref) = find_node_at_offset :: < ast:: NameRef > ( & tree, offset) {
214
- name_ref
215
- } else {
216
- // Handle macro token cases
217
- let token = match tree. token_at_offset ( offset) {
218
- TokenAtOffset :: None => continue ,
219
- TokenAtOffset :: Single ( t) => t,
220
- TokenAtOffset :: Between ( _, t) => t,
213
+ let name_ref =
214
+ if let Some ( name_ref) = find_node_at_offset :: < ast:: NameRef > ( & tree, offset) {
215
+ name_ref
216
+ } else {
217
+ // Handle macro token cases
218
+ let token = match tree. token_at_offset ( offset) {
219
+ TokenAtOffset :: None => continue ,
220
+ TokenAtOffset :: Single ( t) => t,
221
+ TokenAtOffset :: Between ( _, t) => t,
222
+ } ;
223
+ let expanded = sema. descend_into_macros ( token) ;
224
+ match ast:: NameRef :: cast ( expanded. parent ( ) ) {
225
+ Some ( name_ref) => name_ref,
226
+ _ => continue ,
227
+ }
221
228
} ;
222
- let expanded = sema. descend_into_macros ( token) ;
223
- match ast:: NameRef :: cast ( expanded. parent ( ) ) {
224
- Some ( name_ref) => name_ref,
225
- _ => continue ,
226
- }
227
- } ;
228
229
229
- // FIXME: reuse sb
230
- // See https://github.com/rust-lang/rust/pull/68198#issuecomment-574269098
230
+ // FIXME: reuse sb
231
+ // See https://github.com/rust-lang/rust/pull/68198#issuecomment-574269098
231
232
232
- if let Some ( d) = classify_name_ref ( & sema, & name_ref) {
233
- let d = d. definition ( ) ;
234
- if & d == def {
235
- let kind =
236
- if is_record_lit_name_ref ( & name_ref) || is_call_expr_name_ref ( & name_ref) {
233
+ if let Some ( d) = classify_name_ref ( & sema, & name_ref) {
234
+ let d = d. definition ( ) ;
235
+ if & d == self {
236
+ let kind = if is_record_lit_name_ref ( & name_ref)
237
+ || is_call_expr_name_ref ( & name_ref)
238
+ {
237
239
ReferenceKind :: StructLiteral
238
240
} else {
239
241
ReferenceKind :: Other
240
242
} ;
241
243
242
- let file_range = sema. original_range ( name_ref. syntax ( ) ) ;
243
- refs. push ( Reference {
244
- file_range,
245
- kind,
246
- access : reference_access ( & d, & name_ref) ,
247
- } ) ;
244
+ let file_range = sema. original_range ( name_ref. syntax ( ) ) ;
245
+ refs. push ( Reference {
246
+ file_range,
247
+ kind,
248
+ access : reference_access ( & d, & name_ref) ,
249
+ } ) ;
250
+ }
248
251
}
249
252
}
250
253
}
254
+ refs
251
255
}
252
- refs
253
256
}
254
257
255
258
fn reference_access ( def : & Definition , name_ref : & ast:: NameRef ) -> Option < ReferenceAccess > {
0 commit comments