Skip to content

Commit 820e212

Browse files
committed
Visit last if_stmt
1 parent 07c7447 commit 820e212

File tree

4 files changed

+38
-32
lines changed

4 files changed

+38
-32
lines changed

src/expr.rs

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use matches::rewrite_match;
3333
use overflow;
3434
use pairs::{rewrite_all_pairs, rewrite_pair, PairParts};
3535
use patterns::{can_be_overflowed_pat, is_short_pattern, TuplePatField};
36-
use rewrite::{Rewrite, RewriteContext};
36+
use rewrite::{Rewrite, RewriteContext, RewriteStmt};
3737
use shape::{Indent, Shape};
3838
use spanned::Spanned;
3939
use string::{rewrite_string, StringFormat};
@@ -455,7 +455,7 @@ fn rewrite_single_line_block(
455455
) -> Option<String> {
456456
if is_simple_block(block, attrs, context.codemap) {
457457
let expr_shape = shape.offset_left(last_line_width(prefix))?;
458-
let expr_str = block.stmts[0].rewrite(context, expr_shape)?;
458+
let expr_str = block.stmts[0].rewrite(context, expr_shape, false)?;
459459
let label_str = rewrite_label(label);
460460
let result = format!("{}{}{{ {} }}", prefix, label_str, expr_str);
461461
if result.len() <= shape.width && !result.contains('\n') {
@@ -531,8 +531,13 @@ fn rewrite_block(
531531
result
532532
}
533533

534-
impl Rewrite for ast::Stmt {
535-
fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
534+
impl RewriteStmt for ast::Stmt {
535+
fn rewrite(
536+
&self,
537+
context: &RewriteContext,
538+
shape: Shape,
539+
last_stmt_is_if: bool,
540+
) -> Option<String> {
536541
skip_out_of_file_lines_range!(context, self.span());
537542

538543
let result = match self.node {
@@ -545,12 +550,11 @@ impl Rewrite for ast::Stmt {
545550
};
546551

547552
let shape = shape.sub_width(suffix.len())?;
548-
let expr_type =
549-
if stmt_is_expr(&self) && context.snippet(self.span).starts_with("if ") {
550-
ExprType::SubExpression
551-
} else {
552-
ExprType::Statement
553-
};
553+
let expr_type = if last_stmt_is_if {
554+
ExprType::SubExpression
555+
} else {
556+
ExprType::Statement
557+
};
554558
format_expr(ex, expr_type, context, shape).map(|s| s + suffix)
555559
}
556560
ast::StmtKind::Mac(..) | ast::StmtKind::Item(..) => None,
@@ -750,11 +754,12 @@ impl<'a> ControlFlow<'a> {
750754

751755
let new_width = width.checked_sub(pat_expr_str.len() + fixed_cost)?;
752756
let expr = &self.block.stmts[0];
753-
let if_str = expr.rewrite(context, Shape::legacy(new_width, Indent::empty()))?;
757+
let if_str = expr.rewrite(context, Shape::legacy(new_width, Indent::empty()), false)?;
754758

755759
let new_width = new_width.checked_sub(if_str.len())?;
756760
let else_expr = &else_node.stmts[0];
757-
let else_str = else_expr.rewrite(context, Shape::legacy(new_width, Indent::empty()))?;
761+
let else_str =
762+
else_expr.rewrite(context, Shape::legacy(new_width, Indent::empty()), false)?;
758763

759764
if if_str.contains('\n') || else_str.contains('\n') {
760765
return None;
@@ -1136,26 +1141,16 @@ pub fn stmt_is_expr(stmt: &ast::Stmt) -> bool {
11361141
}
11371142
}
11381143

1139-
fn stmt_is_if(stmt: &ast::Stmt) -> bool {
1144+
pub(crate) fn stmt_is_if(stmt: &ast::Stmt) -> bool {
11401145
match stmt.node {
1141-
ast::StmtKind::Semi(ref e) | ast::StmtKind::Expr(ref e) => {
1142-
match e.node {
1143-
ast::ExprKind::If(..) => true,
1144-
_ => false,
1145-
}
1146+
ast::StmtKind::Semi(ref e) | ast::StmtKind::Expr(ref e) => match e.node {
1147+
ast::ExprKind::If(..) => true,
1148+
_ => false,
11461149
},
11471150
_ => false,
11481151
}
11491152
}
11501153

1151-
fn block_last_stmt_is_if(block: &ast::Block) -> bool {
1152-
if let Some(ref stmt) = block.stmts.last() {
1153-
stmt_is_if(stmt)
1154-
} else {
1155-
false
1156-
}
1157-
}
1158-
11591154
pub fn is_unsafe_block(block: &ast::Block) -> bool {
11601155
if let ast::BlockCheckMode::Unsafe(..) = block.rules {
11611156
true

src/items.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use expr::{
3333
use lists::{definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator};
3434
use macros::{rewrite_macro, MacroPosition};
3535
use overflow;
36-
use rewrite::{Rewrite, RewriteContext};
36+
use rewrite::{Rewrite, RewriteContext, RewriteStmt};
3737
use shape::{Indent, Shape};
3838
use spanned::Spanned;
3939
use utils::*;
@@ -399,7 +399,7 @@ impl<'a> FmtVisitor<'a> {
399399
.map(|s| s + suffix)
400400
.or_else(|| Some(self.snippet(e.span).to_owned()))
401401
}
402-
None => stmt.rewrite(&self.get_context(), self.shape()),
402+
None => stmt.rewrite(&self.get_context(), self.shape(), false),
403403
}
404404
} else {
405405
None

src/rewrite.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ pub trait Rewrite {
2525
fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String>;
2626
}
2727

28+
pub trait RewriteStmt {
29+
fn rewrite(
30+
&self,
31+
context: &RewriteContext,
32+
shape: Shape,
33+
last_stmt_is_if: bool,
34+
) -> Option<String>;
35+
}
36+
2837
#[derive(Clone)]
2938
pub struct RewriteContext<'a> {
3039
pub parse_session: &'a ParseSess,

src/visitor.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ use attr::*;
1717
use codemap::{LineRangeUtils, SpanUtils};
1818
use comment::{CodeCharKind, CommentCodeSlices, FindUncommented};
1919
use config::{BraceStyle, Config};
20+
use expr::stmt_is_if;
2021
use items::{
2122
format_impl, format_trait, format_trait_alias, is_mod_decl, is_use_item,
2223
rewrite_associated_impl_type, rewrite_associated_type, rewrite_extern_crate,
2324
rewrite_type_alias, FnSig, StaticParts, StructParts,
2425
};
2526
use macros::{rewrite_macro, rewrite_macro_def, MacroPosition};
26-
use rewrite::{Rewrite, RewriteContext};
27+
use rewrite::{Rewrite, RewriteContext, RewriteStmt};
2728
use shape::{Indent, Shape};
2829
use spanned::Spanned;
2930
use utils::{
@@ -79,7 +80,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
7980
Shape::indented(self.block_indent, self.config)
8081
}
8182

82-
fn visit_stmt(&mut self, stmt: &ast::Stmt) {
83+
fn visit_stmt(&mut self, stmt: &ast::Stmt, last_stmt_is_if: bool) {
8384
debug!(
8485
"visit_stmt: {:?} {:?}",
8586
self.codemap.lookup_char_pos(stmt.span.lo()),
@@ -94,7 +95,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
9495
if contains_skip(get_attrs_from_stmt(stmt)) {
9596
self.push_skipped_with_span(stmt.span());
9697
} else {
97-
let rewrite = stmt.rewrite(&self.get_context(), self.shape());
98+
let rewrite = stmt.rewrite(&self.get_context(), self.shape(), last_stmt_is_if);
9899
self.push_rewrite(stmt.span(), rewrite)
99100
}
100101
}
@@ -662,7 +663,8 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
662663
.collect();
663664

664665
if items.is_empty() {
665-
self.visit_stmt(&stmts[0]);
666+
let last_stmt_is_if = stmts[0] == stmts[stmts.len() - 1] && stmt_is_if(&stmts[0]);
667+
self.visit_stmt(&stmts[0], last_stmt_is_if);
666668
self.walk_stmts(&stmts[1..]);
667669
} else {
668670
self.visit_items_with_reordering(&items);

0 commit comments

Comments
 (0)