]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Lint against `#[macro_use]` in 2018 idioms
authorAlex Crichton <alex@alexcrichton.com>
Wed, 11 Jul 2018 21:25:29 +0000 (14:25 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 12 Jul 2018 21:10:39 +0000 (14:10 -0700)
This commit adds a lint to the compiler to warn against the `#[macro_use]`
directive as part of the `rust_2018_idioms` lint. This lint is turned off by
default and is only enabled when the `use_extern_macros` feature is also
enabled.

The lint here isn't fully fleshed out as it's just a simple warning rather than
suggestions of how to actually import the macro, but hopefully it's a good base
to start from!

cc #52043

src/librustc/lint/builtin.rs
src/librustc_lint/lib.rs
src/librustc_resolve/check_unused.rs
src/test/ui/rust-2018/auxiliary/macro-use-warned-against.rs [new file with mode: 0644]
src/test/ui/rust-2018/auxiliary/macro-use-warned-against2.rs [new file with mode: 0644]
src/test/ui/rust-2018/macro-use-warned-against.rs [new file with mode: 0644]
src/test/ui/rust-2018/macro-use-warned-against.stderr [new file with mode: 0644]

index efc2d9311c1dcbe67ee58d39cc4d14e7e2da43a7..a46b31206224732568d9094dacb59c764fe8aff2 100644 (file)
     "detects proc macro derives using inaccessible names from parent modules"
 }
 
+declare_lint! {
+    pub MACRO_USE_EXTERN_CRATE,
+    Allow,
+    "the `#[macro_use]` attribute is now deprecated in favor of using macros \
+     via the module system"
+}
+
 /// Does nothing as a lint pass, but registers some `Lint`s
 /// which are used by other parts of the compiler.
 #[derive(Copy, Clone)]
@@ -379,6 +386,7 @@ fn get_lints(&self) -> LintArray {
             INTRA_DOC_LINK_RESOLUTION_FAILURE,
             WHERE_CLAUSES_OBJECT_SAFETY,
             PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
+            MACRO_USE_EXTERN_CRATE,
         )
     }
 }
index 359b056b5a2d1f5da0fe7e14e6cbeb10e31c14a1..5348a47eed628cd080f8d5dda578d29ba8e0328d 100644 (file)
@@ -43,6 +43,7 @@
 use rustc::lint;
 use rustc::lint::{LateContext, LateLintPass, LintPass, LintArray};
 use rustc::lint::builtin::{BARE_TRAIT_OBJECTS, ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE};
+use rustc::lint::builtin::MACRO_USE_EXTERN_CRATE;
 use rustc::session;
 use rustc::util;
 use rustc::hir;
@@ -179,6 +180,7 @@ macro_rules! add_lint_group {
                     BARE_TRAIT_OBJECTS,
                     UNREACHABLE_PUB,
                     UNUSED_EXTERN_CRATES,
+                    MACRO_USE_EXTERN_CRATE,
                     ELLIPSIS_INCLUSIVE_RANGE_PATTERNS);
 
     // Guidelines for creating a future incompatibility lint:
index 0c4b9a546cbd18617a52bdb3d9f670d08638f985..ef24a201e0f5b2fe668307ec7409a7f24e58344d 100644 (file)
@@ -129,7 +129,22 @@ pub fn check_crate(resolver: &mut Resolver, krate: &ast::Crate) {
         match directive.subclass {
             _ if directive.used.get() ||
                  directive.vis.get() == ty::Visibility::Public ||
-                 directive.span.is_dummy() => {}
+                 directive.span.is_dummy() => {
+                if let ImportDirectiveSubclass::MacroUse = directive.subclass {
+                    if resolver.session.features_untracked().use_extern_macros &&
+                        !directive.span.is_dummy() {
+                        resolver.session.buffer_lint(
+                            lint::builtin::MACRO_USE_EXTERN_CRATE,
+                            directive.id,
+                            directive.span,
+                            "deprecated `#[macro_use]` directive used to \
+                             import macros should be replaced at use sites \
+                             with a `use` statement to import the macro \
+                             instead",
+                        );
+                    }
+                }
+            }
             ImportDirectiveSubclass::ExternCrate(_) => {
                 resolver.maybe_unused_extern_crates.push((directive.id, directive.span));
             }
diff --git a/src/test/ui/rust-2018/auxiliary/macro-use-warned-against.rs b/src/test/ui/rust-2018/auxiliary/macro-use-warned-against.rs
new file mode 100644 (file)
index 0000000..9487fd8
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#[macro_export]
+macro_rules! foo { () => () }
diff --git a/src/test/ui/rust-2018/auxiliary/macro-use-warned-against2.rs b/src/test/ui/rust-2018/auxiliary/macro-use-warned-against2.rs
new file mode 100644 (file)
index 0000000..6391db8
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
diff --git a/src/test/ui/rust-2018/macro-use-warned-against.rs b/src/test/ui/rust-2018/macro-use-warned-against.rs
new file mode 100644 (file)
index 0000000..f7a6b56
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:macro-use-warned-against.rs
+// aux-build:macro-use-warned-against2.rs
+// compile-pass
+
+#![warn(rust_2018_idioms, unused)]
+#![feature(use_extern_macros)]
+
+#[macro_use] //~ WARN should be replaced at use sites with a `use` statement
+extern crate macro_use_warned_against;
+#[macro_use] //~ WARN unused `#[macro_use]`
+extern crate macro_use_warned_against2;
+
+fn main() {
+    foo!();
+}
diff --git a/src/test/ui/rust-2018/macro-use-warned-against.stderr b/src/test/ui/rust-2018/macro-use-warned-against.stderr
new file mode 100644 (file)
index 0000000..bebad31
--- /dev/null
@@ -0,0 +1,26 @@
+warning: deprecated `#[macro_use]` directive used to import macros should be replaced at use sites with a `use` statement to import the macro instead
+  --> $DIR/macro-use-warned-against.rs:18:1
+   |
+LL | #[macro_use] //~ WARN should be replaced at use sites with a `use` statement
+   | ^^^^^^^^^^^^
+   |
+note: lint level defined here
+  --> $DIR/macro-use-warned-against.rs:15:9
+   |
+LL | #![warn(rust_2018_idioms, unused)]
+   |         ^^^^^^^^^^^^^^^^
+   = note: #[warn(macro_use_extern_crate)] implied by #[warn(rust_2018_idioms)]
+
+warning: unused `#[macro_use]` import
+  --> $DIR/macro-use-warned-against.rs:20:1
+   |
+LL | #[macro_use] //~ WARN unused `#[macro_use]`
+   | ^^^^^^^^^^^^
+   |
+note: lint level defined here
+  --> $DIR/macro-use-warned-against.rs:15:27
+   |
+LL | #![warn(rust_2018_idioms, unused)]
+   |                           ^^^^^^
+   = note: #[warn(unused_imports)] implied by #[warn(unused)]
+