Rollup merge of #48922 - petrochenkov:asunder, r=nikomatsakis
Implement import renaming with `_` (RFC 2166) cc https://github.com/rust-lang/rust/issues/48216
This commit is contained in:
commit
e1d19df9a5
@ -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! (
|
||||
@ -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 \
|
||||
|
@ -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)
|
||||
}
|
||||
|
14
src/test/ui/feature-gate-underscore-imports.rs
Normal file
14
src/test/ui/feature-gate-underscore-imports.rs
Normal file
@ -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
src/test/ui/feature-gate-underscore-imports.stderr
Normal file
19
src/test/ui/feature-gate-underscore-imports.stderr
Normal file
@ -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
src/test/ui/rfc-2166-underscore-imports/basic.rs
Normal file
67
src/test/ui/rfc-2166-underscore-imports/basic.rs
Normal file
@ -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
src/test/ui/rfc-2166-underscore-imports/basic.stderr
Normal file
30
src/test/ui/rfc-2166-underscore-imports/basic.stderr
Normal file
@ -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)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
Loading…
x
Reference in New Issue
Block a user