From 8c3472b6f98efed1eb4e1bd9540946fe66fc5863 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 30 Nov 2020 13:45:32 +0300 Subject: Minor cleanup --- crates/assists/src/handlers/ignore_test.rs | 103 --------------------------- crates/assists/src/handlers/toggle_ignore.rs | 98 +++++++++++++++++++++++++ crates/assists/src/lib.rs | 4 +- crates/assists/src/tests/generated.rs | 40 +++++------ 4 files changed, 120 insertions(+), 125 deletions(-) delete mode 100644 crates/assists/src/handlers/ignore_test.rs create mode 100644 crates/assists/src/handlers/toggle_ignore.rs (limited to 'crates') diff --git a/crates/assists/src/handlers/ignore_test.rs b/crates/assists/src/handlers/ignore_test.rs deleted file mode 100644 index 5096a0005..000000000 --- a/crates/assists/src/handlers/ignore_test.rs +++ /dev/null @@ -1,103 +0,0 @@ -use syntax::{ - ast::{self, AttrsOwner}, - AstNode, AstToken, -}; - -use crate::{utils::test_related_attribute, AssistContext, AssistId, AssistKind, Assists}; - -// Assist: ignore_test -// -// Adds `#[ignore]` attribute to the test. -// -// ``` -// <|>#[test] -// fn arithmetics { -// assert_eq!(2 + 2, 5); -// } -// ``` -// -> -// ``` -// #[test] -// #[ignore] -// fn arithmetics { -// assert_eq!(2 + 2, 5); -// } -// ``` -pub(crate) fn ignore_test(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { - let attr: ast::Attr = ctx.find_node_at_offset()?; - let func = attr.syntax().parent().and_then(ast::Fn::cast)?; - let attr = test_related_attribute(&func)?; - - match has_ignore_attribute(&func) { - None => acc.add( - AssistId("ignore_test", AssistKind::None), - "Ignore this test", - attr.syntax().text_range(), - |builder| builder.insert(attr.syntax().text_range().end(), &format!("\n#[ignore]")), - ), - Some(ignore_attr) => acc.add( - AssistId("unignore_test", AssistKind::None), - "Re-enable this test", - ignore_attr.syntax().text_range(), - |builder| { - builder.delete(ignore_attr.syntax().text_range()); - let whitespace = ignore_attr - .syntax() - .next_sibling_or_token() - .and_then(|x| x.into_token()) - .and_then(ast::Whitespace::cast); - if let Some(whitespace) = whitespace { - builder.delete(whitespace.syntax().text_range()); - } - }, - ), - } -} - -fn has_ignore_attribute(fn_def: &ast::Fn) -> Option { - fn_def.attrs().find_map(|attr| { - if attr.path()?.syntax().text() == "ignore" { - Some(attr) - } else { - None - } - }) -} - -#[cfg(test)] -mod tests { - use super::ignore_test; - use crate::tests::check_assist; - - #[test] - fn test_base_case() { - check_assist( - ignore_test, - r#" - #[test<|>] - fn test() {} - "#, - r#" - #[test] - #[ignore] - fn test() {} - "#, - ) - } - - #[test] - fn test_unignore() { - check_assist( - ignore_test, - r#" - #[test<|>] - #[ignore] - fn test() {} - "#, - r#" - #[test] - fn test() {} - "#, - ) - } -} diff --git a/crates/assists/src/handlers/toggle_ignore.rs b/crates/assists/src/handlers/toggle_ignore.rs new file mode 100644 index 000000000..14b420421 --- /dev/null +++ b/crates/assists/src/handlers/toggle_ignore.rs @@ -0,0 +1,98 @@ +use syntax::{ + ast::{self, AttrsOwner}, + AstNode, AstToken, +}; + +use crate::{utils::test_related_attribute, AssistContext, AssistId, AssistKind, Assists}; + +// Assist: toggle_ignore +// +// Adds `#[ignore]` attribute to the test. +// +// ``` +// <|>#[test] +// fn arithmetics { +// assert_eq!(2 + 2, 5); +// } +// ``` +// -> +// ``` +// #[test] +// #[ignore] +// fn arithmetics { +// assert_eq!(2 + 2, 5); +// } +// ``` +pub(crate) fn toggle_ignore(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { + let attr: ast::Attr = ctx.find_node_at_offset()?; + let func = attr.syntax().parent().and_then(ast::Fn::cast)?; + let attr = test_related_attribute(&func)?; + + match has_ignore_attribute(&func) { + None => acc.add( + AssistId("toggle_ignore", AssistKind::None), + "Ignore this test", + attr.syntax().text_range(), + |builder| builder.insert(attr.syntax().text_range().end(), &format!("\n#[ignore]")), + ), + Some(ignore_attr) => acc.add( + AssistId("toggle_ignore", AssistKind::None), + "Re-enable this test", + ignore_attr.syntax().text_range(), + |builder| { + builder.delete(ignore_attr.syntax().text_range()); + let whitespace = ignore_attr + .syntax() + .next_sibling_or_token() + .and_then(|x| x.into_token()) + .and_then(ast::Whitespace::cast); + if let Some(whitespace) = whitespace { + builder.delete(whitespace.syntax().text_range()); + } + }, + ), + } +} + +fn has_ignore_attribute(fn_def: &ast::Fn) -> Option { + fn_def.attrs().find(|attr| attr.path().map(|it| it.syntax().text() == "ignore") == Some(true)) +} + +#[cfg(test)] +mod tests { + use crate::tests::check_assist; + + use super::*; + + #[test] + fn test_base_case() { + check_assist( + toggle_ignore, + r#" + #[test<|>] + fn test() {} + "#, + r#" + #[test] + #[ignore] + fn test() {} + "#, + ) + } + + #[test] + fn test_unignore() { + check_assist( + toggle_ignore, + r#" + #[test<|>] + #[ignore] + fn test() {} + "#, + r#" + #[test] + fn test() {} + "#, + ) + } +} diff --git a/crates/assists/src/lib.rs b/crates/assists/src/lib.rs index 17e9312db..dfe6c2729 100644 --- a/crates/assists/src/lib.rs +++ b/crates/assists/src/lib.rs @@ -141,7 +141,6 @@ mod handlers { mod generate_function; mod generate_impl; mod generate_new; - mod ignore_test; mod infer_function_return_type; mod inline_local_variable; mod introduce_named_lifetime; @@ -164,6 +163,7 @@ mod handlers { mod replace_string_with_char; mod replace_unwrap_with_match; mod split_import; + mod toggle_ignore; mod unwrap_block; mod wrap_return_type_in_result; @@ -190,7 +190,6 @@ mod handlers { generate_function::generate_function, generate_impl::generate_impl, generate_new::generate_new, - ignore_test::ignore_test, infer_function_return_type::infer_function_return_type, inline_local_variable::inline_local_variable, introduce_named_lifetime::introduce_named_lifetime, @@ -215,6 +214,7 @@ mod handlers { replace_qualified_name_with_use::replace_qualified_name_with_use, replace_unwrap_with_match::replace_unwrap_with_match, split_import::split_import, + toggle_ignore::toggle_ignore, unwrap_block::unwrap_block, wrap_return_type_in_result::wrap_return_type_in_result, // These are manually sorted for better priorities diff --git a/crates/assists/src/tests/generated.rs b/crates/assists/src/tests/generated.rs index 5a9d1a01b..8d50c8791 100644 --- a/crates/assists/src/tests/generated.rs +++ b/crates/assists/src/tests/generated.rs @@ -473,26 +473,6 @@ impl Ctx { ) } -#[test] -fn doctest_ignore_test() { - check_doc_test( - "ignore_test", - r#####" -<|>#[test] -fn arithmetics { - assert_eq!(2 + 2, 5); -} -"#####, - r#####" -#[test] -#[ignore] -fn arithmetics { - assert_eq!(2 + 2, 5); -} -"#####, - ) -} - #[test] fn doctest_infer_function_return_type() { check_doc_test( @@ -978,6 +958,26 @@ use std::{collections::HashMap}; ) } +#[test] +fn doctest_toggle_ignore() { + check_doc_test( + "toggle_ignore", + r#####" +<|>#[test] +fn arithmetics { + assert_eq!(2 + 2, 5); +} +"#####, + r#####" +#[test] +#[ignore] +fn arithmetics { + assert_eq!(2 + 2, 5); +} +"#####, + ) +} + #[test] fn doctest_unwrap_block() { check_doc_test( -- cgit v1.2.3