Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22150 from A4-Tacks/demorgan-option
fix: offer on `is_some_and` etc for apply_demorgan_iterator
Shoyu Vanilla (Flint) 4 weeks ago
parent f0d1d3b · parent f56d34f · commit 4c57da3
-rw-r--r--crates/ide-assists/src/handlers/apply_demorgan.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/apply_demorgan.rs b/crates/ide-assists/src/handlers/apply_demorgan.rs
index b87a757047..9a414ba235 100644
--- a/crates/ide-assists/src/handlers/apply_demorgan.rs
+++ b/crates/ide-assists/src/handlers/apply_demorgan.rs
@@ -210,6 +210,8 @@ pub(crate) fn apply_demorgan_iterator(acc: &mut Assists, ctx: &AssistContext<'_>
let new_name = match name.text().as_str() {
"all" => make.name_ref("any"),
"any" => make.name_ref("all"),
+ "is_some_and" => make.name_ref("is_none_or"),
+ "is_none_or" => make.name_ref("is_some_and"),
_ => unreachable!(),
};
editor.replace(name.syntax(), new_name.syntax());
@@ -249,10 +251,13 @@ fn validate_method_call_expr(
method_call: &ast::MethodCallExpr,
) -> Option<(ast::NameRef, ast::Expr)> {
let name_ref = method_call.name_ref()?;
+ let arg_expr = method_call.arg_list()?.args().next()?;
+ if name_ref.text() == "is_some_and" || name_ref.text() == "is_none_or" {
+ return Some((name_ref, arg_expr));
+ }
if name_ref.text() != "all" && name_ref.text() != "any" {
return None;
}
- let arg_expr = method_call.arg_list()?.args().next()?;
let sema = &ctx.sema;
@@ -644,6 +649,51 @@ fn main() {
}
#[test]
+ fn demorgan_option_is_some_and() {
+ check_assist(
+ apply_demorgan_iterator,
+ r#"
+//- minicore: option
+fn main() {
+ let cond = Some(2);
+ if !cond.$0is_some_and(|num| num > 3) {
+ println!("foo");
+ }
+}
+"#,
+ r#"
+fn main() {
+ let cond = Some(2);
+ if cond.is_none_or(|num| num <= 3) {
+ println!("foo");
+ }
+}
+"#,
+ );
+
+ check_assist(
+ apply_demorgan_iterator,
+ r#"
+//- minicore: option
+fn main() {
+ let cond = Some(2);
+ if !cond.$0is_none_or(|num| num > 3) {
+ println!("foo");
+ }
+}
+"#,
+ r#"
+fn main() {
+ let cond = Some(2);
+ if cond.is_some_and(|num| num <= 3) {
+ println!("foo");
+ }
+}
+"#,
+ );
+ }
+
+ #[test]
fn demorgan_method_call_receiver() {
check_assist(
apply_demorgan,