@@ -78,6 +78,12 @@ pub(crate) fn to_known_assoc_constant(associated_to: &Path, name: &str) -> Optio
78
78
Some ( format ! ( "{}_{}" , prefix, name) )
79
79
}
80
80
81
+ #[ derive( Debug , Clone ) ]
82
+ pub struct LiteralStructField {
83
+ pub value : Literal ,
84
+ pub cfg : Option < Cfg > ,
85
+ }
86
+
81
87
#[ derive( Debug , Clone ) ]
82
88
pub enum Literal {
83
89
Expr ( String ) ,
@@ -101,7 +107,7 @@ pub enum Literal {
101
107
Struct {
102
108
path : Path ,
103
109
export_name : String ,
104
- fields : HashMap < String , Literal > ,
110
+ fields : HashMap < String , LiteralStructField > ,
105
111
} ,
106
112
Cast {
107
113
ty : Type ,
@@ -135,7 +141,7 @@ impl Literal {
135
141
self_ty. name ( ) . clone_into ( export_name) ;
136
142
}
137
143
for ref mut expr in fields. values_mut ( ) {
138
- expr. replace_self_with ( self_ty) ;
144
+ expr. value . replace_self_with ( self_ty) ;
139
145
}
140
146
}
141
147
Literal :: Cast {
@@ -203,7 +209,7 @@ impl Literal {
203
209
Literal :: FieldAccess { ref base, .. } => base. visit ( visitor) ,
204
210
Literal :: Struct { ref fields, .. } => {
205
211
for ( _name, field) in fields. iter ( ) {
206
- if !field. visit ( visitor) {
212
+ if !field. value . visit ( visitor) {
207
213
return false ;
208
214
}
209
215
}
@@ -250,7 +256,7 @@ impl Literal {
250
256
} => {
251
257
config. export . rename ( export_name) ;
252
258
for lit in fields. values_mut ( ) {
253
- lit. rename_for_config ( config) ;
259
+ lit. value . rename_for_config ( config) ;
254
260
}
255
261
}
256
262
Literal :: FieldAccess { ref mut base, .. } => {
@@ -388,12 +394,13 @@ impl Literal {
388
394
} => name,
389
395
_ => return Err ( format ! ( "Unsupported call expression. {:?}" , * expr) ) ,
390
396
} ;
391
- let mut fields = HashMap :: < String , Literal > :: default ( ) ;
397
+ let mut fields = HashMap :: < String , LiteralStructField > :: default ( ) ;
392
398
for ( index, arg) in args. iter ( ) . enumerate ( ) {
393
399
let ident =
394
400
member_to_ident ( & syn:: Member :: Unnamed ( syn:: Index :: from ( index) ) ) . to_string ( ) ;
395
401
let value = Literal :: load ( arg) ?;
396
- fields. insert ( ident, value) ;
402
+ let field = LiteralStructField { value, cfg : None } ;
403
+ fields. insert ( ident, field) ;
397
404
}
398
405
Ok ( Literal :: Struct {
399
406
path : Path :: new ( struct_name. clone ( ) ) ,
@@ -408,11 +415,13 @@ impl Literal {
408
415
..
409
416
} ) => {
410
417
let struct_name = path. segments [ 0 ] . ident . unraw ( ) . to_string ( ) ;
411
- let mut field_map = HashMap :: < String , Literal > :: default ( ) ;
418
+ let mut field_map = HashMap :: < String , LiteralStructField > :: default ( ) ;
412
419
for field in fields {
413
420
let ident = member_to_ident ( & field. member ) . to_string ( ) ;
421
+ let cfg = Cfg :: load ( & field. attrs ) ;
414
422
let value = Literal :: load ( & field. expr ) ?;
415
- field_map. insert ( ident, value) ;
423
+ let field = LiteralStructField { value, cfg } ;
424
+ field_map. insert ( ident, field) ;
416
425
}
417
426
Ok ( Literal :: Struct {
418
427
path : Path :: new ( struct_name. clone ( ) ) ,
@@ -682,7 +691,7 @@ impl Constant {
682
691
if !out. bindings ( ) . struct_is_transparent ( path) {
683
692
break ;
684
693
}
685
- value = fields. iter ( ) . next ( ) . unwrap ( ) . 1
694
+ value = & fields. iter ( ) . next ( ) . unwrap ( ) . 1 . value
686
695
}
687
696
688
697
language_backend. write_documentation ( out, self . documentation ( ) ) ;
0 commit comments