aboutsummaryrefslogtreecommitdiff
path: root/crates/rust-analyzer/src/cargo_target_spec.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-07-23 15:22:17 +0100
committerAleksey Kladov <[email protected]>2020-07-23 15:53:12 +0100
commit38e38d9b290ff90973c25a06962b81dbbb5d3d9e (patch)
tree53bd0741216f4db6b8ab8a16b8dccaf2855f5ab9 /crates/rust-analyzer/src/cargo_target_spec.rs
parent0cf8ee2dc22569fac2115c41b85d5df23af3ce5a (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.rs56
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>) {
177mod tests { 177mod 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}