Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement import renaming with _ (RFC 2166)
  • Loading branch information
petrochenkov committed Mar 14, 2018
1 parent fab632f commit 12ac032
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 1 deletion.
18 changes: 18 additions & 0 deletions src/libsyntax/feature_gate.rs
Expand Up @@ -455,6 +455,9 @@ declare_features! (

// Parentheses in patterns
(active, pattern_parentheses, "1.26.0", None, None),

// `use path as _;` and `extern crate c as _;`
(active, underscore_imports, "1.26.0", Some(48216), None),
);

declare_features! (
Expand Down Expand Up @@ -1436,9 +1439,24 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
}
}

fn visit_use_tree(&mut self, use_tree: &'a ast::UseTree, id: NodeId, _nested: bool) {
if let ast::UseTreeKind::Simple(ident) = use_tree.kind {
if ident.name == "_" {
gate_feature_post!(&self, underscore_imports, use_tree.span,
"renaming imports with `_` is unstable");
}
}

visit::walk_use_tree(self, use_tree, id);
}

fn visit_item(&mut self, i: &'a ast::Item) {
match i.node {
ast::ItemKind::ExternCrate(_) => {
if i.ident.name == "_" {
gate_feature_post!(&self, underscore_imports, i.span,
"renaming extern crates with `_` is unstable");
}
if let Some(attr) = attr::find_by_name(&i.attrs[..], "macro_reexport") {
gate_feature_post!(&self, macro_reexport, attr.span,
"macros re-exports are experimental \
Expand Down
6 changes: 5 additions & 1 deletion src/libsyntax/parse/parser.rs
Expand Up @@ -7040,7 +7040,11 @@ impl<'a> Parser<'a> {

fn parse_rename(&mut self) -> PResult<'a, Option<Ident>> {
if self.eat_keyword(keywords::As) {
self.parse_ident().map(Some)
if self.eat(&token::Underscore) {
Ok(Some(Ident::with_empty_ctxt(Symbol::gensym("_"))))
} else {
self.parse_ident().map(Some)
}
} else {
Ok(None)
}
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/feature-gate-underscore-imports.rs
@@ -0,0 +1,14 @@
// 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.

extern crate std as _; //~ ERROR renaming extern crates with `_` is unstable
use std::vec as _; //~ ERROR renaming imports with `_` is unstable

fn main() {}
19 changes: 19 additions & 0 deletions src/test/ui/feature-gate-underscore-imports.stderr
@@ -0,0 +1,19 @@
error[E0658]: renaming extern crates with `_` is unstable (see issue #48216)
--> $DIR/feature-gate-underscore-imports.rs:11:1
|
LL | extern crate std as _; //~ ERROR renaming extern crates with `_` is unstable
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(underscore_imports)] to the crate attributes to enable

error[E0658]: renaming imports with `_` is unstable (see issue #48216)
--> $DIR/feature-gate-underscore-imports.rs:12:5
|
LL | use std::vec as _; //~ ERROR renaming imports with `_` is unstable
| ^^^^^^^^^^^^^
|
= help: add #![feature(underscore_imports)] to the crate attributes to enable

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0658`.
67 changes: 67 additions & 0 deletions src/test/ui/rfc-2166-underscore-imports/basic.rs
@@ -0,0 +1,67 @@
// 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.

// must-compile-successfully

#![feature(underscore_imports)]
#![warn(unused_imports, unused_extern_crates)]

struct S;

mod m {
pub trait Tr1 {
fn tr1_is_in_scope(&self) {}
}
pub trait Tr2 {
fn tr2_is_in_scope(&self) {}
}

impl Tr1 for ::S {}
impl Tr2 for ::S {}
}

mod unused {
use m::Tr1 as _; //~ WARN unused import
use S as _; //~ WARN unused import
extern crate core as _; //~ WARN unused extern crate
}

mod outer {
mod middle {
pub use m::Tr1 as _;
pub use m::Tr2 as _; // OK, no name conflict
struct Tr1; // OK, no name conflict
fn check() {
// Both traits are in scope
::S.tr1_is_in_scope();
::S.tr2_is_in_scope();
}

mod inner {
// `_` imports are fetched by glob imports
use super::*;
fn check() {
// Both traits are in scope
::S.tr1_is_in_scope();
::S.tr2_is_in_scope();
}
}
}

// `_` imports are fetched by glob imports
use self::middle::*;
fn check() {
// Both traits are in scope
::S.tr1_is_in_scope();
::S.tr2_is_in_scope();
}
}

fn main() {}
30 changes: 30 additions & 0 deletions src/test/ui/rfc-2166-underscore-imports/basic.stderr
@@ -0,0 +1,30 @@
warning: unused import: `m::Tr1 as _`
--> $DIR/basic.rs:31:9
|
LL | use m::Tr1 as _; //~ WARN unused import
| ^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/basic.rs:14:9
|
LL | #![warn(unused_imports, unused_extern_crates)]
| ^^^^^^^^^^^^^^

warning: unused import: `S as _`
--> $DIR/basic.rs:32:9
|
LL | use S as _; //~ WARN unused import
| ^^^^^^

warning: unused extern crate
--> $DIR/basic.rs:33:5
|
LL | extern crate core as _; //~ WARN unused extern crate
| ^^^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/basic.rs:14:25
|
LL | #![warn(unused_imports, unused_extern_crates)]
| ^^^^^^^^^^^^^^^^^^^^

0 comments on commit 12ac032

Please sign in to comment.