1
1
use crate :: core:: compiler:: { BuildConfig , MessageFormat , TimingOutput } ;
2
2
use crate :: core:: resolver:: CliFeatures ;
3
- use crate :: core:: { Edition , Workspace } ;
3
+ use crate :: core:: { shell , Edition , Target , TargetKind , Workspace } ;
4
4
use crate :: ops:: lockfile:: LOCKFILE_NAME ;
5
5
use crate :: ops:: registry:: RegistryOrIndex ;
6
6
use crate :: ops:: { CompileFilter , CompileOptions , NewOptions , Packages , VersionControl } ;
@@ -19,6 +19,7 @@ use cargo_util_schemas::manifest::ProfileName;
19
19
use cargo_util_schemas:: manifest:: RegistryName ;
20
20
use cargo_util_schemas:: manifest:: StringOrVec ;
21
21
use clap:: builder:: UnknownArgumentValueParser ;
22
+ use home:: cargo_home_with_cwd;
22
23
use std:: ffi:: { OsStr , OsString } ;
23
24
use std:: path:: Path ;
24
25
use std:: path:: PathBuf ;
@@ -155,7 +156,11 @@ pub trait CommandExt: Sized {
155
156
) -> Self {
156
157
self . arg_targets_lib_bin_example ( lib, bin, bins, example, examples)
157
158
. _arg ( flag ( "tests" , tests) . help_heading ( heading:: TARGET_SELECTION ) )
158
- . _arg ( optional_multi_opt ( "test" , "NAME" , test) . help_heading ( heading:: TARGET_SELECTION ) )
159
+ . _arg (
160
+ optional_multi_opt ( "test" , "NAME" , test)
161
+ . help_heading ( heading:: TARGET_SELECTION )
162
+ . add ( clap_complete:: ArgValueCandidates :: new ( get_test_candidates) ) ,
163
+ )
159
164
. _arg ( flag ( "benches" , benches) . help_heading ( heading:: TARGET_SELECTION ) )
160
165
. _arg (
161
166
optional_multi_opt ( "bench" , "NAME" , bench) . help_heading ( heading:: TARGET_SELECTION ) ,
@@ -1027,6 +1032,32 @@ pub fn lockfile_path(
1027
1032
return Ok ( Some ( path) ) ;
1028
1033
}
1029
1034
1035
+ fn get_test_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1036
+ get_targets_from_metadata ( )
1037
+ . unwrap_or_default ( )
1038
+ . into_iter ( )
1039
+ . filter_map ( |target| match target. kind ( ) {
1040
+ TargetKind :: Test => Some ( clap_complete:: CompletionCandidate :: new ( target. name ( ) ) ) ,
1041
+ _ => None ,
1042
+ } )
1043
+ . collect :: < Vec < _ > > ( )
1044
+ }
1045
+
1046
+ fn get_targets_from_metadata ( ) -> CargoResult < Vec < Target > > {
1047
+ let cwd = std:: env:: current_dir ( ) ?;
1048
+ let gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
1049
+ let ws = Workspace :: new ( & find_root_manifest_for_wd ( & cwd) ?, & gctx) ?;
1050
+
1051
+ let packages = ws. members ( ) . collect :: < Vec < _ > > ( ) ;
1052
+
1053
+ let targets = packages
1054
+ . into_iter ( )
1055
+ . flat_map ( |pkg| pkg. targets ( ) . into_iter ( ) . cloned ( ) )
1056
+ . collect :: < Vec < _ > > ( ) ;
1057
+
1058
+ Ok ( targets)
1059
+ }
1060
+
1030
1061
#[ track_caller]
1031
1062
pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
1032
1063
match r {
0 commit comments