Change:
Migrated from It's been mentioned/requested multiple times on the that should remove the statements when moving to Rust 2018. One of the big draws of Rust 2018's module system is that all of the "redundant" lines can finally be removed. It took some of the excitement away when I went through all of the steps and still saw them there. I think it will just be a better experience for users to see one of the tangible benefits of this change. As it is right now, they just see the in front of all of their local imports and they might not realize what a nice change the module system updates really are. After I manually removed the 's I did get my satisfying result , but let's give this to users on the first go around. If I understand correctly this should be implemented in the compiler under the lints, rather than itself. cc
I'm moving this forward up on the milestone list due to just having closed in favor of this issue, which was itself on the RC milestone.
Ok so I've some triaging of related lint issues, and I believe the current work items are: A rustfix-fixable suggestion for removing needs to be implemented. The implementation would . Currently the lint suggests switching to simply . While technically correct and handles lots of corner cases, this doesn't achieve the desired goal of actually removing annotations. We can't blanket remove all statements, for example is correctly warned to use a rather than deleting the statement outright. I'm testing out some ideas locally as well.
I believe this should be fixed by , I think the naive solution actually works well!

Discussion:
}; let replacement = visibility_qualified(&item.vis, &base_replacement); tcx.struct_span_lint_node(lint, id, extern_crate.span, msg) <del> .span_suggestion_short(extern_crate.span, &help, replacement) </del> <ins> .span_suggestion_short_with_applicability( extern_crate.span, &help, replacement, Applicability::MachineApplicable, ) </ins> .emit(); } }

<ins> // 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. #[macro_export] macro_rules! foo { () => () } #[macro_export] macro_rules! bar { () => () } </ins>

<ins> // 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. // run-rustfix // edition:2018 // compile-pass // aux-build:remove-extern-crate.rs #![warn(rust_2018_idioms)] use core as another_name; use remove_extern_crate; #[macro_use] extern crate remove_extern_crate as something_else; fn main() { another_name::mem::drop(3); another::foo(); remove_extern_crate::foo!(); bar!(); } mod another { use core; use remove_extern_crate; pub fn foo() { core::mem::drop(4); remove_extern_crate::foo!(); } } </ins>

<ins> // 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. // run-rustfix // edition:2018 // compile-pass // aux-build:remove-extern-crate.rs #![warn(rust_2018_idioms)] extern crate core; extern crate core as another_name; use remove_extern_crate; #[macro_use] extern crate remove_extern_crate as something_else; fn main() { another_name::mem::drop(3); another::foo(); remove_extern_crate::foo!(); bar!(); } mod another { extern crate core; use remove_extern_crate; pub fn foo() { core::mem::drop(4); remove_extern_crate::foo!(); } } </ins>

<ins> warning: unused extern crate --> $DIR/remove-extern-crate.rs:18:1 | LL | extern crate core; | ^^^^^^^^^^^^^^^^^^ help: remove it | note: lint level defined here --> $DIR/remove-extern-crate.rs:16:9 | LL | #![warn(rust_2018_idioms)] |         ^^^^^^^^^^^^^^^^ = note: #[warn(unused_extern_crates)] implied by #[warn(rust_2018_idioms)] warning: `extern crate` is not idiomatic in the new edition --> $DIR/remove-extern-crate.rs:19:1 | LL | extern crate core as another_name; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use` warning: `extern crate` is not idiomatic in the new edition --> $DIR/remove-extern-crate.rs:32:5 | LL |     extern crate core; |     ^^^^^^^^^^^^^^^^^^ help: convert it to a `use` </ins>