Skip to content

Commit

Permalink
warn on macro_use attr
Browse files Browse the repository at this point in the history
cargo dev update lints

fixed suggestion, check edition, ran `tests/ui/update-all-references.sh`

fixed failing tests with update-references.sh

warn on macro_use attr (issue rust-lang#5179)

fixed suggestion, check edition, ran `tests/ui/update-all-references.sh`

fixed failing tests with update-references.sh

update-references.sh for missing-doc-impl.rs

use if_chain

cargo dev fmt
  • Loading branch information
DevinR528 committed Mar 18, 2020
1 parent 23549a8 commit 1299723
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 35 deletions.
40 changes: 23 additions & 17 deletions clippy_lints/src/macro_use.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use crate::utils::{snippet, span_lint_and_sugg};
use crate::utils::span_lint_and_help;
use if_chain::if_chain;
use rustc_ast::ast;
use rustc_errors::Applicability;
use rustc_lint::{EarlyContext, EarlyLintPass};
use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::edition::Edition;
Expand All @@ -12,21 +11,21 @@ declare_clippy_lint! {
/// **Why is this bad?** Since the Rust 2018 edition you can import
/// macro's directly, this is considered idiomatic.
///
/// **Known problems:** This lint does not generate an auto-applicable suggestion.
/// **Known problems:** None.
///
/// **Example:**
/// ```rust
/// #[macro_use]
/// use lazy_static;
/// ```
pub MACRO_USE_IMPORTS,
pub MACRO_USE_IMPORT,
pedantic,
"#[macro_use] is no longer needed"
}

declare_lint_pass!(MacroUseImports => [MACRO_USE_IMPORTS]);
declare_lint_pass!(MacroUseImport => [MACRO_USE_IMPORT]);

impl EarlyLintPass for MacroUseImports {
impl EarlyLintPass for MacroUseImport {
fn check_item(&mut self, ecx: &EarlyContext<'_>, item: &ast::Item) {
if_chain! {
if ecx.sess.opts.edition == Edition::Edition2018;
Expand All @@ -36,17 +35,24 @@ impl EarlyLintPass for MacroUseImports {
.iter()
.find(|attr| attr.ident().map(|s| s.to_string()) == Some("macro_use".to_string()));
then {
let msg = "`macro_use` attributes are no longer needed in the Rust 2018 edition";
let help = format!("use {}::<macro name>", snippet(ecx, use_tree.span, "_"));
span_lint_and_sugg(
ecx,
MACRO_USE_IMPORTS,
mac_attr.span,
msg,
"remove the attribute and import the macro directly, try",
help,
Applicability::HasPlaceholders,
);
let msg = "`macro_use` attribute's are no longer needed in the Rust 2018 edition";
let help = format!(
"remove the attribute and import the macro directly `use {}::<macro name>`",
use_tree
.clone()
.into_inner()
.prefix
.segments
.iter()
.enumerate()
.map(|(i, s)| if i == 0 {
s.ident.to_string()
} else {
format!("::{}", s.ident)
})
.collect::<String>(),
);
span_lint_and_help(ecx, MACRO_USE_IMPORT, mac_attr.span, msg, &help);
}
}
}
Expand Down
24 changes: 6 additions & 18 deletions tests/ui/declare_interior_mutable_const.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -45,25 +45,19 @@ error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:44:5
|
LL | const INPUT: T;
| ^^^^^^^^^^^^^-^
| |
| consider requiring `T` to be `Copy`
| ^^^^^^^^^^^^^^^

error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:47:5
|
LL | const ASSOC: Self::NonCopyType;
| ^^^^^^^^^^^^^-----------------^
| |
| consider requiring `<Self as Trait<T>>::NonCopyType` to be `Copy`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:51:5
|
LL | const AN_INPUT: T = Self::INPUT;
| ^^^^^^^^^^^^^^^^-^^^^^^^^^^^^^^^
| |
| consider requiring `T` to be `Copy`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:16:9
Expand All @@ -80,9 +74,7 @@ error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:60:5
|
LL | const SELF_2: Self;
| ^^^^^^^^^^^^^^----^
| |
| consider requiring `Self` to be `Copy`
| ^^^^^^^^^^^^^^^^^^^

error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:81:5
Expand All @@ -94,17 +86,13 @@ error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:84:5
|
LL | const U_SELF: U = U::SELF_2;
| ^^^^^^^^^^^^^^-^^^^^^^^^^^^^
| |
| consider requiring `U` to be `Copy`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: a `const` item should never be interior mutable
--> $DIR/declare_interior_mutable_const.rs:87:5
|
LL | const T_ASSOC: T::NonCopyType = T::ASSOC;
| ^^^^^^^^^^^^^^^--------------^^^^^^^^^^^^
| |
| consider requiring `<T as Trait<u32>>::NonCopyType` to be `Copy`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 13 previous errors

11 changes: 11 additions & 0 deletions tests/ui/macro_use_import.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// compile-flags: --edition 2018
#![warn(clippy::macro_use_import)]

use std::collections::HashMap;
#[macro_use]
use std::prelude;

fn main() {
let _ = HashMap::<u8, u8>::new();
println!();
}
11 changes: 11 additions & 0 deletions tests/ui/macro_use_import.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error: `macro_use` attribute's are no longer needed in the Rust 2018 edition
--> $DIR/macro_use_import.rs:5:1
|
LL | #[macro_use]
| ^^^^^^^^^^^^
|
= note: `-D clippy::macro-use-import` implied by `-D warnings`
= help: remove the attribute and import the macro directly `use std::prelude::<macro name>`

error: aborting due to previous error

0 comments on commit 1299723

Please sign in to comment.