1
Fork 0

Fix #[expect] and #[allow] for clippy::duplicate_mod

This commit is contained in:
xFrednet 2022-06-26 00:00:47 +02:00
parent c8b4873cf9
commit a2810cd277
No known key found for this signature in database
GPG key ID: F5C59D0E669E5302
4 changed files with 48 additions and 6 deletions

View file

@ -1,7 +1,7 @@
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_help;
use rustc_ast::ast::{Crate, Inline, Item, ItemKind, ModKind}; use rustc_ast::ast::{Crate, Inline, Item, ItemKind, ModKind};
use rustc_errors::MultiSpan; use rustc_errors::MultiSpan;
use rustc_lint::{EarlyContext, EarlyLintPass, LintContext}; use rustc_lint::{EarlyContext, EarlyLintPass, LintContext, Level};
use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::{FileName, Span}; use rustc_span::{FileName, Span};
use std::collections::BTreeMap; use std::collections::BTreeMap;
@ -49,6 +49,7 @@ declare_clippy_lint! {
struct Modules { struct Modules {
local_path: PathBuf, local_path: PathBuf,
spans: Vec<Span>, spans: Vec<Span>,
lint_levels: Vec<Level>,
} }
#[derive(Default)] #[derive(Default)]
@ -70,13 +71,30 @@ impl EarlyLintPass for DuplicateMod {
let modules = self.modules.entry(absolute_path).or_insert(Modules { let modules = self.modules.entry(absolute_path).or_insert(Modules {
local_path, local_path,
spans: Vec::new(), spans: Vec::new(),
lint_levels: Vec::new(),
}); });
modules.spans.push(item.span_with_attributes()); modules.spans.push(item.span_with_attributes());
modules.lint_levels.push(cx.get_lint_level(DUPLICATE_MOD));
} }
} }
fn check_crate_post(&mut self, cx: &EarlyContext<'_>, _: &Crate) { fn check_crate_post(&mut self, cx: &EarlyContext<'_>, _: &Crate) {
for Modules { local_path, spans } in self.modules.values() { for Modules { local_path, spans, lint_levels } in self.modules.values() {
if spans.len() < 2 {
continue;
}
// At this point the lint would be emitted
assert_eq!(spans.len(), lint_levels.len());
let spans: Vec<_> = spans.into_iter().zip(lint_levels).filter_map(|(span, lvl)|{
if let Some(id) = lvl.get_expectation_id() {
cx.fulfill_expectation(id);
}
(!matches!(lvl, Level::Allow | Level::Expect(_))).then_some(*span)
})
.collect();
if spans.len() < 2 { if spans.len() < 2 {
continue; continue;
} }

View file

@ -1,3 +1,5 @@
#[feature(lint_reasons)]
mod a; mod a;
mod b; mod b;
@ -13,4 +15,15 @@ mod c3;
mod from_other_module; mod from_other_module;
mod other_module; mod other_module;
mod d;
#[path = "d.rs"]
mod d2;
#[path = "d.rs"]
#[expect(clippy::duplicate_mod)]
mod d3;
#[path = "d.rs"]
#[allow(clippy::duplicate_mod)]
mod d4;
fn main() {} fn main() {}

View file

@ -1,5 +1,5 @@
error: file is loaded as a module multiple times: `$DIR/b.rs` error: file is loaded as a module multiple times: `$DIR/b.rs`
--> $DIR/main.rs:3:1 --> $DIR/main.rs:5:1
| |
LL | mod b; LL | mod b;
| ^^^^^^ first loaded here | ^^^^^^ first loaded here
@ -11,7 +11,7 @@ LL | | mod b2;
= help: replace all but one `mod` item with `use` items = help: replace all but one `mod` item with `use` items
error: file is loaded as a module multiple times: `$DIR/c.rs` error: file is loaded as a module multiple times: `$DIR/c.rs`
--> $DIR/main.rs:7:1 --> $DIR/main.rs:9:1
| |
LL | mod c; LL | mod c;
| ^^^^^^ first loaded here | ^^^^^^ first loaded here
@ -25,7 +25,7 @@ LL | | mod c3;
= help: replace all but one `mod` item with `use` items = help: replace all but one `mod` item with `use` items
error: file is loaded as a module multiple times: `$DIR/from_other_module.rs` error: file is loaded as a module multiple times: `$DIR/from_other_module.rs`
--> $DIR/main.rs:13:1 --> $DIR/main.rs:15:1
| |
LL | mod from_other_module; LL | mod from_other_module;
| ^^^^^^^^^^^^^^^^^^^^^^ first loaded here | ^^^^^^^^^^^^^^^^^^^^^^ first loaded here
@ -38,5 +38,16 @@ LL | | mod m;
| |
= help: replace all but one `mod` item with `use` items = help: replace all but one `mod` item with `use` items
error: aborting due to 3 previous errors error: file is loaded as a module multiple times: `$DIR/b.rs`
--> $DIR/main.rs:18:1
|
LL | mod d;
| ^^^^^^ first loaded here
LL | / #[path = "d.rs"]
LL | | mod d2;
| |_______^ loaded again here
|
= help: replace all but one `mod` item with `use` items
error: aborting due to 4 previous errors