@@ -15,10 +15,7 @@ use memchr::memmem::Finder;
1515use nohash_hasher:: IntMap ;
1616use once_cell:: unsync:: Lazy ;
1717use parser:: SyntaxKind ;
18- use syntax:: {
19- ast:: { self , HasAttrs as _} ,
20- match_ast, AstNode , AstToken , SyntaxElement , TextRange , TextSize ,
21- } ;
18+ use syntax:: { ast, match_ast, AstNode , AstToken , SyntaxElement , TextRange , TextSize } ;
2219use triomphe:: Arc ;
2320
2421use crate :: {
@@ -747,7 +744,7 @@ impl<'a> FindUsages<'a> {
747744 let reference = FileReference {
748745 range,
749746 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
750- category : ReferenceCategory :: new ( & def, name_ref) ,
747+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
751748 } ;
752749 sink ( file_id, reference)
753750 }
@@ -763,7 +760,7 @@ impl<'a> FindUsages<'a> {
763760 let reference = FileReference {
764761 range,
765762 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
766- category : ReferenceCategory :: new ( & def, name_ref) ,
763+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
767764 } ;
768765 sink ( file_id, reference)
769766 }
@@ -773,7 +770,7 @@ impl<'a> FindUsages<'a> {
773770 let reference = FileReference {
774771 range,
775772 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
776- category : ReferenceCategory :: new ( & def, name_ref) ,
773+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
777774 } ;
778775 sink ( file_id, reference)
779776 } else {
@@ -787,10 +784,10 @@ impl<'a> FindUsages<'a> {
787784 let local = Definition :: Local ( local) ;
788785 let access = match self . def {
789786 Definition :: Field ( _) if field == self . def => {
790- ReferenceCategory :: new ( & field, name_ref)
787+ ReferenceCategory :: new ( self . sema , & field, name_ref)
791788 }
792789 Definition :: Local ( _) if local == self . def => {
793- ReferenceCategory :: new ( & local, name_ref)
790+ ReferenceCategory :: new ( self . sema , & local, name_ref)
794791 }
795792 _ => return false ,
796793 } ;
@@ -875,8 +872,12 @@ fn def_to_ty(sema: &Semantics<'_, RootDatabase>, def: &Definition) -> Option<hir
875872}
876873
877874impl ReferenceCategory {
878- fn new ( def : & Definition , r : & ast:: NameRef ) -> Option < ReferenceCategory > {
879- if is_name_ref_in_test ( r) {
875+ fn new (
876+ sema : & Semantics < ' _ , RootDatabase > ,
877+ def : & Definition ,
878+ r : & ast:: NameRef ,
879+ ) -> Option < ReferenceCategory > {
880+ if is_name_ref_in_test ( sema, r) {
880881 return Some ( ReferenceCategory :: Test ) ;
881882 }
882883
@@ -919,29 +920,9 @@ fn is_name_ref_in_import(name_ref: &ast::NameRef) -> bool {
919920 . map_or ( false , |it| it. kind ( ) == SyntaxKind :: USE_TREE )
920921}
921922
922- fn is_name_ref_in_test ( name_ref : & ast:: NameRef ) -> bool {
923- let mode = name_ref. syntax ( ) . ancestors ( ) . find_map ( |node| {
924- match_ast ! {
925- match node {
926- ast:: Fn ( f) => {
927- let attrs = f. attrs( ) ;
928- let mut is_test = false ;
929- for attr in attrs {
930- if attr. to_string( ) == "#[test]" {
931- is_test = true ;
932- break ;
933- }
934- }
935- if is_test {
936- Some ( ReferenceCategory :: Test )
937- }
938- else {
939- None
940- }
941- } ,
942- _ => None
943- }
944- }
945- } ) ;
946- mode. is_some ( )
923+ fn is_name_ref_in_test ( sema : & Semantics < ' _ , RootDatabase > , name_ref : & ast:: NameRef ) -> bool {
924+ name_ref. syntax ( ) . ancestors ( ) . any ( |node| match ast:: Fn :: cast ( node) {
925+ Some ( it) => sema. to_def ( & it) . map_or ( false , |func| func. is_test ( sema. db ) ) ,
926+ None => false ,
927+ } )
947928}
0 commit comments