52
52
use base_db:: { CrateDisplayName , CrateName } ;
53
53
use cfg:: CfgAtom ;
54
54
use paths:: { AbsPath , AbsPathBuf , Utf8PathBuf } ;
55
- use rustc_hash:: FxHashMap ;
55
+ use rustc_hash:: { FxHashMap , FxHashSet } ;
56
56
use serde:: { de, Deserialize , Serialize } ;
57
57
use span:: Edition ;
58
58
@@ -122,6 +122,25 @@ impl ProjectJson {
122
122
None => None ,
123
123
} ;
124
124
125
+ let cfg = crate_data
126
+ . cfg_groups
127
+ . iter ( )
128
+ . flat_map ( |cfg_extend| {
129
+ let cfg_group = data. cfg_groups . get ( cfg_extend) ;
130
+ match cfg_group {
131
+ Some ( cfg_group) => cfg_group. 0 . iter ( ) . cloned ( ) ,
132
+ None => {
133
+ tracing:: error!(
134
+ "Unknown cfg group `{cfg_extend}` in crate `{}`" ,
135
+ crate_data. display_name. as_deref( ) . unwrap_or( "<unknown>" ) ,
136
+ ) ;
137
+ [ ] . iter ( ) . cloned ( )
138
+ }
139
+ }
140
+ } )
141
+ . chain ( crate_data. cfg . 0 )
142
+ . collect ( ) ;
143
+
125
144
Crate {
126
145
display_name : crate_data
127
146
. display_name
@@ -131,7 +150,7 @@ impl ProjectJson {
131
150
edition : crate_data. edition . into ( ) ,
132
151
version : crate_data. version . as_ref ( ) . map ( ToString :: to_string) ,
133
152
deps : crate_data. deps ,
134
- cfg : crate_data . cfg ,
153
+ cfg,
135
154
target : crate_data. target ,
136
155
env : crate_data. env ,
137
156
proc_macro_dylib_path : crate_data
@@ -306,11 +325,17 @@ pub enum RunnableKind {
306
325
pub struct ProjectJsonData {
307
326
sysroot : Option < Utf8PathBuf > ,
308
327
sysroot_src : Option < Utf8PathBuf > ,
328
+ #[ serde( default ) ]
329
+ cfg_groups : FxHashMap < String , CfgList > ,
309
330
crates : Vec < CrateData > ,
310
331
#[ serde( default ) ]
311
332
runnables : Vec < RunnableData > ,
312
333
}
313
334
335
+ #[ derive( Serialize , Deserialize , Debug , Clone , Eq , PartialEq , Default ) ]
336
+ #[ serde( transparent) ]
337
+ struct CfgList ( #[ serde( with = "cfg_" ) ] Vec < CfgAtom > ) ;
338
+
314
339
#[ derive( Serialize , Deserialize , Debug , Clone , Eq , PartialEq ) ]
315
340
struct CrateData {
316
341
display_name : Option < String > ,
@@ -320,8 +345,9 @@ struct CrateData {
320
345
version : Option < semver:: Version > ,
321
346
deps : Vec < Dep > ,
322
347
#[ serde( default ) ]
323
- #[ serde( with = "cfg_" ) ]
324
- cfg : Vec < CfgAtom > ,
348
+ cfg_groups : FxHashSet < String > ,
349
+ #[ serde( default ) ]
350
+ cfg : CfgList ,
325
351
target : Option < String > ,
326
352
#[ serde( default ) ]
327
353
env : FxHashMap < String , String > ,
0 commit comments