Skip to content

Commit a1c2062

Browse files
jdonszelmannGuillaumeGomez
authored andcommitted
fix empty after lint on impl/trait items
1 parent 878e96c commit a1c2062

File tree

5 files changed

+121
-34
lines changed

5 files changed

+121
-34
lines changed

clippy_lints/src/empty_line_after.rs

+66-33
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ use clippy_utils::source::{SpanRangeExt, snippet_indent};
33
use clippy_utils::tokenize_with_text;
44
use itertools::Itertools;
55
use rustc_ast::token::CommentKind;
6-
use rustc_ast::{AttrKind, AttrStyle, Attribute, Crate, Item, ItemKind, ModKind, NodeId};
6+
use rustc_ast::{AssocItemKind, AttrKind, AttrStyle, Attribute, Crate, Item, ItemKind, ModKind, NodeId};
77
use rustc_errors::{Applicability, Diag, SuggestionStyle};
88
use rustc_lexer::TokenKind;
99
use rustc_lint::{EarlyContext, EarlyLintPass, LintContext};
1010
use rustc_session::impl_lint_pass;
1111
use rustc_span::symbol::kw;
12-
use rustc_span::{BytePos, ExpnKind, InnerSpan, Span, SpanData, Symbol};
12+
use rustc_span::{BytePos, ExpnKind, Ident, InnerSpan, Span, SpanData, Symbol};
1313

1414
declare_clippy_lint! {
1515
/// ### What it does
@@ -367,38 +367,26 @@ impl EmptyLineAfter {
367367
);
368368
}
369369
}
370-
}
371-
372-
impl EarlyLintPass for EmptyLineAfter {
373-
fn check_crate(&mut self, _: &EarlyContext<'_>, krate: &Crate) {
374-
self.items.push(ItemInfo {
375-
kind: "crate",
376-
name: kw::Crate,
377-
span: krate.spans.inner_span.with_hi(krate.spans.inner_span.lo()),
378-
mod_items: krate
379-
.items
380-
.iter()
381-
.filter(|i| !matches!(i.span.ctxt().outer_expn_data().kind, ExpnKind::AstPass(_)))
382-
.map(|i| i.id)
383-
.collect::<Vec<_>>(),
384-
});
385-
}
386-
387-
fn check_item_post(&mut self, _: &EarlyContext<'_>, _: &Item) {
388-
self.items.pop();
389-
}
390370

391-
fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
371+
fn check_item_kind(
372+
&mut self,
373+
cx: &EarlyContext<'_>,
374+
kind: &ItemKind,
375+
ident: &Ident,
376+
span: Span,
377+
attrs: &[Attribute],
378+
id: NodeId,
379+
) {
392380
self.items.push(ItemInfo {
393-
kind: item.kind.descr(),
394-
name: item.ident.name,
395-
span: if item.span.contains(item.ident.span) {
396-
item.span.with_hi(item.ident.span.hi())
381+
kind: kind.descr(),
382+
name: ident.name,
383+
span: if span.contains(ident.span) {
384+
span.with_hi(ident.span.hi())
397385
} else {
398-
item.span.with_hi(item.span.lo())
386+
span.with_hi(span.lo())
399387
},
400-
mod_items: match item.kind {
401-
ItemKind::Mod(_, ModKind::Loaded(ref items, _, _, _)) => items
388+
mod_items: match kind {
389+
ItemKind::Mod(_, ModKind::Loaded(items, _, _, _)) => items
402390
.iter()
403391
.filter(|i| !matches!(i.span.ctxt().outer_expn_data().kind, ExpnKind::AstPass(_)))
404392
.map(|i| i.id)
@@ -407,8 +395,7 @@ impl EarlyLintPass for EmptyLineAfter {
407395
},
408396
});
409397

410-
let mut outer = item
411-
.attrs
398+
let mut outer = attrs
412399
.iter()
413400
.filter(|attr| attr.style == AttrStyle::Outer && !attr.span.from_expansion())
414401
.map(|attr| Stop::from_attr(cx, attr))
@@ -448,6 +435,52 @@ impl EarlyLintPass for EmptyLineAfter {
448435
}
449436
}
450437

451-
self.check_gaps(cx, &gaps, item.id);
438+
self.check_gaps(cx, &gaps, id);
439+
}
440+
}
441+
442+
impl EarlyLintPass for EmptyLineAfter {
443+
fn check_crate(&mut self, _: &EarlyContext<'_>, krate: &Crate) {
444+
self.items.push(ItemInfo {
445+
kind: "crate",
446+
name: kw::Crate,
447+
span: krate.spans.inner_span.with_hi(krate.spans.inner_span.lo()),
448+
mod_items: krate
449+
.items
450+
.iter()
451+
.filter(|i| !matches!(i.span.ctxt().outer_expn_data().kind, ExpnKind::AstPass(_)))
452+
.map(|i| i.id)
453+
.collect::<Vec<_>>(),
454+
});
455+
}
456+
457+
fn check_item_post(&mut self, _: &EarlyContext<'_>, _: &Item) {
458+
self.items.pop();
459+
}
460+
461+
fn check_impl_item(&mut self, cx: &EarlyContext<'_>, item: &Item<AssocItemKind>) {
462+
self.check_item_kind(
463+
cx,
464+
&item.kind.clone().into(),
465+
&item.ident,
466+
item.span,
467+
&item.attrs,
468+
item.id,
469+
);
470+
}
471+
472+
fn check_trait_item(&mut self, cx: &EarlyContext<'_>, item: &Item<AssocItemKind>) {
473+
self.check_item_kind(
474+
cx,
475+
&item.kind.clone().into(),
476+
&item.ident,
477+
item.span,
478+
&item.attrs,
479+
item.id,
480+
);
481+
}
482+
483+
fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
484+
self.check_item_kind(cx, &item.kind, &item.ident, item.span, &item.attrs, item.id);
452485
}
453486
}

tests/ui/empty_line_after/doc_comments.1.fixed

+14
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,18 @@ pub struct BlockComment;
132132
))]
133133
fn empty_line_in_cfg_attr() {}
134134

135+
trait Foo {
136+
fn bar();
137+
}
138+
139+
impl Foo for LineComment {
140+
/// Returns an `Option<Month>` from a i64, assuming a 1-index, January = 1.
141+
///
142+
/// `Month::from_i64(n: i64)`: | `1` | `2` | ... | `12`
143+
/// ---------------------------| -------------------- | --------------------- | ... | -----
144+
/// ``: | Some(Month::January) | Some(Month::February) | ... |
145+
/// Some(Month::December)
146+
fn bar() {}
147+
}
148+
135149
fn main() {}

tests/ui/empty_line_after/doc_comments.2.fixed

+14
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,18 @@ pub struct BlockComment;
141141
))]
142142
fn empty_line_in_cfg_attr() {}
143143

144+
trait Foo {
145+
fn bar();
146+
}
147+
148+
impl Foo for LineComment {
149+
/// Returns an `Option<Month>` from a i64, assuming a 1-index, January = 1.
150+
///
151+
/// `Month::from_i64(n: i64)`: | `1` | `2` | ... | `12`
152+
/// ---------------------------| -------------------- | --------------------- | ... | -----
153+
/// ``: | Some(Month::January) | Some(Month::February) | ... |
154+
/// Some(Month::December)
155+
fn bar() {}
156+
}
157+
144158
fn main() {}

tests/ui/empty_line_after/doc_comments.rs

+15
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,19 @@ pub struct BlockComment;
144144
))]
145145
fn empty_line_in_cfg_attr() {}
146146

147+
trait Foo {
148+
fn bar();
149+
}
150+
151+
impl Foo for LineComment {
152+
/// Returns an `Option<Month>` from a i64, assuming a 1-index, January = 1.
153+
///
154+
/// `Month::from_i64(n: i64)`: | `1` | `2` | ... | `12`
155+
/// ---------------------------| -------------------- | --------------------- | ... | -----
156+
/// ``: | Some(Month::January) | Some(Month::February) | ... |
157+
/// Some(Month::December)
158+
159+
fn bar() {}
160+
}
161+
147162
fn main() {}

tests/ui/empty_line_after/doc_comments.stderr

+12-1
Original file line numberDiff line numberDiff line change
@@ -171,5 +171,16 @@ help: if the doc comment should not document `new_code2` comment it out
171171
LL | // /// Docs for `old_code2`
172172
| ++
173173

174-
error: aborting due to 10 previous errors
174+
error: empty line after doc comment
175+
--> tests/ui/empty_line_after/doc_comments.rs:157:5
176+
|
177+
LL | / /// Some(Month::December)
178+
LL | |
179+
| |_^
180+
LL | fn bar() {}
181+
| ------ the comment documents this function
182+
|
183+
= help: if the empty line is unintentional remove it
184+
185+
error: aborting due to 11 previous errors
175186

0 commit comments

Comments
 (0)