add support of feature flag for runnables #4464

Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
This commit is contained in:
Benjamin Coenen 2020-05-23 20:59:18 +02:00
parent 43339058e3
commit 48d7c61e26
6 changed files with 145 additions and 99 deletions

View file

@ -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());
}
}