@@ -7,7 +7,7 @@ use ide_db::{
7
7
} ;
8
8
use syntax:: TextRange ;
9
9
10
- use crate :: { navigation_target :: ToNav , runnables:: runnable_fn, Runnable , TryToNav } ;
10
+ use crate :: { runnables:: runnable_fn, NavigationTarget , Runnable , TryToNav } ;
11
11
12
12
#[ derive( Debug ) ]
13
13
pub enum TestItemKind {
@@ -56,17 +56,22 @@ fn find_crate_by_id(crate_graph: &CrateGraph, crate_id: &str) -> Option<CrateId>
56
56
} )
57
57
}
58
58
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 > {
60
65
let sema = Semantics :: new ( db) ;
61
66
62
67
let mut r = vec ! [ ] ;
63
68
for c in module. children ( db) {
64
69
let module_name =
65
70
c. name ( db) . as_ref ( ) . and_then ( |n| n. as_str ( ) ) . unwrap_or ( "[mod without name]" ) . to_owned ( ) ;
66
71
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 ) ;
68
73
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 ;
70
75
r. push ( TestItem {
71
76
id : module_id,
72
77
kind : TestItemKind :: Module ,
@@ -76,7 +81,9 @@ fn discover_tests_in_module(db: &RootDatabase, module: Module, prefix_id: String
76
81
text_range : Some ( nav. focus_or_full_range ( ) ) ,
77
82
runnable : None ,
78
83
} ) ;
79
- r. extend ( module_children) ;
84
+ if !only_in_this_file || c. is_inline ( db) {
85
+ r. extend ( module_children) ;
86
+ }
80
87
}
81
88
}
82
89
for def in module. declarations ( db) {
@@ -112,6 +119,55 @@ pub(crate) fn discover_tests_in_crate_by_test_id(
112
119
discover_tests_in_crate ( db, crate_id)
113
120
}
114
121
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
+
115
171
pub ( crate ) fn discover_tests_in_crate ( db : & RootDatabase , crate_id : CrateId ) -> Vec < TestItem > {
116
172
let crate_graph = db. crate_graph ( ) ;
117
173
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
133
189
text_range: None ,
134
190
runnable: None ,
135
191
} ] ;
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 ) ) ;
137
193
r
138
194
}
0 commit comments