mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 20:43:21 +00:00
Support cfg(true)
and cfg(false)
As per RFC 3695.
This commit is contained in:
parent
6a67a4d3cd
commit
074050c242
10 changed files with 87 additions and 6 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -164,6 +164,7 @@ dependencies = [
|
||||||
"rustc-hash 2.0.0",
|
"rustc-hash 2.0.0",
|
||||||
"syntax",
|
"syntax",
|
||||||
"syntax-bridge",
|
"syntax-bridge",
|
||||||
|
"tracing",
|
||||||
"tt",
|
"tt",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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",
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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",
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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",
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue