@@ -2,7 +2,7 @@ use crate::core::compiler::{
2
2
BuildConfig , CompileKind , MessageFormat , RustcTargetData , TimingOutput ,
3
3
} ;
4
4
use crate :: core:: resolver:: { CliFeatures , ForceAllTargets , HasDevUnits } ;
5
- use crate :: core:: { shell, Edition , Package , Target , TargetKind , Workspace } ;
5
+ use crate :: core:: { profiles :: Profiles , shell, Edition , Package , Target , TargetKind , Workspace } ;
6
6
use crate :: ops:: lockfile:: LOCKFILE_NAME ;
7
7
use crate :: ops:: registry:: RegistryOrIndex ;
8
8
use crate :: ops:: { self , CompileFilter , CompileOptions , NewOptions , Packages , VersionControl } ;
@@ -274,7 +274,11 @@ pub trait CommandExt: Sized {
274
274
self . _arg (
275
275
opt ( "profile" , profile)
276
276
. value_name ( "PROFILE-NAME" )
277
- . help_heading ( heading:: COMPILATION_OPTIONS ) ,
277
+ . help_heading ( heading:: COMPILATION_OPTIONS )
278
+ . add ( clap_complete:: ArgValueCandidates :: new ( || {
279
+ let candidates = get_profile_candidates ( ) ;
280
+ candidates. unwrap_or_default ( )
281
+ } ) ) ,
278
282
)
279
283
}
280
284
@@ -1106,6 +1110,56 @@ pub fn get_registry_candidates() -> CargoResult<Vec<clap_complete::CompletionCan
1106
1110
}
1107
1111
}
1108
1112
1113
+ fn get_profile_candidates ( ) -> CargoResult < Vec < clap_complete:: CompletionCandidate > > {
1114
+ match get_workspace_profile_candidates ( ) {
1115
+ Ok ( candidates) if !candidates. is_empty ( ) => Ok ( candidates) ,
1116
+ // fallback to default profile candidates
1117
+ _ => Ok ( default_profile_candidates ( ) ) ,
1118
+ }
1119
+ }
1120
+
1121
+ fn get_workspace_profile_candidates ( ) -> CargoResult < Vec < clap_complete:: CompletionCandidate > > {
1122
+ let gctx = new_gctx_for_completions ( ) ?;
1123
+ let ws = Workspace :: new ( & find_root_manifest_for_wd ( gctx. cwd ( ) ) ?, & gctx) ?;
1124
+ let profiles = Profiles :: new ( & ws, InternedString :: new ( "dev" ) ) ?;
1125
+
1126
+ let mut candidates = Vec :: new ( ) ;
1127
+ for name in profiles. profile_names ( ) {
1128
+ if let Ok ( profile_instance) = Profiles :: new ( & ws, name) {
1129
+ let base_profile = profile_instance. base_profile ( ) ;
1130
+
1131
+ let mut description = String :: from ( if base_profile. opt_level . as_str ( ) == "0" {
1132
+ "unoptimized"
1133
+ } else {
1134
+ "optimized"
1135
+ } ) ;
1136
+
1137
+ if base_profile. debuginfo . is_turned_on ( ) {
1138
+ description. push_str ( " + debuginfo" ) ;
1139
+ }
1140
+
1141
+ candidates. push (
1142
+ clap_complete:: CompletionCandidate :: new ( name. to_string ( ) )
1143
+ . help ( Some ( description. into ( ) ) ) ,
1144
+ ) ;
1145
+ }
1146
+ }
1147
+
1148
+ Ok ( candidates)
1149
+ }
1150
+
1151
+ fn default_profile_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1152
+ vec ! [
1153
+ clap_complete:: CompletionCandidate :: new( "dev" . to_string( ) )
1154
+ . help( Some ( "unoptimized + debuginfo" . into( ) ) ) ,
1155
+ clap_complete:: CompletionCandidate :: new( "release" . to_string( ) )
1156
+ . help( Some ( "optimized" . into( ) ) ) ,
1157
+ clap_complete:: CompletionCandidate :: new( "test" . to_string( ) )
1158
+ . help( Some ( "unoptimized + debuginfo" . into( ) ) ) ,
1159
+ clap_complete:: CompletionCandidate :: new( "bench" . to_string( ) ) . help( Some ( "optimized" . into( ) ) ) ,
1160
+ ]
1161
+ }
1162
+
1109
1163
fn get_example_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1110
1164
get_targets_from_metadata ( )
1111
1165
. unwrap_or_default ( )
0 commit comments