@@ -195,45 +195,35 @@ pub(crate) fn handle_view_item_tree(
195
195
}
196
196
197
197
// cargo test requires:
198
+ // - the package is a member of the workspace
199
+ // - the target in the package is not a build script (custom-build)
198
200
// - the package name - the root of the test identifier supplied to this handler can be
199
201
// a package or a target inside a package.
200
202
// - the target name - if the test identifier is a target, it's needed in addition to the
201
203
// package name to run the right test
202
204
// - real names - the test identifier uses the namespace form where hyphens are replaced with
203
205
// underscores. cargo test requires the real name.
204
206
// - the target kind e.g. bin or lib
205
- fn find_test_target ( namespace_root : & str , cargo : & CargoWorkspace ) -> Option < TestTarget > {
206
- cargo. packages ( ) . find_map ( |p| {
207
- let package_name = & cargo[ p] . name ;
208
- for target in cargo[ p] . targets . iter ( ) {
209
- let target_name = & cargo[ * target] . name ;
210
- if target_name. replace ( '-' , "_" ) == namespace_root {
211
- return Some ( TestTarget {
212
- package : package_name. clone ( ) ,
213
- target : target_name. clone ( ) ,
214
- kind : cargo[ * target] . kind ,
215
- } ) ;
207
+ fn all_test_targets ( cargo : & CargoWorkspace ) -> impl Iterator < Item = TestTarget > {
208
+ cargo. packages ( ) . filter ( |p| cargo[ * p] . is_member ) . flat_map ( |p| {
209
+ let package = & cargo[ p] ;
210
+ package. targets . iter ( ) . filter_map ( |t| {
211
+ let target = & cargo[ * t] ;
212
+ if target. kind == TargetKind :: BuildScript {
213
+ None
214
+ } else {
215
+ Some ( TestTarget {
216
+ package : package. name . clone ( ) ,
217
+ target : target. name . clone ( ) ,
218
+ kind : target. kind ,
219
+ } )
216
220
}
217
- }
218
- None
221
+ } )
219
222
} )
220
223
}
221
224
222
- fn get_all_targets ( cargo : & CargoWorkspace ) -> Vec < TestTarget > {
223
- cargo
224
- . packages ( )
225
- . flat_map ( |p| {
226
- let package_name = & cargo[ p] . name ;
227
- cargo[ p] . targets . iter ( ) . map ( |target| {
228
- let target_name = & cargo[ * target] . name ;
229
- TestTarget {
230
- package : package_name. clone ( ) ,
231
- target : target_name. clone ( ) ,
232
- kind : cargo[ * target] . kind ,
233
- }
234
- } )
235
- } )
236
- . collect ( )
225
+ fn find_test_target ( namespace_root : & str , cargo : & CargoWorkspace ) -> Option < TestTarget > {
226
+ all_test_targets ( cargo) . find ( |t| namespace_root == t. target . replace ( '-' , "_" ) )
237
227
}
238
228
239
229
pub ( crate ) fn handle_run_test (
@@ -265,7 +255,7 @@ pub(crate) fn handle_run_test(
265
255
}
266
256
} )
267
257
. collect_vec ( ) ,
268
- None => get_all_targets ( cargo) . into_iter ( ) . map ( |target| ( target, None ) ) . collect ( ) ,
258
+ None => all_test_targets ( cargo) . map ( |target| ( target, None ) ) . collect ( ) ,
269
259
} ;
270
260
271
261
for ( target, path) in tests {
0 commit comments