diff options
author | Aleksey Kladov <[email protected]> | 2020-07-23 15:22:17 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-07-23 15:53:12 +0100 |
commit | 38e38d9b290ff90973c25a06962b81dbbb5d3d9e (patch) | |
tree | 53bd0741216f4db6b8ab8a16b8dccaf2855f5ab9 /crates/rust-analyzer/src/cargo_target_spec.rs | |
parent | 0cf8ee2dc22569fac2115c41b85d5df23af3ce5a (diff) |
Cleanup CFG API
Diffstat (limited to 'crates/rust-analyzer/src/cargo_target_spec.rs')
-rw-r--r-- | crates/rust-analyzer/src/cargo_target_spec.rs | 56 |
1 files changed, 21 insertions, 35 deletions
diff --git a/crates/rust-analyzer/src/cargo_target_spec.rs b/crates/rust-analyzer/src/cargo_target_spec.rs index 318399624..03c41263a 100644 --- a/crates/rust-analyzer/src/cargo_target_spec.rs +++ b/crates/rust-analyzer/src/cargo_target_spec.rs | |||
@@ -177,49 +177,35 @@ fn required_features(cfg_expr: &CfgExpr, features: &mut Vec<String>) { | |||
177 | mod tests { | 177 | mod tests { |
178 | use super::*; | 178 | use super::*; |
179 | 179 | ||
180 | use mbe::{ast_to_token_tree, TokenMap}; | 180 | use mbe::ast_to_token_tree; |
181 | use ra_cfg::parse_cfg; | 181 | use ra_cfg::CfgExpr; |
182 | use ra_syntax::{ | 182 | use ra_syntax::{ |
183 | ast::{self, AstNode}, | 183 | ast::{self, AstNode}, |
184 | SmolStr, | 184 | SmolStr, |
185 | }; | 185 | }; |
186 | 186 | ||
187 | fn get_token_tree_generated(input: &str) -> (tt::Subtree, TokenMap) { | 187 | fn check(cfg: &str, expected_features: &[&str]) { |
188 | let source_file = ast::SourceFile::parse(input).ok().unwrap(); | 188 | let cfg_expr = { |
189 | let tt = source_file.syntax().descendants().find_map(ast::TokenTree::cast).unwrap(); | 189 | let source_file = ast::SourceFile::parse(cfg).ok().unwrap(); |
190 | ast_to_token_tree(&tt).unwrap() | 190 | let tt = source_file.syntax().descendants().find_map(ast::TokenTree::cast).unwrap(); |
191 | } | 191 | let (tt, _) = ast_to_token_tree(&tt).unwrap(); |
192 | 192 | CfgExpr::parse(&tt) | |
193 | #[test] | 193 | }; |
194 | fn test_cfg_expr_minimal_features_needed() { | ||
195 | let (subtree, _) = get_token_tree_generated(r#"#![cfg(feature = "baz")]"#); | ||
196 | let cfg_expr = parse_cfg(&subtree); | ||
197 | let mut min_features = vec![]; | ||
198 | required_features(&cfg_expr, &mut min_features); | ||
199 | |||
200 | assert_eq!(min_features, vec![SmolStr::new("baz")]); | ||
201 | |||
202 | let (subtree, _) = | ||
203 | get_token_tree_generated(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#); | ||
204 | let cfg_expr = parse_cfg(&subtree); | ||
205 | |||
206 | let mut min_features = vec![]; | ||
207 | required_features(&cfg_expr, &mut min_features); | ||
208 | assert_eq!(min_features, vec![SmolStr::new("baz"), SmolStr::new("foo")]); | ||
209 | 194 | ||
210 | let (subtree, _) = | 195 | let mut features = vec![]; |
211 | get_token_tree_generated(r#"#![cfg(any(feature = "baz", feature = "foo", unix))]"#); | 196 | required_features(&cfg_expr, &mut features); |
212 | let cfg_expr = parse_cfg(&subtree); | ||
213 | 197 | ||
214 | let mut min_features = vec![]; | 198 | let expected_features = |
215 | required_features(&cfg_expr, &mut min_features); | 199 | expected_features.iter().map(|&it| SmolStr::new(it)).collect::<Vec<_>>(); |
216 | assert_eq!(min_features, vec![SmolStr::new("baz")]); | ||
217 | 200 | ||
218 | let (subtree, _) = get_token_tree_generated(r#"#![cfg(foo)]"#); | 201 | assert_eq!(features, expected_features); |
219 | let cfg_expr = parse_cfg(&subtree); | 202 | } |
220 | 203 | ||
221 | let mut min_features = vec![]; | 204 | #[test] |
222 | required_features(&cfg_expr, &mut min_features); | 205 | fn test_cfg_expr_minimal_features_needed() { |
223 | assert!(min_features.is_empty()); | 206 | check(r#"#![cfg(feature = "baz")]"#, &["baz"]); |
207 | check(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#, &["baz", "foo"]); | ||
208 | check(r#"#![cfg(any(feature = "baz", feature = "foo", unix))]"#, &["baz"]); | ||
209 | check(r#"#![cfg(foo)]"#, &[]); | ||
224 | } | 210 | } |
225 | } | 211 | } |