diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2018-04-26 12:03:08 -0700 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2018-05-04 11:24:36 -0700 |
| commit | dafbdeb384318227ec9e5117a022447bbd50467b (patch) | |
| tree | e8d0fd0b844e70d95a69f6a7e7c91c5494ff9156 | |
| parent | 0bfe3072cb5d181e4f60bf1033c8d81239a28385 (diff) | |
| download | rust-dafbdeb384318227ec9e5117a022447bbd50467b.tar.gz rust-dafbdeb384318227ec9e5117a022447bbd50467b.zip | |
Add idiom lint for bare extern crate
| -rw-r--r-- | src/librustc_lint/builtin.rs | 63 | ||||
| -rw-r--r-- | src/librustc_lint/lib.rs | 4 |
2 files changed, 66 insertions, 1 deletions
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index f06062fa4ac..d08519d3703 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -1508,3 +1508,66 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedBrokenConst { } } } + +declare_lint! { + pub UNNECESSARY_EXTERN_CRATE, + Allow, + "suggest removing `extern crate` for the 2018 edition" +} + +pub struct ExternCrate(/* depth */ u32); + +impl ExternCrate { + pub fn new() -> Self { + ExternCrate(0) + } +} + +impl LintPass for ExternCrate { + fn get_lints(&self) -> LintArray { + lint_array!(UNNECESSARY_EXTERN_CRATE) + } +} + +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExternCrate { + fn check_item(&mut self, cx: &LateContext, it: &hir::Item) { + if let hir::ItemExternCrate(ref orig) = it.node { + if it.attrs.iter().any(|a| a.check_name("macro_use")) { + return + } + let mut err = cx.struct_span_lint(UNNECESSARY_EXTERN_CRATE, + it.span, "`extern crate` is unnecessary in the new edition"); + if it.vis == hir::Visibility::Public || self.0 > 1 || orig.is_some() { + let pub_ = if it.vis == hir::Visibility::Public { + "pub " + } else { + "" + }; + + let help = format!("use `{}use`", pub_); + + if let Some(orig) = orig { + err.span_suggestion(it.span, &help, + format!("{}use {} as {}", pub_, orig, it.name)); + } else { + err.span_suggestion(it.span, &help, + format!("{}use {}", pub_, it.name)); + } + } else { + err.span_suggestion(it.span, "remove it", "".into()); + } + + err.emit(); + } + } + + fn check_mod(&mut self, _: &LateContext, _: &hir::Mod, + _: Span, _: ast::NodeId) { + self.0 += 1; + } + + fn check_mod_post(&mut self, _: &LateContext, _: &hir::Mod, + _: Span, _: ast::NodeId) { + self.0 += 1; + } +} diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 4f6d23dce6d..39f550a4b45 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -143,6 +143,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { TypeLimits, MissingDoc, MissingDebugImplementations, + ExternCrate, ); add_lint_group!(sess, @@ -180,7 +181,8 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { add_lint_group!(sess, "rust_2018_idioms", BARE_TRAIT_OBJECT, - UNREACHABLE_PUB); + UNREACHABLE_PUB, + UNNECESSARY_EXTERN_CRATE); // Guidelines for creating a future incompatibility lint: // |
