diff options
-rw-r--r-- | crates/ra_ide/src/runnables.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/crates/ra_ide/src/runnables.rs b/crates/ra_ide/src/runnables.rs index 7533692f6..8622dd956 100644 --- a/crates/ra_ide/src/runnables.rs +++ b/crates/ra_ide/src/runnables.rs | |||
@@ -43,7 +43,7 @@ fn runnable_fn(fn_def: ast::FnDef) -> Option<Runnable> { | |||
43 | let name = fn_def.name()?.text().clone(); | 43 | let name = fn_def.name()?.text().clone(); |
44 | let kind = if name == "main" { | 44 | let kind = if name == "main" { |
45 | RunnableKind::Bin | 45 | RunnableKind::Bin |
46 | } else if fn_def.has_atom_attr("test") { | 46 | } else if has_test_related_attribute(&fn_def) { |
47 | RunnableKind::Test { name: name.to_string() } | 47 | RunnableKind::Test { name: name.to_string() } |
48 | } else if fn_def.has_atom_attr("bench") { | 48 | } else if fn_def.has_atom_attr("bench") { |
49 | RunnableKind::Bench { name: name.to_string() } | 49 | RunnableKind::Bench { name: name.to_string() } |
@@ -53,6 +53,20 @@ fn runnable_fn(fn_def: ast::FnDef) -> Option<Runnable> { | |||
53 | Some(Runnable { range: fn_def.syntax().text_range(), kind }) | 53 | Some(Runnable { range: fn_def.syntax().text_range(), kind }) |
54 | } | 54 | } |
55 | 55 | ||
56 | /// This is a method with a heuristics to support test methods annotated with custom test annotations, such as | ||
57 | /// `#[test_case(...)]`, `#[tokio::test]` and similar. | ||
58 | /// Also a regular `#[test]` annotation is supported. | ||
59 | /// | ||
60 | /// It may produce false positives, for example, `#[wasm_bindgen_test]` requires a different command to run the test, | ||
61 | /// but it's better than not to have the runnables for the tests at all. | ||
62 | fn has_test_related_attribute(fn_def: &ast::FnDef) -> bool { | ||
63 | fn_def | ||
64 | .attrs() | ||
65 | .filter_map(|attr| attr.path()) | ||
66 | .map(|path| path.syntax().to_string().to_lowercase()) | ||
67 | .any(|attribute_text| attribute_text.contains("test")) | ||
68 | } | ||
69 | |||
56 | fn runnable_mod(db: &RootDatabase, file_id: FileId, module: ast::Module) -> Option<Runnable> { | 70 | fn runnable_mod(db: &RootDatabase, file_id: FileId, module: ast::Module) -> Option<Runnable> { |
57 | let has_test_function = module | 71 | let has_test_function = module |
58 | .item_list()? | 72 | .item_list()? |