Fix #[expect]
and #[allow]
for clippy::duplicate_mod
This commit is contained in:
parent
c8b4873cf9
commit
a2810cd277
4 changed files with 48 additions and 6 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue