diff options
| author | bors <bors@rust-lang.org> | 2018-12-01 12:45:52 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-12-01 12:45:52 +0000 |
| commit | d311571906bd2b22e206b9a84ccb888e248820df (patch) | |
| tree | 15de266b8c52d7b39700d344996438d3433dc66b /src/libsyntax/parse | |
| parent | d3ed34824c31f303b98855fee6fc9213dff1f295 (diff) | |
| parent | 549bd45e9eb13e501416e17887b65ad4189ebe6b (diff) | |
| download | rust-d311571906bd2b22e206b9a84ccb888e248820df.tar.gz rust-d311571906bd2b22e206b9a84ccb888e248820df.zip | |
Auto merge of #55275 - petrochenkov:extself, r=eddyb
experiment: Support aliasing local crate root in extern prelude This PR provides some minimally invasive solution for the 2018 edition migration issue described in https://github.com/rust-lang/rust/issues/54647 and affecting proc macro crates. `extern crate NAME as RENAME;` now accepts `NAME`=`self` and interprets it as referring to the local crate. As with other `extern crate` items, `RENAME` in this case gets into extern prelude in accordance with https://github.com/rust-lang/rust/pull/54658, thus resolving https://github.com/rust-lang/rust/issues/54647. ```rust extern crate self as serde; // Adds local crate to extern prelude as `serde` ``` This solution doesn't introduce any new syntax and has minimal maintenance cost, so it can be easily deprecated if something better is found in the future. Closes https://github.com/rust-lang/rust/issues/54647
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f13bb7df0b4..33715f206de 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6783,7 +6783,11 @@ impl<'a> Parser<'a> { let error_msg = "crate name using dashes are not valid in `extern crate` statements"; let suggestion_msg = "if the original crate name uses dashes you need to use underscores \ in the code"; - let mut ident = self.parse_ident()?; + let mut ident = if self.token.is_keyword(keywords::SelfValue) { + self.parse_path_segment_ident() + } else { + self.parse_ident() + }?; let mut idents = vec![]; let mut replacement = vec![]; let mut fixed_crate_name = false; |
