Skip to content

Commit e254753

Browse files
authored
Properly skip macros in impl and trait blocks (#4209)
1 parent 3cae9c3 commit e254753

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

Diff for: rustfmt-core/rustfmt-lib/src/formatting/visitor.rs

+6
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,8 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
603603
self.push_skipped_with_span(ti.attrs.as_slice(), ti.span, ti.span);
604604
return;
605605
}
606+
let skip_context_outer = self.skip_context.clone();
607+
self.skip_context.update_with_attrs(&ti.attrs);
606608

607609
match ti.kind {
608610
ast::AssocItemKind::Const(..) => self.visit_static(&StaticParts::from_trait_item(ti)),
@@ -640,6 +642,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
640642
self.visit_mac(mac, Some(ti.ident), MacroPosition::Item);
641643
}
642644
}
645+
self.skip_context = skip_context_outer;
643646
}
644647

645648
pub(crate) fn visit_impl_item(&mut self, ii: &ast::AssocItem) {
@@ -649,6 +652,8 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
649652
self.push_skipped_with_span(ii.attrs.as_slice(), ii.span, ii.span);
650653
return;
651654
}
655+
let skip_context_outer = self.skip_context.clone();
656+
self.skip_context.update_with_attrs(&ii.attrs);
652657

653658
match ii.kind {
654659
ast::AssocItemKind::Fn(defaultness, ref sig, ref generics, Some(ref body)) => {
@@ -700,6 +705,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
700705
self.visit_mac(mac, Some(ii.ident), MacroPosition::Item);
701706
}
702707
}
708+
self.skip_context = skip_context_outer;
703709
}
704710

705711
fn visit_mac(&mut self, mac: &ast::MacCall, ident: Option<symbol::Ident>, pos: MacroPosition) {

Diff for: rustfmt-core/rustfmt-lib/tests/source/issue-4167.rs

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
impl Type {
2+
#[rustfmt::skip::macros(macros)]
3+
fn example() {
4+
func(
5+
"format me"
6+
);
7+
other!(
8+
"format me"
9+
);
10+
macros!(
11+
"do not format"
12+
);
13+
macros![
14+
"do not format"
15+
];
16+
}
17+
}
18+
19+
impl Trait for Type {
20+
#[rustfmt::skip::macros(macros)]
21+
fn example() {
22+
func(
23+
"format me"
24+
);
25+
other!(
26+
"format me"
27+
);
28+
macros!(
29+
"do not format"
30+
);
31+
}
32+
}
33+
34+
trait Trait {
35+
#[rustfmt::skip::macros(macros)]
36+
fn example() {
37+
func(
38+
"format me"
39+
);
40+
other!(
41+
"format me"
42+
);
43+
macros!(
44+
"do not format"
45+
);
46+
}
47+
}

Diff for: rustfmt-core/rustfmt-lib/tests/target/issue-4167.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
impl Type {
2+
#[rustfmt::skip::macros(macros)]
3+
fn example() {
4+
func("format me");
5+
other!("format me");
6+
macros!(
7+
"do not format"
8+
);
9+
macros![
10+
"do not format"
11+
];
12+
}
13+
}
14+
15+
impl Trait for Type {
16+
#[rustfmt::skip::macros(macros)]
17+
fn example() {
18+
func("format me");
19+
other!("format me");
20+
macros!(
21+
"do not format"
22+
);
23+
}
24+
}
25+
26+
trait Trait {
27+
#[rustfmt::skip::macros(macros)]
28+
fn example() {
29+
func("format me");
30+
other!("format me");
31+
macros!(
32+
"do not format"
33+
);
34+
}
35+
}

0 commit comments

Comments
 (0)