@@ -24,7 +24,7 @@ use cargo_util_schemas::manifest::StringOrVec;
24
24
use clap:: builder:: UnknownArgumentValueParser ;
25
25
use home:: cargo_home_with_cwd;
26
26
use semver:: Version ;
27
- use std:: collections:: HashMap ;
27
+ use std:: collections:: { BTreeMap , HashMap } ;
28
28
use std:: ffi:: { OsStr , OsString } ;
29
29
use std:: path:: Path ;
30
30
use std:: path:: PathBuf ;
@@ -1370,6 +1370,50 @@ fn new_gctx_for_completions() -> CargoResult<GlobalContext> {
1370
1370
Ok ( gctx)
1371
1371
}
1372
1372
1373
+ pub fn get_alias_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1374
+ if let Ok ( gctx) = new_gctx_for_completions ( ) {
1375
+ let alias_map = user_defined_aliases ( & gctx) ;
1376
+ return alias_map
1377
+ . iter ( )
1378
+ . map ( |( alias, cmd_info) | {
1379
+ let help_text = match cmd_info {
1380
+ CommandInfo :: Alias { target } => {
1381
+ let cmd_str = target
1382
+ . iter ( )
1383
+ . map ( String :: as_str)
1384
+ . collect :: < Vec < _ > > ( )
1385
+ . join ( " " ) ;
1386
+ format ! ( "alias for {}" , cmd_str)
1387
+ }
1388
+ CommandInfo :: BuiltIn { .. } => {
1389
+ unreachable ! ( "BuiltIn command shouldn't appear in alias map" )
1390
+ }
1391
+ CommandInfo :: External { .. } => {
1392
+ unreachable ! ( "External command shouldn't appear in alias map" )
1393
+ }
1394
+ } ;
1395
+ clap_complete:: CompletionCandidate :: new ( alias. clone ( ) ) . help ( Some ( help_text. into ( ) ) )
1396
+ } )
1397
+ . collect ( ) ;
1398
+ }
1399
+ Vec :: new ( )
1400
+ }
1401
+
1402
+ pub fn user_defined_aliases ( gctx : & GlobalContext ) -> BTreeMap < String , CommandInfo > {
1403
+ let mut commands = BTreeMap :: new ( ) ;
1404
+ if let Ok ( aliases) = gctx. get :: < BTreeMap < String , StringOrVec > > ( "alias" ) {
1405
+ for ( name, target) in aliases. iter ( ) {
1406
+ commands. insert (
1407
+ name. to_string ( ) ,
1408
+ CommandInfo :: Alias {
1409
+ target : target. clone ( ) ,
1410
+ } ,
1411
+ ) ;
1412
+ }
1413
+ }
1414
+ commands
1415
+ }
1416
+
1373
1417
#[ track_caller]
1374
1418
pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
1375
1419
match r {
0 commit comments