Merge #5505
5505: Cleanup CFG API r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
@@ -177,49 +177,35 @@ fn required_features(cfg_expr: &CfgExpr, features: &mut Vec<String>) {
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
use mbe::{ast_to_token_tree, TokenMap};
|
||||
use ra_cfg::parse_cfg;
|
||||
use mbe::ast_to_token_tree;
|
||||
use ra_cfg::CfgExpr;
|
||||
use ra_syntax::{
|
||||
ast::{self, AstNode},
|
||||
SmolStr,
|
||||
};
|
||||
|
||||
fn get_token_tree_generated(input: &str) -> (tt::Subtree, TokenMap) {
|
||||
let source_file = ast::SourceFile::parse(input).ok().unwrap();
|
||||
let tt = source_file.syntax().descendants().find_map(ast::TokenTree::cast).unwrap();
|
||||
ast_to_token_tree(&tt).unwrap()
|
||||
fn check(cfg: &str, expected_features: &[&str]) {
|
||||
let cfg_expr = {
|
||||
let source_file = ast::SourceFile::parse(cfg).ok().unwrap();
|
||||
let tt = source_file.syntax().descendants().find_map(ast::TokenTree::cast).unwrap();
|
||||
let (tt, _) = ast_to_token_tree(&tt).unwrap();
|
||||
CfgExpr::parse(&tt)
|
||||
};
|
||||
|
||||
let mut features = vec![];
|
||||
required_features(&cfg_expr, &mut features);
|
||||
|
||||
let expected_features =
|
||||
expected_features.iter().map(|&it| SmolStr::new(it)).collect::<Vec<_>>();
|
||||
|
||||
assert_eq!(features, expected_features);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cfg_expr_minimal_features_needed() {
|
||||
let (subtree, _) = get_token_tree_generated(r#"#![cfg(feature = "baz")]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
let mut min_features = vec![];
|
||||
required_features(&cfg_expr, &mut min_features);
|
||||
|
||||
assert_eq!(min_features, vec![SmolStr::new("baz")]);
|
||||
|
||||
let (subtree, _) =
|
||||
get_token_tree_generated(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
let mut min_features = vec![];
|
||||
required_features(&cfg_expr, &mut min_features);
|
||||
assert_eq!(min_features, 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);
|
||||
|
||||
let mut min_features = vec![];
|
||||
required_features(&cfg_expr, &mut min_features);
|
||||
assert_eq!(min_features, vec![SmolStr::new("baz")]);
|
||||
|
||||
let (subtree, _) = get_token_tree_generated(r#"#![cfg(foo)]"#);
|
||||
let cfg_expr = parse_cfg(&subtree);
|
||||
|
||||
let mut min_features = vec![];
|
||||
required_features(&cfg_expr, &mut min_features);
|
||||
assert!(min_features.is_empty());
|
||||
check(r#"#![cfg(feature = "baz")]"#, &["baz"]);
|
||||
check(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#, &["baz", "foo"]);
|
||||
check(r#"#![cfg(any(feature = "baz", feature = "foo", unix))]"#, &["baz"]);
|
||||
check(r#"#![cfg(foo)]"#, &[]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user