Skip to content

Commit 1290d70

Browse files
committed
Preserve semicolon on braced statement-position macros
1 parent 78b9b40 commit 1290d70

File tree

4 files changed

+37
-30
lines changed

4 files changed

+37
-30
lines changed

src/expr.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,8 @@ impl Printer {
521521
self.cbox(INDENT);
522522
self.hardbreak_if_nonempty();
523523
self.inner_attrs(&expr.attrs);
524-
for stmt in &expr.body.stmts {
525-
self.stmt(stmt);
524+
for stmt in expr.body.stmts.iter().delimited() {
525+
self.stmt(&stmt, stmt.is_last);
526526
}
527527
self.offset(-INDENT);
528528
self.end();
@@ -573,8 +573,8 @@ impl Printer {
573573
} else {
574574
self.word("{");
575575
self.hardbreak();
576-
for stmt in &expr.then_branch.stmts {
577-
self.stmt(stmt);
576+
for stmt in expr.then_branch.stmts.iter().delimited() {
577+
self.stmt(&stmt, stmt.is_last);
578578
}
579579
self.offset(-INDENT);
580580
self.word("}");
@@ -662,8 +662,8 @@ impl Printer {
662662
self.cbox(INDENT);
663663
self.hardbreak_if_nonempty();
664664
self.inner_attrs(&expr.attrs);
665-
for stmt in &expr.body.stmts {
666-
self.stmt(stmt);
665+
for stmt in expr.body.stmts.iter().delimited() {
666+
self.stmt(&stmt, stmt.is_last);
667667
}
668668
self.offset(-INDENT);
669669
self.end();
@@ -1026,8 +1026,8 @@ impl Printer {
10261026
self.cbox(INDENT);
10271027
self.hardbreak_if_nonempty();
10281028
self.inner_attrs(&expr.attrs);
1029-
for stmt in &expr.body.stmts {
1030-
self.stmt(stmt);
1029+
for stmt in expr.body.stmts.iter().delimited() {
1030+
self.stmt(&stmt, stmt.is_last);
10311031
}
10321032
self.offset(-INDENT);
10331033
self.end();
@@ -1105,8 +1105,8 @@ impl Printer {
11051105
self.cbox(INDENT);
11061106
self.hardbreak_if_nonempty();
11071107
self.inner_attrs(&body.attrs);
1108-
for stmt in &body.block.stmts {
1109-
self.stmt(stmt);
1108+
for stmt in body.block.stmts.iter().delimited() {
1109+
self.stmt(&stmt, stmt.is_last);
11101110
}
11111111
self.offset(-INDENT);
11121112
self.end();
@@ -1164,8 +1164,8 @@ impl Printer {
11641164
self.space();
11651165
}
11661166
_ => {
1167-
for stmt in &block.stmts {
1168-
self.stmt(stmt);
1167+
for stmt in block.stmts.iter().delimited() {
1168+
self.stmt(&stmt, stmt.is_last);
11691169
}
11701170
}
11711171
}

src/item.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::algorithm::Printer;
22
use crate::fixup::FixupContext;
33
use crate::iter::IterDelimited;
4+
use crate::mac;
45
use crate::path::PathKind;
56
use crate::INDENT;
67
use proc_macro2::TokenStream;
@@ -101,8 +102,8 @@ impl Printer {
101102
self.word("{");
102103
self.hardbreak_if_nonempty();
103104
self.inner_attrs(&item.attrs);
104-
for stmt in &item.block.stmts {
105-
self.stmt(stmt);
105+
for stmt in item.block.stmts.iter().delimited() {
106+
self.stmt(&stmt, stmt.is_last);
106107
}
107108
self.offset(-INDENT);
108109
self.end();
@@ -169,7 +170,7 @@ impl Printer {
169170

170171
fn item_macro(&mut self, item: &ItemMacro) {
171172
self.outer_attrs(&item.attrs);
172-
let semicolon = true;
173+
let semicolon = mac::requires_semi(&item.mac.delimiter);
173174
self.mac(&item.mac, item.ident.as_ref(), semicolon);
174175
self.hardbreak();
175176
}
@@ -837,7 +838,7 @@ impl Printer {
837838

838839
fn foreign_item_macro(&mut self, foreign_item: &ForeignItemMacro) {
839840
self.outer_attrs(&foreign_item.attrs);
840-
let semicolon = true;
841+
let semicolon = mac::requires_semi(&foreign_item.mac.delimiter);
841842
self.mac(&foreign_item.mac, None, semicolon);
842843
self.hardbreak();
843844
}
@@ -982,8 +983,8 @@ impl Printer {
982983
self.word("{");
983984
self.hardbreak_if_nonempty();
984985
self.inner_attrs(&trait_item.attrs);
985-
for stmt in &block.stmts {
986-
self.stmt(stmt);
986+
for stmt in block.stmts.iter().delimited() {
987+
self.stmt(&stmt, stmt.is_last);
987988
}
988989
self.offset(-INDENT);
989990
self.end();
@@ -1024,7 +1025,7 @@ impl Printer {
10241025

10251026
fn trait_item_macro(&mut self, trait_item: &TraitItemMacro) {
10261027
self.outer_attrs(&trait_item.attrs);
1027-
let semicolon = true;
1028+
let semicolon = mac::requires_semi(&trait_item.mac.delimiter);
10281029
self.mac(&trait_item.mac, None, semicolon);
10291030
self.hardbreak();
10301031
}
@@ -1181,8 +1182,8 @@ impl Printer {
11811182
self.word("{");
11821183
self.hardbreak_if_nonempty();
11831184
self.inner_attrs(&impl_item.attrs);
1184-
for stmt in &impl_item.block.stmts {
1185-
self.stmt(stmt);
1185+
for stmt in impl_item.block.stmts.iter().delimited() {
1186+
self.stmt(&stmt, stmt.is_last);
11861187
}
11871188
self.offset(-INDENT);
11881189
self.end();
@@ -1212,7 +1213,7 @@ impl Printer {
12121213

12131214
fn impl_item_macro(&mut self, impl_item: &ImplItemMacro) {
12141215
self.outer_attrs(&impl_item.attrs);
1215-
let semicolon = true;
1216+
let semicolon = mac::requires_semi(&impl_item.mac.delimiter);
12161217
self.mac(&impl_item.mac, None, semicolon);
12171218
self.hardbreak();
12181219
}
@@ -1730,8 +1731,8 @@ mod verbatim {
17301731
self.word("{");
17311732
self.hardbreak_if_nonempty();
17321733
self.inner_attrs(&item.attrs);
1733-
for stmt in body {
1734-
self.stmt(stmt);
1734+
for stmt in body.iter().delimited() {
1735+
self.stmt(&stmt, stmt.is_last);
17351736
}
17361737
self.offset(-INDENT);
17371738
self.end();

src/mac.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@ impl Printer {
4141
}
4242
self.word(close);
4343
if semicolon {
44-
match mac.delimiter {
45-
MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => self.word(";"),
46-
MacroDelimiter::Brace(_) => {}
47-
}
44+
self.word(";");
4845
}
4946
}
5047

@@ -212,6 +209,13 @@ impl Printer {
212209
}
213210
}
214211

212+
pub(crate) fn requires_semi(delimiter: &MacroDelimiter) -> bool {
213+
match delimiter {
214+
MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => true,
215+
MacroDelimiter::Brace(_) => false,
216+
}
217+
}
218+
215219
fn is_keyword(ident: &Ident) -> bool {
216220
match ident.to_string().as_str() {
217221
"as" | "async" | "await" | "box" | "break" | "const" | "continue" | "crate" | "dyn"

src/stmt.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ use crate::algorithm::Printer;
22
use crate::classify;
33
use crate::expr;
44
use crate::fixup::FixupContext;
5+
use crate::mac;
56
use crate::INDENT;
67
use syn::{BinOp, Expr, Stmt};
78

89
impl Printer {
9-
pub fn stmt(&mut self, stmt: &Stmt) {
10+
pub fn stmt(&mut self, stmt: &Stmt, is_last: bool) {
1011
match stmt {
1112
Stmt::Local(local) => {
1213
self.outer_attrs(&local.attrs);
@@ -69,7 +70,8 @@ impl Printer {
6970
}
7071
Stmt::Macro(stmt) => {
7172
self.outer_attrs(&stmt.attrs);
72-
let semicolon = true;
73+
let semicolon = stmt.semi_token.is_some()
74+
|| !is_last && mac::requires_semi(&stmt.mac.delimiter);
7375
self.mac(&stmt.mac, None, semicolon);
7476
self.hardbreak();
7577
}

0 commit comments

Comments
 (0)