diff options
| author | topecongiro <seuchida@gmail.com> | 2017-04-15 18:40:39 +0900 |
|---|---|---|
| committer | topecongiro <seuchida@gmail.com> | 2017-04-15 18:40:39 +0900 |
| commit | a91fd699a012ae99bf36d12d88f98154e363979e (patch) | |
| tree | f6f497056dbe0a02d753d93177b87727363e1b17 /src/expr.rs | |
| parent | b4833a8c581f92e87eeb0f5a6f11719f4eb94092 (diff) | |
Add heuristic choosing block or visual indent for unary op based on span
Diffstat (limited to 'src/expr.rs')
| -rw-r--r-- | src/expr.rs | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/expr.rs b/src/expr.rs index 2723c4099c1..0a17bff9d01 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -157,7 +157,11 @@ fn format_expr(expr: &ast::Expr, }; if let Some(ref expr) = *opt_expr { - rewrite_unary_prefix(context, &format!("break{} ", id_str), &**expr, shape) + rewrite_unary_prefix(context, + &format!("break{} ", id_str), + &**expr, + shape, + expr.span) } else { wrap_str(format!("break{}", id_str), context.config.max_width, shape) } @@ -178,9 +182,11 @@ fn format_expr(expr: &ast::Expr, } ast::ExprKind::Ret(None) => wrap_str("return".to_owned(), context.config.max_width, shape), ast::ExprKind::Ret(Some(ref expr)) => { - rewrite_unary_prefix(context, "return ", &**expr, shape) + rewrite_unary_prefix(context, "return ", &**expr, shape, expr.span) + } + ast::ExprKind::Box(ref expr) => { + rewrite_unary_prefix(context, "box ", &**expr, shape, expr.span) } - ast::ExprKind::Box(ref expr) => rewrite_unary_prefix(context, "box ", &**expr, shape), ast::ExprKind::AddrOf(mutability, ref expr) => { rewrite_expr_addrof(context, mutability, expr, shape) } @@ -222,7 +228,7 @@ fn format_expr(expr: &ast::Expr, } else { delim.into() }; - rewrite_unary_prefix(context, &sp_delim, &**rhs, shape) + rewrite_unary_prefix(context, &sp_delim, &**rhs, shape, expr.span) } (Some(ref lhs), None) => { let sp_delim = if context.config.spaces_around_ranges { @@ -1997,9 +2003,22 @@ pub fn rewrite_tuple<'a, I>(context: &RewriteContext, pub fn rewrite_unary_prefix<R: Rewrite>(context: &RewriteContext, prefix: &str, rewrite: &R, - shape: Shape) + mut shape: Shape, + span: Span) -> Option<String> { - let shape = try_opt!(shape.shrink_left(prefix.len())).visual_indent(0); + // Heuristic: if unary is `&` and `rewrite` contains `{`, + // it is likely that block indent is preferred to visual indent. + if prefix == "&" { + let snippet = String::from(context.snippet(span).trim_left_matches('&')); + let first_line = try_opt!(snippet.lines().nth(0)); + if first_line.contains("{") { + shape = try_opt!(shape.sub_width(prefix.len())).block_indent(0); + } else { + shape = try_opt!(shape.shrink_left(prefix.len())).visual_indent(0); + } + } else { + shape = try_opt!(shape.shrink_left(prefix.len())).visual_indent(0); + } rewrite .rewrite(context, shape) .map(|r| format!("{}{}", prefix, r)) @@ -2031,7 +2050,7 @@ fn rewrite_unary_op(context: &RewriteContext, ast::UnOp::Not => "!", ast::UnOp::Neg => "-", }; - rewrite_unary_prefix(context, operator_str, expr, shape) + rewrite_unary_prefix(context, operator_str, expr, shape, expr.span) } fn rewrite_assignment(context: &RewriteContext, @@ -2126,5 +2145,5 @@ fn rewrite_expr_addrof(context: &RewriteContext, ast::Mutability::Immutable => "&", ast::Mutability::Mutable => "&mut ", }; - rewrite_unary_prefix(context, operator_str, expr, shape) + rewrite_unary_prefix(context, operator_str, expr, shape, expr.span) } |
