11//! Gathering dependencies is the largest part of annotating.
22
33use anyhow:: { bail, Result } ;
4- use cargo_metadata:: { Metadata as CargoMetadata , Node , NodeDep , Package , PackageId } ;
4+ use cargo_metadata:: {
5+ DependencyKind , Metadata as CargoMetadata , Node , NodeDep , Package , PackageId ,
6+ } ;
57use cargo_platform:: Platform ;
68use serde:: { Deserialize , Serialize } ;
79
@@ -47,8 +49,8 @@ impl DependencySet {
4749 . partition ( |dep| is_dev_dependency ( dep) ) ;
4850
4951 (
50- collect_deps_selectable ( node, dev, metadata) ,
51- collect_deps_selectable ( node, normal, metadata) ,
52+ collect_deps_selectable ( node, dev, metadata, DependencyKind :: Normal ) ,
53+ collect_deps_selectable ( node, normal, metadata, DependencyKind :: Normal ) ,
5254 )
5355 } ;
5456
@@ -63,8 +65,8 @@ impl DependencySet {
6365 . partition ( |dep| is_dev_dependency ( dep) ) ;
6466
6567 (
66- collect_deps_selectable ( node, dev, metadata) ,
67- collect_deps_selectable ( node, normal, metadata) ,
68+ collect_deps_selectable ( node, dev, metadata, DependencyKind :: Development ) ,
69+ collect_deps_selectable ( node, normal, metadata, DependencyKind :: Development ) ,
6870 )
6971 } ;
7072
@@ -81,8 +83,8 @@ impl DependencySet {
8183 . partition ( |dep| is_proc_macro_package ( & metadata[ & dep. pkg ] ) ) ;
8284
8385 (
84- collect_deps_selectable ( node, proc_macro, metadata) ,
85- collect_deps_selectable ( node, normal, metadata) ,
86+ collect_deps_selectable ( node, proc_macro, metadata, DependencyKind :: Build ) ,
87+ collect_deps_selectable ( node, normal, metadata, DependencyKind :: Build ) ,
8688 )
8789 } ;
8890
@@ -126,6 +128,7 @@ fn is_optional_crate_enabled(
126128 dep : & NodeDep ,
127129 target : Option < & Platform > ,
128130 metadata : & CargoMetadata ,
131+ kind : DependencyKind ,
129132) -> bool {
130133 let pkg = & metadata[ & parent. id ] ;
131134
@@ -141,6 +144,7 @@ fn is_optional_crate_enabled(
141144 if let Some ( toml_dep) = pkg
142145 . dependencies
143146 . iter ( )
147+ . filter ( |& d| d. kind == kind)
144148 . filter ( |& d| d. target . as_ref ( ) == target)
145149 . filter ( |& d| d. optional )
146150 . find ( |& d| sanitize_module_name ( & d. name ) == dep. name )
@@ -155,6 +159,7 @@ fn collect_deps_selectable(
155159 node : & Node ,
156160 deps : Vec < & NodeDep > ,
157161 metadata : & cargo_metadata:: Metadata ,
162+ kind : DependencyKind ,
158163) -> SelectList < Dependency > {
159164 let mut selectable = SelectList :: default ( ) ;
160165
@@ -165,7 +170,7 @@ fn collect_deps_selectable(
165170 let alias = get_target_alias ( & dep. name , dep_pkg) ;
166171
167172 for kind_info in & dep. dep_kinds {
168- if is_optional_crate_enabled ( node, dep, kind_info. target . as_ref ( ) , metadata) {
173+ if is_optional_crate_enabled ( node, dep, kind_info. target . as_ref ( ) , metadata, kind ) {
169174 selectable. insert (
170175 Dependency {
171176 package_id : dep. pkg . clone ( ) ,
@@ -684,4 +689,24 @@ mod test {
684689 . expect( "Iterating over known keys should never panic" )
685690 . any( |dep| { dep. target_name == "mio" } ) ) ;
686691 }
692+
693+ #[ test]
694+ fn optional_deps_disabled_build_dep_enabled ( ) {
695+ let metadata = metadata:: optional_deps_disabled_build_dep_enabled ( ) ;
696+
697+ let node = find_metadata_node ( "gherkin" , & metadata) ;
698+ let dependencies = DependencySet :: new_for_node ( node, & metadata) ;
699+
700+ assert ! ( !dependencies
701+ . normal_deps
702+ . get_iter( None )
703+ . expect( "Iterating over known keys should never panic" )
704+ . any( |dep| dep. target_name == "serde" ) ) ;
705+
706+ assert ! ( dependencies
707+ . build_deps
708+ . get_iter( None )
709+ . expect( "Iterating over known keys should never panic" )
710+ . any( |dep| dep. target_name == "serde" ) ) ;
711+ }
687712}
0 commit comments