From c6143742bd4e625d391ac3ea860be7578ab9f53f Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Thu, 21 May 2020 10:48:42 +0200 Subject: add support of feature flag for runnables #4464 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/runnables.rs | 146 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 13 deletions(-) (limited to 'crates/ra_ide/src/runnables.rs') diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index fa8a9d92c..4f7eb2c5b 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs @@ -1,11 +1,11 @@ //! FIXME: write short doc here -use hir::Semantics; +use hir::{Attrs, HirFileId, InFile, Semantics}; use itertools::Itertools; use ra_ide_db::RootDatabase; use ra_syntax::{ ast::{self, AstNode, AttrsOwner, ModuleItemOwner, NameOwner}, - match_ast, SyntaxNode, TextRange, + match_ast, SmolStr, SyntaxNode, TextRange, }; use crate::FileId; @@ -16,6 +16,7 @@ use std::fmt::Display; pub struct Runnable { pub range: TextRange, pub kind: RunnableKind, + pub features_needed: Option>, } #[derive(Debug)] @@ -45,20 +46,24 @@ pub enum RunnableKind { pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec { let sema = Semantics::new(db); let source_file = sema.parse(file_id); - source_file.syntax().descendants().filter_map(|i| runnable(&sema, i)).collect() + source_file.syntax().descendants().filter_map(|i| runnable(&sema, i, file_id)).collect() } -fn runnable(sema: &Semantics, item: SyntaxNode) -> Option { +fn runnable(sema: &Semantics, item: SyntaxNode, file_id: FileId) -> Option { match_ast! { match item { - ast::FnDef(it) => runnable_fn(sema, it), - ast::Module(it) => runnable_mod(sema, it), + ast::FnDef(it) => runnable_fn(sema, it, file_id), + ast::Module(it) => runnable_mod(sema, it, file_id), _ => None, } } } -fn runnable_fn(sema: &Semantics, fn_def: ast::FnDef) -> Option { +fn runnable_fn( + sema: &Semantics, + fn_def: ast::FnDef, + file_id: FileId, +) -> Option { let name_string = fn_def.name()?.text().to_string(); let kind = if name_string == "main" { @@ -89,7 +94,11 @@ fn runnable_fn(sema: &Semantics, fn_def: ast::FnDef) -> Option bool { fn_def.doc_comment_text().map_or(false, |comment| comment.contains("```")) } -fn runnable_mod(sema: &Semantics, module: ast::Module) -> Option { +fn runnable_mod( + sema: &Semantics, + module: ast::Module, + file_id: FileId, +) -> Option { let has_test_function = module .item_list()? .items() @@ -138,11 +151,34 @@ fn runnable_mod(sema: &Semantics, module: ast::Module) -> Option Option> { + let cfg_expr = attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)); + let features_needed = cfg_expr.fold(vec![], |mut acc, cfg| { + if let Some(features_needed) = cfg.minimal_features_needed() { + acc.extend(features_needed); + } + acc + }); + if features_needed.is_empty() { + None + } else { + Some(features_needed) + } } #[cfg(test)] @@ -174,6 +210,7 @@ mod tests { Runnable { range: 1..21, kind: Bin, + features_needed: None, }, Runnable { range: 22..46, @@ -185,6 +222,7 @@ mod tests { ignore: false, }, }, + features_needed: None, }, Runnable { range: 47..81, @@ -196,6 +234,7 @@ mod tests { ignore: true, }, }, + features_needed: None, }, ] "### @@ -223,6 +262,7 @@ mod tests { Runnable { range: 1..21, kind: Bin, + features_needed: None, }, Runnable { range: 22..64, @@ -231,6 +271,7 @@ mod tests { "foo", ), }, + features_needed: None, }, ] "### @@ -258,6 +299,7 @@ mod tests { kind: TestMod { path: "test_mod", }, + features_needed: None, }, Runnable { range: 28..57, @@ -269,6 +311,7 @@ mod tests { ignore: false, }, }, + features_needed: None, }, ] "### @@ -298,6 +341,7 @@ mod tests { kind: TestMod { path: "foo::test_mod", }, + features_needed: None, }, Runnable { range: 46..79, @@ -309,6 +353,7 @@ mod tests { ignore: false, }, }, + features_needed: None, }, ] "### @@ -340,6 +385,7 @@ mod tests { kind: TestMod { path: "foo::bar::test_mod", }, + features_needed: None, }, Runnable { range: 68..105, @@ -351,6 +397,80 @@ mod tests { ignore: false, }, }, + features_needed: None, + }, + ] + "### + ); + } + + #[test] + fn test_runnables_with_feature() { + let (analysis, pos) = analysis_and_position( + r#" + //- /lib.rs crate:foo cfg:feature=foo + <|> //empty + #[test] + #[cfg(feature = "foo")] + fn test_foo1() {} + "#, + ); + let runnables = analysis.runnables(pos.file_id).unwrap(); + assert_debug_snapshot!(&runnables, + @r###" + [ + Runnable { + range: 1..58, + kind: Test { + test_id: Name( + "test_foo1", + ), + attr: TestAttr { + ignore: false, + }, + }, + features_needed: Some( + [ + "foo", + ], + ), + }, + ] + "### + ); + } + + #[test] + fn test_runnables_with_features() { + let (analysis, pos) = analysis_and_position( + r#" + //- /lib.rs crate:foo cfg:feature=foo,feature=bar + <|> //empty + #[test] + #[cfg(all(feature = "foo", feature = "bar"))] + fn test_foo1() {} + "#, + ); + let runnables = analysis.runnables(pos.file_id).unwrap(); + assert_debug_snapshot!(&runnables, + @r###" + [ + Runnable { + range: 1..80, + kind: Test { + test_id: Name( + "test_foo1", + ), + attr: TestAttr { + ignore: false, + }, + }, + features_needed: Some( + [ + "foo", + "bar", + ], + ), }, ] "### -- cgit v1.2.3 From 43339058e32e8bb0d218390b9df5b5a68fe57ca7 Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Fri, 22 May 2020 09:23:31 +0200 Subject: add support of feature flag for runnables #4464 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/runnables.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'crates/ra_ide/src/runnables.rs') diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index 3a3d0b0ac..a460370c5 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs @@ -190,17 +190,8 @@ fn runnable_mod( fn get_features_needed(attrs: Attrs) -> Option> { let cfg_expr = attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)); - let features_needed = cfg_expr.fold(vec![], |mut acc, cfg| { - if let Some(features_needed) = cfg.minimal_features_needed() { - acc.extend(features_needed); - } - acc - }); - if features_needed.is_empty() { - None - } else { - Some(features_needed) - } + let features_needed = cfg_expr.map(|cfg| cfg.minimal_features_needed()).flatten().collect(); + Some(features_needed).filter(|it: &Vec| !it.is_empty()) } #[cfg(test)] -- cgit v1.2.3 From 48d7c61e26398fa33b94e0e4bd0d2d1697ed4921 Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Sat, 23 May 2020 20:59:18 +0200 Subject: add support of feature flag for runnables #4464 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/runnables.rs | 76 +++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 35 deletions(-) (limited to 'crates/ra_ide/src/runnables.rs') diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index a460370c5..a96c5f157 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs @@ -10,13 +10,14 @@ use ra_syntax::{ use crate::FileId; use ast::DocCommentsOwner; +use ra_cfg::CfgExpr; use std::fmt::Display; #[derive(Debug)] pub struct Runnable { pub range: TextRange, pub kind: RunnableKind, - pub features_needed: Option>, + pub cfg_exprs: Vec, } #[derive(Debug)] @@ -118,9 +119,10 @@ fn runnable_fn( }; let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &fn_def)); - let features_needed = get_features_needed(attrs); + let cfg_exprs = + attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)).collect(); - Some(Runnable { range: fn_def.syntax().text_range(), kind, features_needed }) + Some(Runnable { range: fn_def.syntax().text_range(), kind, cfg_exprs }) } #[derive(Debug)] @@ -183,15 +185,10 @@ fn runnable_mod( .join("::"); let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &module)); - let features_needed = get_features_needed(attrs); + let cfg_exprs = + attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)).collect(); - Some(Runnable { range, kind: RunnableKind::TestMod { path }, features_needed }) -} - -fn get_features_needed(attrs: Attrs) -> Option> { - let cfg_expr = attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)); - let features_needed = cfg_expr.map(|cfg| cfg.minimal_features_needed()).flatten().collect(); - Some(features_needed).filter(|it: &Vec| !it.is_empty()) + Some(Runnable { range, kind: RunnableKind::TestMod { path }, cfg_exprs }) } #[cfg(test)] @@ -223,7 +220,7 @@ mod tests { Runnable { range: 1..21, kind: Bin, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 22..46, @@ -235,7 +232,7 @@ mod tests { ignore: false, }, }, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 47..81, @@ -247,7 +244,7 @@ mod tests { ignore: true, }, }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -275,7 +272,7 @@ mod tests { Runnable { range: 1..21, kind: Bin, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 22..64, @@ -284,7 +281,7 @@ mod tests { "foo", ), }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -315,7 +312,7 @@ mod tests { Runnable { range: 1..21, kind: Bin, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 51..105, @@ -324,7 +321,7 @@ mod tests { "Data::foo", ), }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -352,7 +349,7 @@ mod tests { kind: TestMod { path: "test_mod", }, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 28..57, @@ -364,7 +361,7 @@ mod tests { ignore: false, }, }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -394,7 +391,7 @@ mod tests { kind: TestMod { path: "foo::test_mod", }, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 46..79, @@ -406,7 +403,7 @@ mod tests { ignore: false, }, }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -438,7 +435,7 @@ mod tests { kind: TestMod { path: "foo::bar::test_mod", }, - features_needed: None, + cfg_exprs: [], }, Runnable { range: 68..105, @@ -450,7 +447,7 @@ mod tests { ignore: false, }, }, - features_needed: None, + cfg_exprs: [], }, ] "### @@ -482,11 +479,12 @@ mod tests { ignore: false, }, }, - features_needed: Some( - [ - "foo", - ], - ), + cfg_exprs: [ + KeyValue { + key: "feature", + value: "foo", + }, + ], }, ] "### @@ -518,12 +516,20 @@ mod tests { ignore: false, }, }, - features_needed: Some( - [ - "foo", - "bar", - ], - ), + cfg_exprs: [ + All( + [ + KeyValue { + key: "feature", + value: "foo", + }, + KeyValue { + key: "feature", + value: "bar", + }, + ], + ), + ], }, ] "### -- cgit v1.2.3 From 27ed376bc4dfed39295af650effe63007e443b6f Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Sun, 24 May 2020 13:34:34 +0200 Subject: add support of feature flag for runnables #4464 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/runnables.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_ide/src/runnables.rs') diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index a96c5f157..ed98e58e0 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use ra_ide_db::RootDatabase; use ra_syntax::{ ast::{self, AstNode, AttrsOwner, ModuleItemOwner, NameOwner}, - match_ast, SmolStr, SyntaxNode, TextRange, + match_ast, SyntaxNode, TextRange, }; use crate::FileId; -- cgit v1.2.3