about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAli Bektas <bektasali@protonmail.com>2023-08-08 15:54:58 +0200
committerAli Bektas <bektasali@protonmail.com>2023-08-08 15:54:58 +0200
commit17f3055803f8d6551b746192a4ba78edb5b62995 (patch)
tree866b59a6727473f48f2dc11880bb6681470fd557
parentef5c6daf6ec0797c0e4c3b323853390f15078e70 (diff)
downloadrust-17f3055803f8d6551b746192a4ba78edb5b62995.tar.gz
rust-17f3055803f8d6551b746192a4ba78edb5b62995.zip
Rewrite DeMorgan v2
-rw-r--r--crates/ide-assists/src/handlers/apply_demorgan.rs30
1 files changed, 16 insertions, 14 deletions
diff --git a/crates/ide-assists/src/handlers/apply_demorgan.rs b/crates/ide-assists/src/handlers/apply_demorgan.rs
index 05847a864f3..66bc2f6dadc 100644
--- a/crates/ide-assists/src/handlers/apply_demorgan.rs
+++ b/crates/ide-assists/src/handlers/apply_demorgan.rs
@@ -87,24 +87,26 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
         }
     }
 
-    let paren_expr = bin_expr.syntax().parent().and_then(ast::ParenExpr::cast);
-    let neg_expr = paren_expr
-        .clone()
-        .and_then(|paren_expr| paren_expr.syntax().parent())
-        .and_then(ast::PrefixExpr::cast)
-        .and_then(|prefix_expr| {
-            if prefix_expr.op_kind().unwrap() == ast::UnaryOp::Not {
-                Some(prefix_expr)
-            } else {
-                None
-            }
-        });
+    let dm_lhs = demorganed.lhs()?;
 
     acc.add(
         AssistId("apply_demorgan", AssistKind::RefactorRewrite),
         "Apply De Morgan's law",
         op_range,
         |edit| {
+            let paren_expr = bin_expr.syntax().parent().and_then(ast::ParenExpr::cast);
+            let neg_expr = paren_expr
+                .clone()
+                .and_then(|paren_expr| paren_expr.syntax().parent())
+                .and_then(ast::PrefixExpr::cast)
+                .and_then(|prefix_expr| {
+                    if prefix_expr.op_kind()? == ast::UnaryOp::Not {
+                        Some(prefix_expr)
+                    } else {
+                        None
+                    }
+                });
+
             if let Some(paren_expr) = paren_expr {
                 if let Some(neg_expr) = neg_expr {
                     cov_mark::hit!(demorgan_double_negation);
@@ -112,7 +114,7 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
                 } else {
                     cov_mark::hit!(demorgan_double_parens);
                     ted::insert_all_raw(
-                        Position::before(demorganed.lhs().unwrap().syntax()),
+                        Position::before(dm_lhs.syntax()),
                         vec![
                             syntax::NodeOrToken::Token(ast::make::token(SyntaxKind::BANG)),
                             syntax::NodeOrToken::Token(ast::make::token(SyntaxKind::L_PAREN)),
@@ -128,7 +130,7 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
                 }
             } else {
                 ted::insert_all_raw(
-                    Position::before(demorganed.lhs().unwrap().syntax()),
+                    Position::before(dm_lhs.syntax()),
                     vec![
                         syntax::NodeOrToken::Token(ast::make::token(SyntaxKind::BANG)),
                         syntax::NodeOrToken::Token(ast::make::token(SyntaxKind::L_PAREN)),