]> git.lizzy.rs Git - rust.git/commitdiff
Unify pair formatting code
authorMarcus Klaas <mail@marcusklaas.nl>
Fri, 2 Oct 2015 10:25:22 +0000 (12:25 +0200)
committerMarcus Klaas <mail@marcusklaas.nl>
Fri, 2 Oct 2015 10:25:22 +0000 (12:25 +0200)
src/expr.rs

index 8d375a8b586680c3f02aa8deaa2fc364b261ec38..fcb2ae1ff055cf4b7896080644e5f6406ec8b3bb 100644 (file)
@@ -111,13 +111,6 @@ fn rewrite(&self, context: &RewriteContext, width: usize, offset: Indent) -> Opt
                                 offset,
                                 true)
             }
-            ast::Expr_::ExprRange(ref left, ref right) => {
-                rewrite_range(context,
-                              left.as_ref().map(|e| &**e),
-                              right.as_ref().map(|e| &**e),
-                              width,
-                              offset)
-            }
             ast::Expr_::ExprMatch(ref cond, ref arms, _) => {
                 rewrite_match(context, cond, arms, width, offset, self.span)
             }
@@ -178,13 +171,32 @@ fn rewrite(&self, context: &RewriteContext, width: usize, offset: Indent) -> Opt
                 rewrite_expr_addrof(context, mutability, expr, width, offset)
             }
             ast::Expr_::ExprCast(ref expr, ref ty) => {
-                rewrite_cast(expr, ty, context, width, offset)
+                rewrite_pair(&**expr, &**ty, "", " as ", "", context, width, offset)
             }
             ast::Expr_::ExprIndex(ref expr, ref index) => {
-                rewrite_index(expr, index, context, width, offset)
+                rewrite_pair(&**expr, &**index, "", "[", "]", context, width, offset)
             }
             ast::Expr_::ExprRepeat(ref expr, ref repeats) => {
-                rewrite_repeats(expr, repeats, context, width, offset)
+                rewrite_pair(&**expr, &**repeats, "[", "; ", "]", context, width, offset)
+            }
+            ast::Expr_::ExprRange(Some(ref lhs), Some(ref rhs)) => {
+                rewrite_pair(&**lhs, &**rhs, "", "..", "", context, width, offset)
+            }
+            ast::Expr_::ExprRange(None, Some(ref rhs)) => {
+                rewrite_unary_prefix(context, "..", &**rhs, width, offset)
+            }
+            ast::Expr_::ExprRange(Some(ref lhs), None) => {
+                Some(format!("{}..",
+                             try_opt!(lhs.rewrite(context,
+                                                  try_opt!(width.checked_sub(2)),
+                                                  offset))))
+            }
+            ast::Expr_::ExprRange(None, None) => {
+                if width >= 2 {
+                    Some("..".into())
+                } else {
+                    None
+                }
             }
             // We do not format these expressions yet, but they should still
             // satisfy our width restrictions.
@@ -199,99 +211,42 @@ fn rewrite(&self, context: &RewriteContext, width: usize, offset: Indent) -> Opt
     }
 }
 
-fn rewrite_repeats(expr: &ast::Expr,
-                   index: &ast::Expr,
-                   context: &RewriteContext,
-                   width: usize,
-                   offset: Indent)
-                   -> Option<String> {
-    let max_width = try_opt!(width.checked_sub("[; ]".len()));
-
-    binary_search(1,
-                  max_width,
-                  |expr_budget| {
-                      let expr_str = match expr.rewrite(context, expr_budget, offset + "[".len()) {
-                          Some(result) => result,
-                          None => return Err(Ordering::Greater),
-                      };
-
-                      let last_line_width = last_line_width(&expr_str);
-                      let index_budget = match max_width.checked_sub(last_line_width) {
-                          Some(b) => b,
-                          None => return Err(Ordering::Less),
-                      };
-                      let index_indent = offset + last_line_width + "[; ".len();
-
-                      let index_str = match index.rewrite(context, index_budget, index_indent) {
-                          Some(result) => result,
-                          None => return Err(Ordering::Less),
-                      };
-
-                      Ok(format!("[{}; {}]", expr_str, index_str))
-                  })
-}
-
-fn rewrite_index(expr: &ast::Expr,
-                 index: &ast::Expr,
-                 context: &RewriteContext,
-                 width: usize,
-                 offset: Indent)
-                 -> Option<String> {
-    let max_width = try_opt!(width.checked_sub("[]".len()));
-
-    binary_search(1,
-                  max_width,
-                  |expr_budget| {
-                      let expr_str = match expr.rewrite(context, expr_budget, offset) {
-                          Some(result) => result,
-                          None => return Err(Ordering::Greater),
-                      };
-
-                      let last_line_width = last_line_width(&expr_str);
-                      let index_budget = match max_width.checked_sub(last_line_width) {
-                          Some(b) => b,
-                          None => return Err(Ordering::Less),
-                      };
-                      let index_indent = offset + last_line_width + "[".len();
-
-                      let index_str = match index.rewrite(context, index_budget, index_indent) {
-                          Some(result) => result,
-                          None => return Err(Ordering::Less),
-                      };
-
-                      Ok(format!("{}[{}]", expr_str, index_str))
-                  })
-}
-
-fn rewrite_cast(expr: &ast::Expr,
-                ty: &ast::Ty,
-                context: &RewriteContext,
-                width: usize,
-                offset: Indent)
-                -> Option<String> {
-    let max_width = try_opt!(width.checked_sub(" as ".len()));
+fn rewrite_pair<LHS, RHS>(lhs: &LHS,
+                          rhs: &RHS,
+                          prefix: &str,
+                          infix: &str,
+                          suffix: &str,
+                          context: &RewriteContext,
+                          width: usize,
+                          offset: Indent)
+                          -> Option<String>
+    where LHS: Rewrite,
+          RHS: Rewrite
+{
+    let max_width = try_opt!(width.checked_sub(prefix.len() + infix.len() + suffix.len()));
 
     binary_search(1,
                   max_width,
-                  |expr_budget| {
-                      let expr_str = match expr.rewrite(context, expr_budget, offset) {
+                  |lhs_budget| {
+                      let lhs_offset = offset + prefix.len();
+                      let lhs_str = match lhs.rewrite(context, lhs_budget, lhs_offset) {
                           Some(result) => result,
                           None => return Err(Ordering::Greater),
                       };
 
-                      let last_line_width = last_line_width(&expr_str);
-                      let ty_budget = match max_width.checked_sub(last_line_width) {
+                      let last_line_width = last_line_width(&lhs_str);
+                      let rhs_budget = match max_width.checked_sub(last_line_width) {
                           Some(b) => b,
                           None => return Err(Ordering::Less),
                       };
-                      let ty_indent = offset + last_line_width + " as ".len();
+                      let rhs_indent = offset + last_line_width + prefix.len() + infix.len();
 
-                      let ty_str = match ty.rewrite(context, ty_budget, ty_indent) {
+                      let rhs_str = match rhs.rewrite(context, rhs_budget, rhs_indent) {
                           Some(result) => result,
                           None => return Err(Ordering::Less),
                       };
 
-                      Ok(format!("{} as {}", expr_str, ty_str))
+                      Ok(format!("{}{}{}{}{}", prefix, lhs_str, infix, rhs_str, suffix))
                   })
 }
 
@@ -637,33 +592,6 @@ fn rewrite_label(label: Option<ast::Ident>) -> String {
     }
 }
 
-// FIXME: this doesn't play well with line breaks
-fn rewrite_range(context: &RewriteContext,
-                 left: Option<&ast::Expr>,
-                 right: Option<&ast::Expr>,
-                 width: usize,
-                 offset: Indent)
-                 -> Option<String> {
-    let left_string = match left {
-        Some(expr) => {
-            // 2 = ..
-            let max_width = try_opt!(width.checked_sub(2));
-            try_opt!(expr.rewrite(context, max_width, offset))
-        }
-        None => String::new(),
-    };
-
-    let right_string = match right {
-        Some(expr) => {
-            let max_width = try_opt!(width.checked_sub(left_string.len() + 2));
-            try_opt!(expr.rewrite(context, max_width, offset + 2 + left_string.len()))
-        }
-        None => String::new(),
-    };
-
-    Some(format!("{}..{}", left_string, right_string))
-}
-
 // Rewrites if-else blocks. If let Some(_) = pat, the expression is
 // treated as an if-let-else expression.
 fn rewrite_if_else(context: &RewriteContext,