Add parenthesis around closure method call

This commit is contained in:
Catherine 2023-07-18 09:41:56 -05:00 committed by Yacin Tmimi
parent cdfa2f86b7
commit a72613be50
3 changed files with 46 additions and 5 deletions

View File

@ -253,11 +253,7 @@ impl ChainItemKind {
return (
ChainItemKind::Parent {
expr: expr.clone(),
parens: is_method_call_receiver
&& matches!(
&expr.kind,
ast::ExprKind::Lit(lit) if crate::expr::lit_ends_in_dot(lit)
),
parens: is_method_call_receiver && should_add_parens(expr),
},
expr.span,
);
@ -982,3 +978,22 @@ fn trim_tries(s: &str) -> String {
}
result
}
/// Whether a method call's receiver needs parenthesis, like
/// ```rust,ignore
/// || .. .method();
/// || 1.. .method();
/// 1. .method();
/// ```
/// Which all need parenthesis or a space before `.method()`.
fn should_add_parens(expr: &ast::Expr) -> bool {
match expr.kind {
ast::ExprKind::Lit(ref lit) => crate::expr::lit_ends_in_dot(lit),
ast::ExprKind::Closure(ref cl) => match cl.body.kind {
ast::ExprKind::Range(_, _, ast::RangeLimits::HalfOpen) => true,
ast::ExprKind::Lit(ref lit) => crate::expr::lit_ends_in_dot(lit),
_ => false,
},
_ => false,
}
}

View File

@ -0,0 +1,13 @@
trait Trait {
fn method(&self) {}
}
impl<F: Fn() -> T, T> Trait for F {}
impl Trait for f32 {}
fn main() {
|| 10. .method();
|| .. .method();
|| 1.. .method();
}

View File

@ -0,0 +1,13 @@
trait Trait {
fn method(&self) {}
}
impl<F: Fn() -> T, T> Trait for F {}
impl Trait for f32 {}
fn main() {
|| (10.).method();
(|| ..).method();
(|| 1..).method();
}