@@ -89,10 +89,18 @@ pub trait CommandExt: Sized {
89
89
}
90
90
91
91
fn arg_package_spec_simple ( self , package : & ' static str ) -> Self {
92
+ let name = self . _name ( ) ;
92
93
self . _arg (
93
94
optional_multi_opt ( "package" , "SPEC" , package)
94
95
. short ( 'p' )
95
- . help_heading ( heading:: PACKAGE_SELECTION ) ,
96
+ . help_heading ( heading:: PACKAGE_SELECTION )
97
+ . add ( clap_complete:: ArgValueCandidates :: new ( move || {
98
+ if [ "build" , "tree" ] . contains ( & name. as_str ( ) ) {
99
+ get_ws_member_candidates ( )
100
+ } else {
101
+ vec ! [ ]
102
+ }
103
+ } ) ) ,
96
104
)
97
105
}
98
106
@@ -101,7 +109,10 @@ pub trait CommandExt: Sized {
101
109
optional_opt ( "package" , package)
102
110
. short ( 'p' )
103
111
. value_name ( "SPEC" )
104
- . help_heading ( heading:: PACKAGE_SELECTION ) ,
112
+ . help_heading ( heading:: PACKAGE_SELECTION )
113
+ . add ( clap_complete:: ArgValueCandidates :: new (
114
+ get_ws_member_candidates,
115
+ ) ) ,
105
116
)
106
117
}
107
118
@@ -1304,6 +1315,31 @@ fn get_packages() -> CargoResult<Vec<Package>> {
1304
1315
Ok ( packages)
1305
1316
}
1306
1317
1318
+ fn get_ws_member_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1319
+ get_ws_member_packages ( )
1320
+ . unwrap_or_default ( )
1321
+ . into_iter ( )
1322
+ . map ( |pkg| {
1323
+ clap_complete:: CompletionCandidate :: new ( pkg. name ( ) . as_str ( ) ) . help (
1324
+ pkg. manifest ( )
1325
+ . metadata ( )
1326
+ . description
1327
+ . to_owned ( )
1328
+ . map ( From :: from) ,
1329
+ )
1330
+ } )
1331
+ . collect :: < Vec < _ > > ( )
1332
+ }
1333
+
1334
+ fn get_ws_member_packages ( ) -> CargoResult < Vec < Package > > {
1335
+ let gctx = new_gctx_for_completions ( ) ?;
1336
+ let ws = Workspace :: new ( & find_root_manifest_for_wd ( gctx. cwd ( ) ) ?, & gctx) ?;
1337
+
1338
+ let packages = ws. members ( ) . map ( |pkg| pkg. to_owned ( ) ) . collect :: < Vec < _ > > ( ) ;
1339
+
1340
+ Ok ( packages)
1341
+ }
1342
+
1307
1343
fn new_gctx_for_completions ( ) -> CargoResult < GlobalContext > {
1308
1344
let cwd = std:: env:: current_dir ( ) ?;
1309
1345
let mut gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
0 commit comments