From d5010ecf4465f587a50f7572f0ea8204ac5e6378 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 23 May 2018 19:25:59 -0400 Subject: [PATCH] extend `unused_extern_crates` lint with a suggestion to remove --- src/librustc_typeck/check_unused.rs | 4 ++- .../extern-crate-idiomatic-in-2018.fixed | 36 +++++++++++++++++++ .../extern-crate-idiomatic-in-2018.rs | 36 +++++++++++++++++++ .../extern-crate-idiomatic-in-2018.stderr | 14 ++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.fixed create mode 100644 src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.rs create mode 100644 src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.stderr diff --git a/src/librustc_typeck/check_unused.rs b/src/librustc_typeck/check_unused.rs index bff849d7ae8..b5772df1306 100644 --- a/src/librustc_typeck/check_unused.rs +++ b/src/librustc_typeck/check_unused.rs @@ -109,6 +109,8 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { let id = tcx.hir.hir_to_node_id(hir_id); let lint = lint::builtin::UNUSED_EXTERN_CRATES; let msg = "unused extern crate"; - tcx.lint_node(lint, id, span, msg); + tcx.struct_span_lint_node(lint, id, span, msg) + .span_suggestion_short(span, "remove it", "".to_string()) + .emit(); } } diff --git a/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.fixed b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.fixed new file mode 100644 index 00000000000..d8bf656cf2d --- /dev/null +++ b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.fixed @@ -0,0 +1,36 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:edition-lint-paths.rs +// run-rustfix +// compile-flags:--edition 2018 + +// The "normal case". Ideally we would remove the `extern crate` here, +// but we don't. + +#![feature(rust_2018_preview)] +#![deny(absolute_path_not_starting_with_crate)] +#![deny(unused_extern_crates)] +#![allow(dead_code)] + + +//~^ ERROR unused extern crate + +extern crate edition_lint_paths as bar; + +fn main() { + // This is not considered to *use* the `extern crate` in Rust 2018: + use edition_lint_paths::foo; + foo(); + + // But this should be a use of the (renamed) crate: + crate::bar::foo(); +} + diff --git a/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.rs b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.rs new file mode 100644 index 00000000000..6e741257d80 --- /dev/null +++ b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.rs @@ -0,0 +1,36 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:edition-lint-paths.rs +// run-rustfix +// compile-flags:--edition 2018 + +// The "normal case". Ideally we would remove the `extern crate` here, +// but we don't. + +#![feature(rust_2018_preview)] +#![deny(absolute_path_not_starting_with_crate)] +#![deny(unused_extern_crates)] +#![allow(dead_code)] + +extern crate edition_lint_paths; +//~^ ERROR unused extern crate + +extern crate edition_lint_paths as bar; + +fn main() { + // This is not considered to *use* the `extern crate` in Rust 2018: + use edition_lint_paths::foo; + foo(); + + // But this should be a use of the (renamed) crate: + crate::bar::foo(); +} + diff --git a/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.stderr b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.stderr new file mode 100644 index 00000000000..8fae69e8bd5 --- /dev/null +++ b/src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.stderr @@ -0,0 +1,14 @@ +error: unused extern crate + --> $DIR/extern-crate-idiomatic-in-2018.rs:23:1 + | +LL | extern crate edition_lint_paths; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove it + | +note: lint level defined here + --> $DIR/extern-crate-idiomatic-in-2018.rs:20:9 + | +LL | #![deny(unused_extern_crates)] + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error +