@@ -134,6 +134,7 @@ pub enum ReferenceCategory {
134134 // FIXME: Some day should be able to search in doc comments. Would probably
135135 // need to switch from enum to bitflags then?
136136 // DocComment
137+ Test ,
137138}
138139
139140/// Generally, `search_scope` returns files that might contain references for the element.
@@ -743,7 +744,7 @@ impl<'a> FindUsages<'a> {
743744 let reference = FileReference {
744745 range,
745746 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
746- category : ReferenceCategory :: new ( & def, name_ref) ,
747+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
747748 } ;
748749 sink ( file_id, reference)
749750 }
@@ -759,7 +760,7 @@ impl<'a> FindUsages<'a> {
759760 let reference = FileReference {
760761 range,
761762 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
762- category : ReferenceCategory :: new ( & def, name_ref) ,
763+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
763764 } ;
764765 sink ( file_id, reference)
765766 }
@@ -769,7 +770,7 @@ impl<'a> FindUsages<'a> {
769770 let reference = FileReference {
770771 range,
771772 name : FileReferenceNode :: NameRef ( name_ref. clone ( ) ) ,
772- category : ReferenceCategory :: new ( & def, name_ref) ,
773+ category : ReferenceCategory :: new ( self . sema , & def, name_ref) ,
773774 } ;
774775 sink ( file_id, reference)
775776 } else {
@@ -783,10 +784,10 @@ impl<'a> FindUsages<'a> {
783784 let local = Definition :: Local ( local) ;
784785 let access = match self . def {
785786 Definition :: Field ( _) if field == self . def => {
786- ReferenceCategory :: new ( & field, name_ref)
787+ ReferenceCategory :: new ( self . sema , & field, name_ref)
787788 }
788789 Definition :: Local ( _) if local == self . def => {
789- ReferenceCategory :: new ( & local, name_ref)
790+ ReferenceCategory :: new ( self . sema , & local, name_ref)
790791 }
791792 _ => return false ,
792793 } ;
@@ -871,7 +872,15 @@ fn def_to_ty(sema: &Semantics<'_, RootDatabase>, def: &Definition) -> Option<hir
871872}
872873
873874impl ReferenceCategory {
874- fn new ( def : & Definition , r : & ast:: NameRef ) -> Option < ReferenceCategory > {
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) {
881+ return Some ( ReferenceCategory :: Test ) ;
882+ }
883+
875884 // Only Locals and Fields have accesses for now.
876885 if !matches ! ( def, Definition :: Local ( _) | Definition :: Field ( _) ) {
877886 return is_name_ref_in_import ( r) . then_some ( ReferenceCategory :: Import ) ;
@@ -910,3 +919,10 @@ fn is_name_ref_in_import(name_ref: &ast::NameRef) -> bool {
910919 . and_then ( |it| it. parent_path ( ) . top_path ( ) . syntax ( ) . parent ( ) )
911920 . map_or ( false , |it| it. kind ( ) == SyntaxKind :: USE_TREE )
912921}
922+
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+ } )
928+ }
0 commit comments