about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNick Cameron <nrc@ncameron.org>2018-04-17 20:16:48 +1200
committerGitHub <noreply@github.com>2018-04-17 20:16:48 +1200
commit93da4d86cc45815f075ee8b0196c618b86ce5c1b (patch)
tree00b97d0977672052aea2078767cc73314c63441d /src
parentcef31b2841aeabcf59a53b03f0eb19ee07546c5e (diff)
parent61d29eb70c14806e0a28c70a1ab6f162c2c0ef82 (diff)
Merge pull request #2624 from sinkuu/dots
Add spaces between consecutive `..` `..=`
Diffstat (limited to 'src')
-rw-r--r--src/expr.rs33
1 files changed, 28 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 @@ pub fn format_expr(
                 }
             }
 
+            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 @@ pub fn format_expr(
                     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 @@ pub fn format_expr(
                     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)
                 }