@@ -7,7 +7,7 @@ use ide_db::{
77} ;
88use syntax:: TextRange ;
99
10- use crate :: { navigation_target :: ToNav , runnables:: runnable_fn, Runnable , TryToNav } ;
10+ use crate :: { runnables:: runnable_fn, NavigationTarget , Runnable , TryToNav } ;
1111
1212#[ derive( Debug ) ]
1313pub enum TestItemKind {
@@ -56,17 +56,22 @@ fn find_crate_by_id(crate_graph: &CrateGraph, crate_id: &str) -> Option<CrateId>
5656 } )
5757}
5858
59- fn discover_tests_in_module ( db : & RootDatabase , module : Module , prefix_id : String ) -> Vec < TestItem > {
59+ fn discover_tests_in_module (
60+ db : & RootDatabase ,
61+ module : Module ,
62+ prefix_id : String ,
63+ only_in_this_file : bool ,
64+ ) -> Vec < TestItem > {
6065 let sema = Semantics :: new ( db) ;
6166
6267 let mut r = vec ! [ ] ;
6368 for c in module. children ( db) {
6469 let module_name =
6570 c. name ( db) . as_ref ( ) . and_then ( |n| n. as_str ( ) ) . unwrap_or ( "[mod without name]" ) . to_owned ( ) ;
6671 let module_id = format ! ( "{prefix_id}::{module_name}" ) ;
67- let module_children = discover_tests_in_module ( db, c, module_id. clone ( ) ) ;
72+ let module_children = discover_tests_in_module ( db, c, module_id. clone ( ) , only_in_this_file ) ;
6873 if !module_children. is_empty ( ) {
69- let nav = c . to_nav ( db ) . call_site ;
74+ let nav = NavigationTarget :: from_module_to_decl ( sema . db , c ) . call_site ;
7075 r. push ( TestItem {
7176 id : module_id,
7277 kind : TestItemKind :: Module ,
@@ -76,7 +81,9 @@ fn discover_tests_in_module(db: &RootDatabase, module: Module, prefix_id: String
7681 text_range : Some ( nav. focus_or_full_range ( ) ) ,
7782 runnable : None ,
7883 } ) ;
79- r. extend ( module_children) ;
84+ if !only_in_this_file || c. is_inline ( db) {
85+ r. extend ( module_children) ;
86+ }
8087 }
8188 }
8289 for def in module. declarations ( db) {
@@ -112,6 +119,55 @@ pub(crate) fn discover_tests_in_crate_by_test_id(
112119 discover_tests_in_crate ( db, crate_id)
113120}
114121
122+ pub ( crate ) fn discover_tests_in_file ( db : & RootDatabase , file_id : FileId ) -> Vec < TestItem > {
123+ let sema = Semantics :: new ( db) ;
124+
125+ let Some ( module) = sema. file_to_module_def ( file_id) else { return vec ! [ ] } ;
126+ let Some ( ( mut tests, id) ) = find_module_id_and_test_parents ( & sema, module) else {
127+ return vec ! [ ] ;
128+ } ;
129+ tests. extend ( discover_tests_in_module ( db, module, id, true ) ) ;
130+ tests
131+ }
132+
133+ fn find_module_id_and_test_parents (
134+ sema : & Semantics < ' _ , RootDatabase > ,
135+ module : Module ,
136+ ) -> Option < ( Vec < TestItem > , String ) > {
137+ let Some ( parent) = module. parent ( sema. db ) else {
138+ let name = module. krate ( ) . display_name ( sema. db ) ?. to_string ( ) ;
139+ return Some ( (
140+ vec ! [ TestItem {
141+ id: name. clone( ) ,
142+ kind: TestItemKind :: Crate ( module. krate( ) . into( ) ) ,
143+ label: name. clone( ) ,
144+ parent: None ,
145+ file: None ,
146+ text_range: None ,
147+ runnable: None ,
148+ } ] ,
149+ name,
150+ ) ) ;
151+ } ;
152+ let ( mut r, mut id) = find_module_id_and_test_parents ( sema, parent) ?;
153+ let parent = Some ( id. clone ( ) ) ;
154+ id += "::" ;
155+ let module_name = & module. name ( sema. db ) ;
156+ let module_name = module_name. as_ref ( ) . and_then ( |n| n. as_str ( ) ) . unwrap_or ( "[mod without name]" ) ;
157+ id += module_name;
158+ let nav = NavigationTarget :: from_module_to_decl ( sema. db , module) . call_site ;
159+ r. push ( TestItem {
160+ id : id. clone ( ) ,
161+ kind : TestItemKind :: Module ,
162+ label : module_name. to_owned ( ) ,
163+ parent,
164+ file : Some ( nav. file_id ) ,
165+ text_range : Some ( nav. focus_or_full_range ( ) ) ,
166+ runnable : None ,
167+ } ) ;
168+ Some ( ( r, id) )
169+ }
170+
115171pub ( crate ) fn discover_tests_in_crate ( db : & RootDatabase , crate_id : CrateId ) -> Vec < TestItem > {
116172 let crate_graph = db. crate_graph ( ) ;
117173 if !crate_graph[ crate_id] . origin . is_local ( ) {
@@ -133,6 +189,6 @@ pub(crate) fn discover_tests_in_crate(db: &RootDatabase, crate_id: CrateId) -> V
133189 text_range: None ,
134190 runnable: None ,
135191 } ] ;
136- r. extend ( discover_tests_in_module ( db, module, crate_test_id) ) ;
192+ r. extend ( discover_tests_in_module ( db, module, crate_test_id, false ) ) ;
137193 r
138194}
0 commit comments