@@ -9,7 +9,7 @@ use std::fmt;
99
1010use rustc_hash:: FxHashSet ;
1111
12- use intern:: Symbol ;
12+ use intern:: { sym , Symbol } ;
1313
1414pub use cfg_expr:: { CfgAtom , CfgExpr } ;
1515pub use dnf:: DnfExpr ;
@@ -24,11 +24,17 @@ pub use dnf::DnfExpr;
2424/// of key and value in `key_values`.
2525///
2626/// See: <https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options>
27- #[ derive( Clone , PartialEq , Eq , Default ) ]
27+ #[ derive( Clone , PartialEq , Eq ) ]
2828pub struct CfgOptions {
2929 enabled : FxHashSet < CfgAtom > ,
3030}
3131
32+ impl Default for CfgOptions {
33+ fn default ( ) -> Self {
34+ Self { enabled : FxHashSet :: from_iter ( [ CfgAtom :: Flag ( sym:: true_. clone ( ) ) ] ) }
35+ }
36+ }
37+
3238impl fmt:: Debug for CfgOptions {
3339 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
3440 let mut items = self
@@ -54,23 +60,37 @@ impl CfgOptions {
5460 }
5561
5662 pub fn insert_atom ( & mut self , key : Symbol ) {
57- self . enabled . insert ( CfgAtom :: Flag ( key) ) ;
63+ self . insert_any_atom ( CfgAtom :: Flag ( key) ) ;
5864 }
5965
6066 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 } ) ;
6268 }
6369
6470 pub fn apply_diff ( & mut self , diff : CfgDiff ) {
6571 for atom in diff. enable {
66- self . enabled . insert ( atom) ;
72+ self . insert_any_atom ( atom) ;
6773 }
6874
6975 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+ }
7081 self . enabled . remove ( & atom) ;
7182 }
7283 }
7384
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+
7494 pub fn get_cfg_keys ( & self ) -> impl Iterator < Item = & Symbol > {
7595 self . enabled . iter ( ) . map ( |it| match it {
7696 CfgAtom :: Flag ( key) => key,
@@ -88,7 +108,7 @@ impl CfgOptions {
88108
89109impl Extend < CfgAtom > for CfgOptions {
90110 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) ) ;
92112 }
93113}
94114
0 commit comments