Auto merge of #51015 - nikomatsakis:issue-50672-remove-extern-crate-idiom, r=alexcrichton
merge unused-extern-crate and unnecessary-extern-crate lints Extend the `unused_extern_crates` lint to offer a suggestion to remove the extern crate and remove the `unnecessary_extern_crate` lint. Still a few minor issues to fix: - [x] this *does* now leave a blank line... (defer to https://github.com/rust-lang/rust/issues/51176) - idea: extend the span to be replaced by 1 character if the next character is a `\n` - [x] what about macros? do we need to watch out for that? (defer to https://github.com/rust-lang/rust/issues/48704) - [x] also it doesn't work for `extern crate foo; fn main() { foo::bar(); }` - this is subtle: the `foo` might be shadowing a glob import too, can't always remove - defer to https://github.com/rust-lang/rust/issues/51177 - [x] we also don't do the `pub use` rewrite thang (https://github.com/rust-lang/rust/issues/51013) Spun off from https://github.com/rust-lang/rust/pull/51010 Fixes #50672 r? @alexcrichton
This commit is contained in:
commit
1b3d737716
19 changed files with 429 additions and 210 deletions
|
@ -2433,7 +2433,7 @@ impl<'a> LoweringContext<'a> {
|
|||
self.with_hir_id_owner(new_id, |this| {
|
||||
let vis = match vis {
|
||||
hir::Visibility::Public => hir::Visibility::Public,
|
||||
hir::Visibility::Crate => hir::Visibility::Crate,
|
||||
hir::Visibility::Crate(sugar) => hir::Visibility::Crate(sugar),
|
||||
hir::Visibility::Inherited => hir::Visibility::Inherited,
|
||||
hir::Visibility::Restricted { ref path, id: _ } => {
|
||||
hir::Visibility::Restricted {
|
||||
|
@ -3704,7 +3704,7 @@ impl<'a> LoweringContext<'a> {
|
|||
) -> hir::Visibility {
|
||||
match v.node {
|
||||
VisibilityKind::Public => hir::Public,
|
||||
VisibilityKind::Crate(..) => hir::Visibility::Crate,
|
||||
VisibilityKind::Crate(sugar) => hir::Visibility::Crate(sugar),
|
||||
VisibilityKind::Restricted { ref path, id, .. } => hir::Visibility::Restricted {
|
||||
path: P(self.lower_path(id, path, ParamMode::Explicit)),
|
||||
id: if let Some(owner) = explicit_owner {
|
||||
|
|
|
@ -463,7 +463,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
|
|||
fn visit_vis(&mut self, visibility: &'hir Visibility) {
|
||||
match *visibility {
|
||||
Visibility::Public |
|
||||
Visibility::Crate |
|
||||
Visibility::Crate(_) |
|
||||
Visibility::Inherited => {}
|
||||
Visibility::Restricted { id, .. } => {
|
||||
self.insert(id, NodeVisibility(visibility));
|
||||
|
|
|
@ -35,7 +35,7 @@ use mir::mono::Linkage;
|
|||
use syntax_pos::{Span, DUMMY_SP};
|
||||
use syntax::codemap::{self, Spanned};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
use syntax::ast::{self, Ident, Name, NodeId, DUMMY_NODE_ID, AsmDialect};
|
||||
use syntax::ast::{self, CrateSugar, Ident, Name, NodeId, DUMMY_NODE_ID, AsmDialect};
|
||||
use syntax::ast::{Attribute, Lit, StrStyle, FloatTy, IntTy, UintTy, MetaItem};
|
||||
use syntax::attr::InlineAttr;
|
||||
use syntax::ext::hygiene::SyntaxContext;
|
||||
|
@ -1953,7 +1953,7 @@ pub struct PolyTraitRef {
|
|||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||
pub enum Visibility {
|
||||
Public,
|
||||
Crate,
|
||||
Crate(CrateSugar),
|
||||
Restricted { path: P<Path>, id: NodeId },
|
||||
Inherited,
|
||||
}
|
||||
|
@ -1964,7 +1964,7 @@ impl Visibility {
|
|||
match self {
|
||||
&Public |
|
||||
&Inherited => false,
|
||||
&Crate |
|
||||
&Crate(_) |
|
||||
&Restricted { .. } => true,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -801,15 +801,25 @@ impl<'a> State<'a> {
|
|||
|
||||
pub fn print_visibility(&mut self, vis: &hir::Visibility) -> io::Result<()> {
|
||||
match *vis {
|
||||
hir::Public => self.word_nbsp("pub"),
|
||||
hir::Visibility::Crate => self.word_nbsp("pub(crate)"),
|
||||
hir::Public => self.word_nbsp("pub")?,
|
||||
hir::Visibility::Crate(ast::CrateSugar::JustCrate) => self.word_nbsp("crate")?,
|
||||
hir::Visibility::Crate(ast::CrateSugar::PubCrate) => self.word_nbsp("pub(crate)")?,
|
||||
hir::Visibility::Restricted { ref path, .. } => {
|
||||
self.s.word("pub(")?;
|
||||
self.print_path(path, false)?;
|
||||
self.word_nbsp(")")
|
||||
if path.segments.len() == 1 && path.segments[0].name == keywords::Super.name() {
|
||||
// Special case: `super` can print like `pub(super)`.
|
||||
self.s.word("super")?;
|
||||
} else {
|
||||
// Everything else requires `in` at present.
|
||||
self.word_nbsp("in")?;
|
||||
self.print_path(path, false)?;
|
||||
}
|
||||
self.word_nbsp(")")?;
|
||||
}
|
||||
hir::Inherited => Ok(()),
|
||||
hir::Inherited => ()
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn print_defaultness(&mut self, defaultness: hir::Defaultness) -> io::Result<()> {
|
||||
|
|
|
@ -751,6 +751,11 @@ impl_stable_hash_for!(enum hir::ImplItemKind {
|
|||
Type(t)
|
||||
});
|
||||
|
||||
impl_stable_hash_for!(enum ::syntax::ast::CrateSugar {
|
||||
JustCrate,
|
||||
PubCrate,
|
||||
});
|
||||
|
||||
impl<'a> HashStable<StableHashingContext<'a>> for hir::Visibility {
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
hcx: &mut StableHashingContext<'a>,
|
||||
|
@ -758,10 +763,12 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::Visibility {
|
|||
mem::discriminant(self).hash_stable(hcx, hasher);
|
||||
match *self {
|
||||
hir::Visibility::Public |
|
||||
hir::Visibility::Crate |
|
||||
hir::Visibility::Inherited => {
|
||||
// No fields to hash.
|
||||
}
|
||||
hir::Visibility::Crate(sugar) => {
|
||||
sugar.hash_stable(hcx, hasher);
|
||||
}
|
||||
hir::Visibility::Restricted { ref path, id } => {
|
||||
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
|
||||
id.hash_stable(hcx, hasher);
|
||||
|
|
|
@ -270,7 +270,7 @@ impl Visibility {
|
|||
pub fn from_hir(visibility: &hir::Visibility, id: NodeId, tcx: TyCtxt) -> Self {
|
||||
match *visibility {
|
||||
hir::Public => Visibility::Public,
|
||||
hir::Visibility::Crate => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
|
||||
hir::Visibility::Crate(_) => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
|
||||
hir::Visibility::Restricted { ref path, .. } => match path.def {
|
||||
// If there is no resolution, `resolve` will have already reported an error, so
|
||||
// assume that the visibility is public to avoid reporting more privacy errors.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue