]> git.lizzy.rs Git - rust.git/commitdiff
Cleanup invert-if
authorAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 25 Aug 2020 08:57:51 +0000 (10:57 +0200)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 25 Aug 2020 09:00:32 +0000 (11:00 +0200)
* stick to trivial factory functions in make
* compress the logic for inverting Option/Result

crates/assists/src/utils.rs
crates/syntax/src/ast/make.rs

index e15c982e75e86b3d5a366666b19d8b115e3369d5..daa7b64f7da08e1b396bc9e554e926dfa09130e4 100644 (file)
@@ -8,10 +8,10 @@
 use itertools::Itertools;
 use rustc_hash::FxHashSet;
 use syntax::{
-    ast::{self, make, NameOwner},
+    ast::{self, make, ArgListOwner, NameOwner},
     AstNode, Direction,
     SyntaxKind::*,
-    SyntaxNode, SyntaxText, TextSize, T,
+    SyntaxNode, TextSize, T,
 };
 
 use crate::assist_config::SnippetCap;
@@ -180,23 +180,18 @@ fn invert_special_case(expr: &ast::Expr) -> Option<ast::Expr> {
             _ => None,
         },
         ast::Expr::MethodCallExpr(mce) => {
-            const IS_SOME_TEXT: &str = "is_some";
-            const IS_NONE_TEXT: &str = "is_none";
-            const IS_OK_TEXT: &str = "is_ok";
-            const IS_ERR_TEXT: &str = "is_err";
-
-            let name = mce.name_ref()?;
-            let name_text = name.text();
-
-            let caller = || -> Option<SyntaxText> { Some(mce.receiver()?.syntax().text()) };
-
-            match name_text {
-                x if x == IS_SOME_TEXT => make::expr_method_call(IS_NONE_TEXT, caller),
-                x if x == IS_NONE_TEXT => make::expr_method_call(IS_SOME_TEXT, caller),
-                x if x == IS_OK_TEXT => make::expr_method_call(IS_ERR_TEXT, caller),
-                x if x == IS_ERR_TEXT => make::expr_method_call(IS_OK_TEXT, caller),
-                _ => None,
-            }
+            let receiver = mce.receiver()?;
+            let method = mce.name_ref()?;
+            let arg_list = mce.arg_list()?;
+
+            let method = match method.text().as_str() {
+                "is_some" => "is_none",
+                "is_none" => "is_some",
+                "is_ok" => "is_err",
+                "is_err" => "is_ok",
+                _ => return None,
+            };
+            Some(make::expr_method_call(receiver, method, arg_list))
         }
         ast::Expr::PrefixExpr(pe) if pe.op_kind()? == ast::PrefixOp::Not => pe.expr(),
         // FIXME:
index 7958721e24266f2a6e85ceed00e82779657aaa28..7ba6259900146a3242f27a17e775c74be90f95ca 100644 (file)
@@ -7,7 +7,7 @@
 use itertools::Itertools;
 use stdx::format_to;
 
-use crate::{ast, AstNode, SourceFile, SyntaxKind, SyntaxNode, SyntaxText, SyntaxToken};
+use crate::{ast, AstNode, SourceFile, SyntaxKind, SyntaxNode, SyntaxToken};
 
 pub fn name(text: &str) -> ast::Name {
     ast_from_text(&format!("mod {};", text))
@@ -137,11 +137,8 @@ pub fn expr_prefix(op: SyntaxKind, expr: ast::Expr) -> ast::Expr {
 pub fn expr_call(f: ast::Expr, arg_list: ast::ArgList) -> ast::Expr {
     expr_from_text(&format!("{}{}", f, arg_list))
 }
-pub fn expr_method_call<F>(text: &str, caller: F) -> Option<ast::Expr>
-where
-    F: FnOnce() -> Option<SyntaxText>,
-{
-    try_expr_from_text(&format!("{}.{}()", caller()?, text))
+pub fn expr_method_call(receiver: ast::Expr, method: &str, arg_list: ast::ArgList) -> ast::Expr {
+    expr_from_text(&format!("{}.{}{}", receiver, method, arg_list))
 }
 fn expr_from_text(text: &str) -> ast::Expr {
     ast_from_text(&format!("const C: () = {};", text))