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;
_ => 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:
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))
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))