suggest adding a #[cfg(test)]
to test modules
remove a empty line import `module_to_string` use `contains("test")` show a suggestion in case module starts_with/ends_with "test" replace `parent` with `containing`
This commit is contained in:
parent
3ee016ae4d
commit
6f8ad6d83a
@ -671,7 +671,7 @@ pub trait LintContext: Sized {
|
|||||||
BuiltinLintDiagnostics::UnknownCrateTypes(span, note, sugg) => {
|
BuiltinLintDiagnostics::UnknownCrateTypes(span, note, sugg) => {
|
||||||
db.span_suggestion(span, ¬e, sugg, Applicability::MaybeIncorrect);
|
db.span_suggestion(span, ¬e, sugg, Applicability::MaybeIncorrect);
|
||||||
}
|
}
|
||||||
BuiltinLintDiagnostics::UnusedImports(message, replaces) => {
|
BuiltinLintDiagnostics::UnusedImports(message, replaces, in_test_module) => {
|
||||||
if !replaces.is_empty() {
|
if !replaces.is_empty() {
|
||||||
db.tool_only_multipart_suggestion(
|
db.tool_only_multipart_suggestion(
|
||||||
&message,
|
&message,
|
||||||
@ -679,6 +679,14 @@ pub trait LintContext: Sized {
|
|||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(span) = in_test_module {
|
||||||
|
let def_span = self.sess().source_map().guess_head_span(span);
|
||||||
|
db.span_help(
|
||||||
|
span.shrink_to_lo().to(def_span),
|
||||||
|
"consider adding a `#[cfg(test)]` to the containing module",
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BuiltinLintDiagnostics::RedundantImport(spans, ident) => {
|
BuiltinLintDiagnostics::RedundantImport(spans, ident) => {
|
||||||
for (span, is_imported) in spans {
|
for (span, is_imported) in spans {
|
||||||
|
@ -290,7 +290,7 @@ pub enum BuiltinLintDiagnostics {
|
|||||||
ProcMacroDeriveResolutionFallback(Span),
|
ProcMacroDeriveResolutionFallback(Span),
|
||||||
MacroExpandedMacroExportsAccessedByAbsolutePaths(Span),
|
MacroExpandedMacroExportsAccessedByAbsolutePaths(Span),
|
||||||
UnknownCrateTypes(Span, String, String),
|
UnknownCrateTypes(Span, String, String),
|
||||||
UnusedImports(String, Vec<(Span, String)>),
|
UnusedImports(String, Vec<(Span, String)>, Option<Span>),
|
||||||
RedundantImport(Vec<(Span, bool)>, Ident),
|
RedundantImport(Vec<(Span, bool)>, Ident),
|
||||||
DeprecatedMacro(Option<Symbol>, Span),
|
DeprecatedMacro(Option<Symbol>, Span),
|
||||||
MissingAbi(Span, Abi),
|
MissingAbi(Span, Abi),
|
||||||
|
@ -108,7 +108,7 @@ impl<'a> Resolver<'a> {
|
|||||||
/// Reachable macros with block module parents exist due to `#[macro_export] macro_rules!`,
|
/// Reachable macros with block module parents exist due to `#[macro_export] macro_rules!`,
|
||||||
/// but they cannot use def-site hygiene, so the assumption holds
|
/// but they cannot use def-site hygiene, so the assumption holds
|
||||||
/// (<https://github.com/rust-lang/rust/pull/77984#issuecomment-712445508>).
|
/// (<https://github.com/rust-lang/rust/pull/77984#issuecomment-712445508>).
|
||||||
fn get_nearest_non_block_module(&mut self, mut def_id: DefId) -> Module<'a> {
|
crate fn get_nearest_non_block_module(&mut self, mut def_id: DefId) -> Module<'a> {
|
||||||
loop {
|
loop {
|
||||||
match self.get_module(def_id) {
|
match self.get_module(def_id) {
|
||||||
Some(module) => return module,
|
Some(module) => return module,
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
// in the last step
|
// in the last step
|
||||||
|
|
||||||
use crate::imports::ImportKind;
|
use crate::imports::ImportKind;
|
||||||
|
use crate::module_to_string;
|
||||||
use crate::Resolver;
|
use crate::Resolver;
|
||||||
|
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
@ -314,12 +315,29 @@ impl Resolver<'_> {
|
|||||||
"remove the unused import"
|
"remove the unused import"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let parent_module = visitor.r.get_nearest_non_block_module(
|
||||||
|
visitor.r.local_def_id(unused.use_tree_id).to_def_id(),
|
||||||
|
);
|
||||||
|
let test_module_span = match module_to_string(parent_module) {
|
||||||
|
Some(module)
|
||||||
|
if module == "test"
|
||||||
|
|| module == "tests"
|
||||||
|
|| module.starts_with("test_")
|
||||||
|
|| module.starts_with("tests_")
|
||||||
|
|| module.ends_with("_test")
|
||||||
|
|| module.ends_with("_tests") =>
|
||||||
|
{
|
||||||
|
Some(parent_module.span)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
visitor.r.lint_buffer.buffer_lint_with_diagnostic(
|
visitor.r.lint_buffer.buffer_lint_with_diagnostic(
|
||||||
UNUSED_IMPORTS,
|
UNUSED_IMPORTS,
|
||||||
unused.use_tree_id,
|
unused.use_tree_id,
|
||||||
ms,
|
ms,
|
||||||
&msg,
|
&msg,
|
||||||
BuiltinLintDiagnostics::UnusedImports(fix_msg.into(), fixes),
|
BuiltinLintDiagnostics::UnusedImports(fix_msg.into(), fixes, test_module_span),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
64
src/test/ui/imports/unused-imports-in-test-module.rs
Normal file
64
src/test/ui/imports/unused-imports-in-test-module.rs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#![deny(unused_imports)]
|
||||||
|
|
||||||
|
use std::io::BufRead; //~ ERROR unused import: `std::io::BufRead`
|
||||||
|
|
||||||
|
fn a() {}
|
||||||
|
fn b() {}
|
||||||
|
|
||||||
|
mod test {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod test_a {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod a_test {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests_a {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod a_tests {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod fastest_search {
|
||||||
|
use super::a; //~ ERROR unused import: `super::a`
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
use crate::b; //~ ERROR unused import: `crate::b`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
170
src/test/ui/imports/unused-imports-in-test-module.stderr
Normal file
170
src/test/ui/imports/unused-imports-in-test-module.stderr
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
error: unused import: `std::io::BufRead`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:3:5
|
||||||
|
|
|
||||||
|
LL | use std::io::BufRead;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:1:9
|
||||||
|
|
|
||||||
|
LL | #![deny(unused_imports)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:9:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:8:1
|
||||||
|
|
|
||||||
|
LL | mod test {
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:12:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:8:1
|
||||||
|
|
|
||||||
|
LL | mod test {
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:17:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:16:1
|
||||||
|
|
|
||||||
|
LL | mod tests {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:20:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:16:1
|
||||||
|
|
|
||||||
|
LL | mod tests {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:25:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:24:1
|
||||||
|
|
|
||||||
|
LL | mod test_a {
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:28:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:24:1
|
||||||
|
|
|
||||||
|
LL | mod test_a {
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:33:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:32:1
|
||||||
|
|
|
||||||
|
LL | mod a_test {
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:36:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:32:1
|
||||||
|
|
|
||||||
|
LL | mod a_test {
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:41:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:40:1
|
||||||
|
|
|
||||||
|
LL | mod tests_a {
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:44:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:40:1
|
||||||
|
|
|
||||||
|
LL | mod tests_a {
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:49:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:48:1
|
||||||
|
|
|
||||||
|
LL | mod a_tests {
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:52:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
help: consider adding a `#[cfg(test)]` to the containing module
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:48:1
|
||||||
|
|
|
||||||
|
LL | mod a_tests {
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `super::a`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:57:9
|
||||||
|
|
|
||||||
|
LL | use super::a;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: unused import: `crate::b`
|
||||||
|
--> $DIR/unused-imports-in-test-module.rs:60:13
|
||||||
|
|
|
||||||
|
LL | use crate::b;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 15 previous errors
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user