@@ -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,50 @@ 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 = 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+
13731417#[ track_caller]
13741418pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
13751419 match r {
0 commit comments