@@ -16,7 +16,7 @@ mod tests;
1616use std:: ops:: ControlFlow ;
1717
1818use hir:: { InRealFile , Name , Semantics } ;
19- use ide_db:: { FxHashMap , RootDatabase , SymbolKind } ;
19+ use ide_db:: { FxHashMap , Ranker , RootDatabase , SymbolKind } ;
2020use span:: EditionedFileId ;
2121use syntax:: {
2222 ast:: { self , IsString } ,
@@ -397,13 +397,12 @@ fn traverse(
397397 Some ( AttrOrDerive :: Derive ( _) ) => inside_attribute,
398398 None => false ,
399399 } ;
400+
400401 let descended_element = if in_macro {
401402 // Attempt to descend tokens into macro-calls.
402403 let res = match element {
403404 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) ;
407406
408407 let mut t = None ;
409408 let mut r = 0 ;
@@ -412,21 +411,9 @@ fn traverse(
412411 |tok, _ctx| {
413412 // FIXME: Consider checking ctx transparency for being opaque?
414413 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 {
430417 // a rank of 0b1110 means that we have found a maximally interesting
431418 // token so stop early.
432419 t = Some ( tok) ;
0 commit comments