@@ -2,6 +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:: Dependency ;
5
6
use crate :: core:: { profiles:: Profiles , shell, Edition , Package , Target , TargetKind , Workspace } ;
6
7
use crate :: ops:: lockfile:: LOCKFILE_NAME ;
7
8
use crate :: ops:: registry:: RegistryOrIndex ;
@@ -23,8 +24,10 @@ use cargo_util_schemas::manifest::RegistryName;
23
24
use cargo_util_schemas:: manifest:: StringOrVec ;
24
25
use clap:: builder:: UnknownArgumentValueParser ;
25
26
use home:: cargo_home_with_cwd;
27
+ use indexmap:: IndexSet ;
28
+ use itertools:: Itertools ;
26
29
use semver:: Version ;
27
- use std:: collections:: HashMap ;
30
+ use std:: collections:: { HashMap , HashSet } ;
28
31
use std:: ffi:: { OsStr , OsString } ;
29
32
use std:: path:: Path ;
30
33
use std:: path:: PathBuf ;
@@ -1404,6 +1407,56 @@ fn get_packages() -> CargoResult<Vec<Package>> {
1404
1407
Ok ( packages)
1405
1408
}
1406
1409
1410
+ pub fn get_direct_dependencies_pkg_name_candidates ( ) -> Vec < clap_complete:: CompletionCandidate > {
1411
+ let ( current_package_deps, all_package_deps) = match get_dependencies_from_metadata ( ) {
1412
+ Ok ( v) => v,
1413
+ Err ( _) => return Vec :: new ( ) ,
1414
+ } ;
1415
+
1416
+ let current_package_deps_package_names = current_package_deps
1417
+ . into_iter ( )
1418
+ . map ( |dep| dep. package_name ( ) . to_string ( ) )
1419
+ . sorted ( ) ;
1420
+ let all_package_deps_package_names = all_package_deps
1421
+ . into_iter ( )
1422
+ . map ( |dep| dep. package_name ( ) . to_string ( ) )
1423
+ . sorted ( ) ;
1424
+
1425
+ let mut package_names_set = IndexSet :: new ( ) ;
1426
+ package_names_set. extend ( current_package_deps_package_names) ;
1427
+ package_names_set. extend ( all_package_deps_package_names) ;
1428
+
1429
+ package_names_set
1430
+ . into_iter ( )
1431
+ . map ( |name| name. into ( ) )
1432
+ . collect_vec ( )
1433
+ }
1434
+
1435
+ fn get_dependencies_from_metadata ( ) -> CargoResult < ( Vec < Dependency > , Vec < Dependency > ) > {
1436
+ let cwd = std:: env:: current_dir ( ) ?;
1437
+ let gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
1438
+ let ws = Workspace :: new ( & find_root_manifest_for_wd ( & cwd) ?, & gctx) ?;
1439
+ let current_package = ws. current ( ) . ok ( ) ;
1440
+
1441
+ let current_package_dependencies = ws
1442
+ . current ( )
1443
+ . map ( |current| current. dependencies ( ) )
1444
+ . unwrap_or_default ( )
1445
+ . to_vec ( ) ;
1446
+ let all_other_packages_dependencies = ws
1447
+ . members ( )
1448
+ . filter ( |& member| Some ( member) != current_package)
1449
+ . flat_map ( |pkg| pkg. dependencies ( ) . into_iter ( ) . cloned ( ) )
1450
+ . collect :: < HashSet < _ > > ( )
1451
+ . into_iter ( )
1452
+ . collect :: < Vec < _ > > ( ) ;
1453
+
1454
+ Ok ( (
1455
+ current_package_dependencies,
1456
+ all_other_packages_dependencies,
1457
+ ) )
1458
+ }
1459
+
1407
1460
pub fn new_gctx_for_completions ( ) -> CargoResult < GlobalContext > {
1408
1461
let cwd = std:: env:: current_dir ( ) ?;
1409
1462
let mut gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
0 commit comments