@@ -16,7 +16,7 @@ mod tests;
16
16
use std:: ops:: ControlFlow ;
17
17
18
18
use hir:: { InRealFile , Name , Semantics } ;
19
- use ide_db:: { FxHashMap , RootDatabase , SymbolKind } ;
19
+ use ide_db:: { FxHashMap , Ranker , RootDatabase , SymbolKind } ;
20
20
use span:: EditionedFileId ;
21
21
use syntax:: {
22
22
ast:: { self , IsString } ,
@@ -397,13 +397,12 @@ fn traverse(
397
397
Some ( AttrOrDerive :: Derive ( _) ) => inside_attribute,
398
398
None => false ,
399
399
} ;
400
+
400
401
let descended_element = if in_macro {
401
402
// Attempt to descend tokens into macro-calls.
402
403
let res = match element {
403
404
NodeOrToken :: Token ( token) if token. kind ( ) != COMMENT => {
404
- let kind = token. kind ( ) ;
405
- let text = token. text ( ) ;
406
- let ident_kind = kind. is_any_identifier ( ) ;
405
+ let ranker = Ranker :: from_token ( & token) ;
407
406
408
407
let mut t = None ;
409
408
let mut r = 0 ;
@@ -412,21 +411,9 @@ fn traverse(
412
411
|tok, _ctx| {
413
412
// FIXME: Consider checking ctx transparency for being opaque?
414
413
let tok = tok. value ;
415
- let tok_kind = tok. kind ( ) ;
416
-
417
- let exact_same_kind = tok_kind == kind;
418
- let both_idents =
419
- exact_same_kind || ( tok_kind. is_any_identifier ( ) && ident_kind) ;
420
- let same_text = tok. text ( ) == text;
421
- // anything that mapped into a token tree has likely no semantic information
422
- let no_tt_parent =
423
- tok. parent ( ) . map_or ( false , |it| it. kind ( ) != TOKEN_TREE ) ;
424
- let my_rank = ( both_idents as usize )
425
- | ( ( exact_same_kind as usize ) << 1 )
426
- | ( ( same_text as usize ) << 2 )
427
- | ( ( no_tt_parent as usize ) << 3 ) ;
428
-
429
- if my_rank > 0b1110 {
414
+ let my_rank = ranker. rank_token ( & tok) ;
415
+
416
+ if my_rank >= Ranker :: MAX_RANK {
430
417
// a rank of 0b1110 means that we have found a maximally interesting
431
418
// token so stop early.
432
419
t = Some ( tok) ;
0 commit comments