@@ -9,7 +9,7 @@ use std::fmt;
9
9
10
10
use rustc_hash:: FxHashSet ;
11
11
12
- use intern:: Symbol ;
12
+ use intern:: { sym , Symbol } ;
13
13
14
14
pub use cfg_expr:: { CfgAtom , CfgExpr } ;
15
15
pub use dnf:: DnfExpr ;
@@ -24,11 +24,17 @@ pub use dnf::DnfExpr;
24
24
/// of key and value in `key_values`.
25
25
///
26
26
/// See: <https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options>
27
- #[ derive( Clone , PartialEq , Eq , Default ) ]
27
+ #[ derive( Clone , PartialEq , Eq ) ]
28
28
pub struct CfgOptions {
29
29
enabled : FxHashSet < CfgAtom > ,
30
30
}
31
31
32
+ impl Default for CfgOptions {
33
+ fn default ( ) -> Self {
34
+ Self { enabled : FxHashSet :: from_iter ( [ CfgAtom :: Flag ( sym:: true_. clone ( ) ) ] ) }
35
+ }
36
+ }
37
+
32
38
impl fmt:: Debug for CfgOptions {
33
39
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
34
40
let mut items = self
@@ -54,23 +60,37 @@ impl CfgOptions {
54
60
}
55
61
56
62
pub fn insert_atom ( & mut self , key : Symbol ) {
57
- self . enabled . insert ( CfgAtom :: Flag ( key) ) ;
63
+ self . insert_any_atom ( CfgAtom :: Flag ( key) ) ;
58
64
}
59
65
60
66
pub fn insert_key_value ( & mut self , key : Symbol , value : Symbol ) {
61
- self . enabled . insert ( CfgAtom :: KeyValue { key, value } ) ;
67
+ self . insert_any_atom ( CfgAtom :: KeyValue { key, value } ) ;
62
68
}
63
69
64
70
pub fn apply_diff ( & mut self , diff : CfgDiff ) {
65
71
for atom in diff. enable {
66
- self . enabled . insert ( atom) ;
72
+ self . insert_any_atom ( atom) ;
67
73
}
68
74
69
75
for atom in diff. disable {
76
+ let ( CfgAtom :: Flag ( sym) | CfgAtom :: KeyValue { key : sym, .. } ) = & atom;
77
+ if * sym == sym:: true_ || * sym == sym:: false_ {
78
+ tracing:: error!( "cannot remove `true` or `false` from cfg" ) ;
79
+ continue ;
80
+ }
70
81
self . enabled . remove ( & atom) ;
71
82
}
72
83
}
73
84
85
+ fn insert_any_atom ( & mut self , atom : CfgAtom ) {
86
+ let ( CfgAtom :: Flag ( sym) | CfgAtom :: KeyValue { key : sym, .. } ) = & atom;
87
+ if * sym == sym:: true_ || * sym == sym:: false_ {
88
+ tracing:: error!( "cannot insert `true` or `false` to cfg" ) ;
89
+ return ;
90
+ }
91
+ self . enabled . insert ( atom) ;
92
+ }
93
+
74
94
pub fn get_cfg_keys ( & self ) -> impl Iterator < Item = & Symbol > {
75
95
self . enabled . iter ( ) . map ( |it| match it {
76
96
CfgAtom :: Flag ( key) => key,
@@ -88,7 +108,7 @@ impl CfgOptions {
88
108
89
109
impl Extend < CfgAtom > for CfgOptions {
90
110
fn extend < T : IntoIterator < Item = CfgAtom > > ( & mut self , iter : T ) {
91
- iter. into_iter ( ) . for_each ( |cfg_flag| _ = self . enabled . insert ( cfg_flag) ) ;
111
+ iter. into_iter ( ) . for_each ( |cfg_flag| self . insert_any_atom ( cfg_flag) ) ;
92
112
}
93
113
}
94
114
0 commit comments