Support cfg(true) and cfg(false)

As per RFC 3695.
This commit is contained in:
Chayim Refael Friedman 2024-10-27 10:46:49 +02:00
parent 6a67a4d3cd
commit 074050c242
10 changed files with 87 additions and 6 deletions

1
Cargo.lock generated
View file

@ -164,6 +164,7 @@ dependencies = [
"rustc-hash 2.0.0", "rustc-hash 2.0.0",
"syntax", "syntax",
"syntax-bridge", "syntax-bridge",
"tracing",
"tt", "tt",
] ]

View file

@ -14,6 +14,7 @@ doctest = false
[dependencies] [dependencies]
rustc-hash.workspace = true rustc-hash.workspace = true
tracing.workspace = true
# locals deps # locals deps
tt = { workspace = true, optional = true } tt = { workspace = true, optional = true }

View file

@ -9,7 +9,7 @@ use std::fmt;
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use intern::Symbol; use intern::{sym, Symbol};
pub use cfg_expr::{CfgAtom, CfgExpr}; pub use cfg_expr::{CfgAtom, CfgExpr};
pub use dnf::DnfExpr; pub use dnf::DnfExpr;
@ -24,11 +24,17 @@ pub use dnf::DnfExpr;
/// of key and value in `key_values`. /// of key and value in `key_values`.
/// ///
/// See: <https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options> /// See: <https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options>
#[derive(Clone, PartialEq, Eq, Default)] #[derive(Clone, PartialEq, Eq)]
pub struct CfgOptions { pub struct CfgOptions {
enabled: FxHashSet<CfgAtom>, enabled: FxHashSet<CfgAtom>,
} }
impl Default for CfgOptions {
fn default() -> Self {
Self { enabled: FxHashSet::from_iter([CfgAtom::Flag(sym::true_.clone())]) }
}
}
impl fmt::Debug for CfgOptions { impl fmt::Debug for CfgOptions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut items = self let mut items = self
@ -54,23 +60,37 @@ impl CfgOptions {
} }
pub fn insert_atom(&mut self, key: Symbol) { pub fn insert_atom(&mut self, key: Symbol) {
self.enabled.insert(CfgAtom::Flag(key)); self.insert_any_atom(CfgAtom::Flag(key));
} }
pub fn insert_key_value(&mut self, key: Symbol, value: Symbol) { pub fn insert_key_value(&mut self, key: Symbol, value: Symbol) {
self.enabled.insert(CfgAtom::KeyValue { key, value }); self.insert_any_atom(CfgAtom::KeyValue { key, value });
} }
pub fn apply_diff(&mut self, diff: CfgDiff) { pub fn apply_diff(&mut self, diff: CfgDiff) {
for atom in diff.enable { for atom in diff.enable {
self.enabled.insert(atom); self.insert_any_atom(atom);
} }
for atom in diff.disable { for atom in diff.disable {
let (CfgAtom::Flag(sym) | CfgAtom::KeyValue { key: sym, .. }) = &atom;
if *sym == sym::true_ || *sym == sym::false_ {
tracing::error!("cannot remove `true` or `false` from cfg");
continue;
}
self.enabled.remove(&atom); self.enabled.remove(&atom);
} }
} }
fn insert_any_atom(&mut self, atom: CfgAtom) {
let (CfgAtom::Flag(sym) | CfgAtom::KeyValue { key: sym, .. }) = &atom;
if *sym == sym::true_ || *sym == sym::false_ {
tracing::error!("cannot insert `true` or `false` to cfg");
return;
}
self.enabled.insert(atom);
}
pub fn get_cfg_keys(&self) -> impl Iterator<Item = &Symbol> { pub fn get_cfg_keys(&self) -> impl Iterator<Item = &Symbol> {
self.enabled.iter().map(|it| match it { self.enabled.iter().map(|it| match it {
CfgAtom::Flag(key) => key, CfgAtom::Flag(key) => key,
@ -88,7 +108,7 @@ impl CfgOptions {
impl Extend<CfgAtom> for CfgOptions { impl Extend<CfgAtom> for CfgOptions {
fn extend<T: IntoIterator<Item = CfgAtom>>(&mut self, iter: T) { fn extend<T: IntoIterator<Item = CfgAtom>>(&mut self, iter: T) {
iter.into_iter().for_each(|cfg_flag| _ = self.enabled.insert(cfg_flag)); iter.into_iter().for_each(|cfg_flag| self.insert_any_atom(cfg_flag));
} }
} }

View file

@ -663,6 +663,7 @@ mod cfg {
ba dbg ba dbg
ba opt_level ba opt_level
ba test ba test
ba true
"#]], "#]],
); );
check( check(
@ -674,6 +675,7 @@ mod cfg {
ba dbg ba dbg
ba opt_level ba opt_level
ba test ba test
ba true
"#]], "#]],
); );
} }

View file

@ -192,6 +192,22 @@ union FooBar {
//- /outline_inner.rs //- /outline_inner.rs
#![cfg(outline_inner)] #![cfg(outline_inner)]
//- /outline.rs //- /outline.rs
"#,
);
}
#[test]
fn cfg_true_false() {
check(
r#"
#[cfg(false)] fn inactive() {}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ weak: code is inactive due to #[cfg] directives: false is disabled
#[cfg(true)] fn active() {}
#[cfg(any(not(true)), false)] fn inactive2() {}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ weak: code is inactive due to #[cfg] directives: true is enabled
"#, "#,
); );
} }

View file

@ -19,6 +19,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -81,6 +82,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -151,6 +153,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -221,6 +224,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -291,6 +295,7 @@
[ [
"feature=default", "feature=default",
"feature=std", "feature=std",
"true",
], ],
), ),
potential_cfg_options: Some( potential_cfg_options: Some(
@ -303,6 +308,7 @@
"feature=rustc-dep-of-std", "feature=rustc-dep-of-std",
"feature=std", "feature=std",
"feature=use_std", "feature=use_std",
"true",
], ],
), ),
), ),

View file

@ -19,6 +19,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -81,6 +82,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -151,6 +153,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -221,6 +224,7 @@
[ [
"rust_analyzer", "rust_analyzer",
"test", "test",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -291,6 +295,7 @@
[ [
"feature=default", "feature=default",
"feature=std", "feature=std",
"true",
], ],
), ),
potential_cfg_options: Some( potential_cfg_options: Some(
@ -303,6 +308,7 @@
"feature=rustc-dep-of-std", "feature=rustc-dep-of-std",
"feature=std", "feature=std",
"feature=use_std", "feature=use_std",
"true",
], ],
), ),
), ),

View file

@ -18,6 +18,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -79,6 +80,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -148,6 +150,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -217,6 +220,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -287,6 +291,7 @@
[ [
"feature=default", "feature=default",
"feature=std", "feature=std",
"true",
], ],
), ),
potential_cfg_options: Some( potential_cfg_options: Some(
@ -299,6 +304,7 @@
"feature=rustc-dep-of-std", "feature=rustc-dep-of-std",
"feature=std", "feature=std",
"feature=use_std", "feature=use_std",
"true",
], ],
), ),
), ),

View file

@ -17,6 +17,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -56,6 +57,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -86,6 +88,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -116,6 +119,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -146,6 +150,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -193,6 +198,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -223,6 +229,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -318,6 +325,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -348,6 +356,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -378,6 +387,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -410,6 +420,7 @@
"group1_other_cfg=other_config", "group1_other_cfg=other_config",
"group2_cfg=yet_another_config", "group2_cfg=yet_another_config",
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -485,6 +496,7 @@
"group2_cfg=fourth_config", "group2_cfg=fourth_config",
"group2_cfg=yet_another_config", "group2_cfg=yet_another_config",
"rust_analyzer", "rust_analyzer",
"true",
"unrelated_cfg", "unrelated_cfg",
], ],
), ),

View file

@ -17,6 +17,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -56,6 +57,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -86,6 +88,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -116,6 +119,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -146,6 +150,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -193,6 +198,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -223,6 +229,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -318,6 +325,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -348,6 +356,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -378,6 +387,7 @@
[ [
"debug_assertions", "debug_assertions",
"miri", "miri",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,
@ -407,6 +417,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"true",
], ],
), ),
potential_cfg_options: None, potential_cfg_options: None,