From 603f2034a512317c530473c8c229f8685ed18bd9 Mon Sep 17 00:00:00 2001 From: Marcus Klaas Date: Fri, 2 Oct 2015 11:31:40 +0200 Subject: [PATCH] Format type casts --- src/expr.rs | 38 ++++++++++++++++++++++++++++++++++++-- tests/source/expr.rs | 13 +++++++++++++ tests/target/expr.rs | 10 ++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index f2c98129cd6..ecc94773211 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -177,12 +177,14 @@ impl Rewrite for ast::Expr { rewrite_unary_prefix(context, "box ", expr, width, offset) } ast::Expr_::ExprAddrOf(mutability, ref expr) => { - rewrite_expr_addrof(context, mutability, &expr, width, offset) + rewrite_expr_addrof(context, mutability, expr, width, offset) + } + ast::Expr_::ExprCast(ref expr, ref ty) => { + rewrite_cast(expr, ty, context, width, offset) } // We do not format these expressions yet, but they should still // satisfy our width restrictions. ast::Expr_::ExprInPlace(..) | - ast::Expr_::ExprCast(..) | ast::Expr_::ExprIndex(..) | ast::Expr_::ExprInlineAsm(..) | ast::Expr_::ExprRepeat(..) => { @@ -195,6 +197,38 @@ impl Rewrite for ast::Expr { } } +fn rewrite_cast(expr: &ast::Expr, + ty: &ast::Ty, + context: &RewriteContext, + width: usize, + offset: Indent) + -> Option { + let max_width = try_opt!(width.checked_sub(" as ".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 ty_budget = match max_width.checked_sub(last_line_width) { + Some(b) => b, + None => return Err(Ordering::Less), + }; + let ty_indent = offset + last_line_width; + + let ty_str = match ty.rewrite(context, ty_budget, ty_indent) { + Some(result) => result, + None => return Err(Ordering::Less), + }; + + Ok(format!("{} as {}", expr_str, ty_str)) + }) +} + pub fn rewrite_array<'a, I>(expr_iter: I, span: Span, context: &RewriteContext, diff --git a/tests/source/expr.rs b/tests/source/expr.rs index 96ad42cd77d..544a566cee9 100644 --- a/tests/source/expr.rs +++ b/tests/source/expr.rs @@ -184,3 +184,16 @@ fn addrof() { & mut(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb); & (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb); } + +fn casts() { + fn unpack(packed: u32) -> [u16; 2] { + [ + (packed >> 16) as u16, + (packed >> 0) as u16, + ] + } + + let some_trait_xxx = xxxxxxxxxxx + xxxxxxxxxxxxx + as SomeTraitXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + let slightly_longer_trait = yyyyyyyyy + yyyyyyyyyyy as SomeTraitYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY; +} diff --git a/tests/target/expr.rs b/tests/target/expr.rs index f31f27f59d4..c23b0b050c8 100644 --- a/tests/target/expr.rs +++ b/tests/target/expr.rs @@ -198,3 +198,13 @@ fn addrof() { &(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb); } + +fn casts() { + fn unpack(packed: u32) -> [u16; 2] { + [(packed >> 16) as u16, (packed >> 0) as u16] + } + + let some_trait_xxx = xxxxxxxxxxx + xxxxxxxxxxxxx as SomeTraitXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; + let slightly_longer_trait = yyyyyyyyy + + yyyyyyyyyyy as SomeTraitYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY; +}