From 150765d755fdfcab5d6f2949be7ad9df37e36e86 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Mon, 21 May 2018 12:18:06 +0800 Subject: [PATCH 1/2] format label break --- src/expr.rs | 7 ++++--- tests/source/label_break.rs | 16 ++++++++++++++++ tests/target/label_break.rs | 16 ++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 tests/source/label_break.rs create mode 100644 tests/target/label_break.rs diff --git a/src/expr.rs b/src/expr.rs index 8961cec4240..f1cfe8b4c4c 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -118,8 +118,7 @@ pub fn format_expr( | ast::ExprKind::While(..) | ast::ExprKind::WhileLet(..) => to_control_flow(expr, expr_type) .and_then(|control_flow| control_flow.rewrite(context, shape)), - // FIXME(topecongiro): Handle label on a block (#2722). - ast::ExprKind::Block(ref block, _) => { + ast::ExprKind::Block(ref block, opt_label) => { match expr_type { ExprType::Statement => { if is_unsafe_block(block) { @@ -131,9 +130,11 @@ pub fn format_expr( rw } else { let prefix = block_prefix(context, block, shape)?; + let label_string = rewrite_label(opt_label); + rewrite_block_with_visitor( context, - &prefix, + &format!("{}{}", &prefix, &label_string), block, Some(&expr.attrs), shape, diff --git a/tests/source/label_break.rs b/tests/source/label_break.rs new file mode 100644 index 00000000000..d1e34bce4d4 --- /dev/null +++ b/tests/source/label_break.rs @@ -0,0 +1,16 @@ +// format with label break value. +fn main() { + +'empty_block: {} + +let result = 'block: { + if foo() { + // comment + break 'block 1; + } + if bar() { /* comment */ + break 'block 2; + } + 3 +}; +} \ No newline at end of file diff --git a/tests/target/label_break.rs b/tests/target/label_break.rs new file mode 100644 index 00000000000..2e05159de39 --- /dev/null +++ b/tests/target/label_break.rs @@ -0,0 +1,16 @@ +// format with label break value. +fn main() { + {} + + let result = { + if foo() { + // comment + break 'block 1; + } + if bar() { + /* comment */ + break 'block 2; + } + 3 + }; +} From 64768cf93208cec8ad29768c36d9bd2ac4e772a1 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Mon, 21 May 2018 22:19:26 +0800 Subject: [PATCH 2/2] fix label prefix --- src/expr.rs | 17 +++++++++++------ tests/source/label_break.rs | 14 +++++++++++++- tests/target/label_break.rs | 14 +++++++++++++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index f1cfe8b4c4c..ea3ac5f58f2 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -122,7 +122,7 @@ pub fn format_expr( match expr_type { ExprType::Statement => { if is_unsafe_block(block) { - rewrite_block(block, Some(&expr.attrs), context, shape) + rewrite_block(block, Some(&expr.attrs), opt_label, context, shape) } else if let rw @ Some(_) = rewrite_empty_block(context, block, Some(&expr.attrs), "", shape) { @@ -130,11 +130,10 @@ pub fn format_expr( rw } else { let prefix = block_prefix(context, block, shape)?; - let label_string = rewrite_label(opt_label); rewrite_block_with_visitor( context, - &format!("{}{}", &prefix, &label_string), + &prefix, block, Some(&expr.attrs), shape, @@ -142,7 +141,9 @@ pub fn format_expr( ) } } - ExprType::SubExpression => rewrite_block(block, Some(&expr.attrs), context, shape), + ExprType::SubExpression => { + rewrite_block(block, Some(&expr.attrs), opt_label, context, shape) + } } } ast::ExprKind::Match(ref cond, ref arms) => { @@ -328,6 +329,7 @@ pub fn format_expr( rewrite_block( block, Some(&expr.attrs), + None, context, Shape::legacy(budget, shape.indent) )? @@ -645,17 +647,20 @@ pub fn rewrite_block_with_visitor( impl Rewrite for ast::Block { fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { - rewrite_block(self, None, context, shape) + rewrite_block(self, None, None, context, shape) } } fn rewrite_block( block: &ast::Block, attrs: Option<&[ast::Attribute]>, + label: Option, context: &RewriteContext, shape: Shape, ) -> Option { - let prefix = block_prefix(context, block, shape)?; + let unsafe_string = block_prefix(context, block, shape)?; + let label_string = rewrite_label(label); + let prefix = format!("{}{}", unsafe_string, label_string); // shape.width is used only for the single line case: either the empty block `{}`, // or an unsafe expression `unsafe { e }`. diff --git a/tests/source/label_break.rs b/tests/source/label_break.rs index d1e34bce4d4..2c79fd35e70 100644 --- a/tests/source/label_break.rs +++ b/tests/source/label_break.rs @@ -3,10 +3,22 @@ fn main() { 'empty_block: {} +'block: { + do_thing(); + if condition_not_met() { + break 'block; + } + do_next_thing(); + if condition_not_met() { + break 'block; + } + do_last_thing(); +} + let result = 'block: { if foo() { // comment - break 'block 1; + break 'block 1; } if bar() { /* comment */ break 'block 2; diff --git a/tests/target/label_break.rs b/tests/target/label_break.rs index 2e05159de39..afbd8e6fcdf 100644 --- a/tests/target/label_break.rs +++ b/tests/target/label_break.rs @@ -2,7 +2,19 @@ fn main() { {} - let result = { + { + do_thing(); + if condition_not_met() { + break 'block; + } + do_next_thing(); + if condition_not_met() { + break 'block; + } + do_last_thing(); + } + + let result = 'block: { if foo() { // comment break 'block 1;