mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-03 23:25:03 +00:00
add support of feature flag for runnables #4464
Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
This commit is contained in:
parent
43339058e3
commit
48d7c61e26
6 changed files with 145 additions and 99 deletions
|
@ -33,33 +33,6 @@ impl CfgExpr {
|
|||
CfgExpr::Not(pred) => pred.fold(query).map(|s| !s),
|
||||
}
|
||||
}
|
||||
|
||||
/// Return minimal features needed
|
||||
pub fn minimal_features_needed(&self) -> Vec<SmolStr> {
|
||||
let mut features = vec![];
|
||||
self.collect_minimal_features_needed(&mut features);
|
||||
|
||||
features
|
||||
}
|
||||
|
||||
fn collect_minimal_features_needed(&self, features: &mut Vec<SmolStr>) {
|
||||
match self {
|
||||
CfgExpr::KeyValue { key, value } if key == "feature" => features.push(value.clone()),
|
||||
CfgExpr::All(preds) => {
|
||||
preds.iter().for_each(|cfg| cfg.collect_minimal_features_needed(features));
|
||||
}
|
||||
CfgExpr::Any(preds) => {
|
||||
for cfg in preds {
|
||||
let len_features = features.len();
|
||||
cfg.collect_minimal_features_needed(features);
|
||||
if len_features != features.len() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_cfg(tt: &Subtree) -> CfgExpr {
|
||||
|
@ -160,32 +133,4 @@ mod tests {
|
|||
]),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cfg_expr_minimal_features_needed() {
|
||||
let (subtree, _) = get_token_tree_generated(r#"#![cfg(feature = "baz")]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
assert_eq!(cfg_expr.minimal_features_needed(), vec![SmolStr::new("baz")]);
|
||||
|
||||
let (subtree, _) =
|
||||
get_token_tree_generated(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
assert_eq!(
|
||||
cfg_expr.minimal_features_needed(),
|
||||
vec![SmolStr::new("baz"), SmolStr::new("foo")]
|
||||
);
|
||||
|
||||
let (subtree, _) =
|
||||
get_token_tree_generated(r#"#![cfg(any(feature = "baz", feature = "foo", unix))]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
assert_eq!(cfg_expr.minimal_features_needed(), vec![SmolStr::new("baz")]);
|
||||
|
||||
let (subtree, _) = get_token_tree_generated(r#"#![cfg(foo)]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
assert!(cfg_expr.minimal_features_needed().is_empty());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue