@@ -24,7 +24,7 @@ use cargo_util_schemas::manifest::StringOrVec;
2424use clap:: builder:: UnknownArgumentValueParser ;
2525use home:: cargo_home_with_cwd;
2626use semver:: Version ;
27- use std:: collections:: HashMap ;
27+ use std:: collections:: { BTreeMap , HashMap } ;
2828use std:: ffi:: { OsStr , OsString } ;
2929use std:: path:: Path ;
3030use std:: path:: PathBuf ;
@@ -1370,6 +1370,44 @@ fn new_gctx_for_completions() -> CargoResult<GlobalContext> {
13701370 Ok ( gctx)
13711371}
13721372
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 = if let CommandInfo :: Alias { target } = cmd_info {
1380+ let cmd_str = target
1381+ . iter ( )
1382+ . map ( String :: as_str)
1383+ . collect :: < Vec < _ > > ( )
1384+ . join ( " " ) ;
1385+ format ! ( "alias for {}" , cmd_str)
1386+ } else {
1387+ "alias (from config)" . to_string ( )
1388+ } ;
1389+ clap_complete:: CompletionCandidate :: new ( alias. clone ( ) ) . help ( Some ( help_text. into ( ) ) )
1390+ } )
1391+ . collect ( ) ;
1392+ }
1393+ Vec :: new ( )
1394+ }
1395+
1396+ pub fn user_defined_aliases ( gctx : & GlobalContext ) -> BTreeMap < String , CommandInfo > {
1397+ let mut commands = BTreeMap :: new ( ) ;
1398+ if let Ok ( aliases) = gctx. get :: < BTreeMap < String , StringOrVec > > ( "alias" ) {
1399+ for ( name, target) in aliases. iter ( ) {
1400+ commands. insert (
1401+ name. to_string ( ) ,
1402+ CommandInfo :: Alias {
1403+ target : target. clone ( ) ,
1404+ } ,
1405+ ) ;
1406+ }
1407+ }
1408+ commands
1409+ }
1410+
13731411#[ track_caller]
13741412pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
13751413 match r {
0 commit comments