From 61d29eb70c14806e0a28c70a1ab6f162c2c0ef82 Mon Sep 17 00:00:00 2001 From: Shotaro Yamada Date: Mon, 16 Apr 2018 17:11:50 +0900 Subject: [PATCH] Add spaces between consecutive `..` `..=` --- src/expr.rs | 33 ++++++++++++++++++++++++++++----- tests/source/expr.rs | 6 ++++++ tests/target/expr.rs | 6 ++++++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index 5f786f96500..84ecbb57184 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -248,14 +248,37 @@ fn needs_space_before_range(context: &RewriteContext, lhs: &ast::Expr) -> bool { } } + fn needs_space_after_range(rhs: &ast::Expr) -> bool { + match rhs.node { + // Don't format `.. ..` into `....`, which is invalid. + // + // This check is unnecessary for `lhs`, because a range + // starting from another range needs parentheses as `(x ..) ..` + // (`x .. ..` is a range from `x` to `..`). + ast::ExprKind::Range(None, _, _) => true, + _ => false, + } + } + + let default_sp_delim = |lhs: Option<&ast::Expr>, rhs: Option<&ast::Expr>| { + let space_if = |b: bool| if b { " " } else { "" }; + + format!( + "{}{}{}", + lhs.map(|lhs| space_if(needs_space_before_range(context, lhs))) + .unwrap_or(""), + delim, + rhs.map(|rhs| space_if(needs_space_after_range(rhs))) + .unwrap_or(""), + ) + }; + match (lhs.as_ref().map(|x| &**x), rhs.as_ref().map(|x| &**x)) { (Some(lhs), Some(rhs)) => { let sp_delim = if context.config.spaces_around_ranges() { format!(" {} ", delim) - } else if needs_space_before_range(context, lhs) { - format!(" {}", delim) } else { - delim.to_owned() + default_sp_delim(Some(lhs), Some(rhs)) }; rewrite_pair( &*lhs, @@ -270,7 +293,7 @@ fn needs_space_before_range(context: &RewriteContext, lhs: &ast::Expr) -> bool { let sp_delim = if context.config.spaces_around_ranges() { format!("{} ", delim) } else { - delim.to_owned() + default_sp_delim(None, Some(rhs)) }; rewrite_unary_prefix(context, &sp_delim, &*rhs, shape) } @@ -278,7 +301,7 @@ fn needs_space_before_range(context: &RewriteContext, lhs: &ast::Expr) -> bool { let sp_delim = if context.config.spaces_around_ranges() { format!(" {}", delim) } else { - delim.to_owned() + default_sp_delim(Some(lhs), None) }; rewrite_unary_suffix(context, &sp_delim, &*lhs, shape) } diff --git a/tests/source/expr.rs b/tests/source/expr.rs index 6367dbc95b8..d5b0babc5bb 100644 --- a/tests/source/expr.rs +++ b/tests/source/expr.rs @@ -384,3 +384,9 @@ fn bar(&self) { } } } + +fn dots() { + .. .. ..; // (.. (.. (..))) + ..= ..= ..; + (..) .. ..; // ((..) .. (..)) +} diff --git a/tests/target/expr.rs b/tests/target/expr.rs index 09e1e8afd1a..911a44f0630 100644 --- a/tests/target/expr.rs +++ b/tests/target/expr.rs @@ -409,3 +409,9 @@ fn bar(&self) { } } } + +fn dots() { + .. .. ..; // (.. (.. (..))) + ..= ..= ..; + (..).. ..; // ((..) .. (..)) +} -- 2.44.0