about summary refs log tree commit diff
path: root/src/libsyntax_ext
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-12-09 17:31:12 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-12-19 23:17:53 +0300
commit2bc67da378db40b23a426ea6384b2660c29a002c (patch)
treee96b2c51937ae33a44fa349f2abe1a042621358b /src/libsyntax_ext
parent8a8ef260bef994c1e9d3444356fa9f33c01943c1 (diff)
downloadrust-2bc67da378db40b23a426ea6384b2660c29a002c.tar.gz
rust-2bc67da378db40b23a426ea6384b2660c29a002c.zip
proc_macro: Accept `$crate` as an identifier if it comes from the compiler
Diffstat (limited to 'src/libsyntax_ext')
-rw-r--r--src/libsyntax_ext/proc_macro_server.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/libsyntax_ext/proc_macro_server.rs b/src/libsyntax_ext/proc_macro_server.rs
index ea4a8afc0aa..ca960cbe41b 100644
--- a/src/libsyntax_ext/proc_macro_server.rs
+++ b/src/libsyntax_ext/proc_macro_server.rs
@@ -150,6 +150,8 @@ impl FromInternal<(TokenStream, &'_ ParseSess, &'_ mut Vec<Self>)>
             Question => op!('?'),
             SingleQuote => op!('\''),
 
+            Ident(ident, false) if ident.name == keywords::DollarCrate.name() =>
+                tt!(Ident::dollar_crate()),
             Ident(ident, is_raw) => tt!(Ident::new(ident.name, is_raw)),
             Lifetime(ident) => {
                 let ident = ident.without_first_quote();
@@ -359,6 +361,10 @@ impl Ident {
         }
         Ident { sym, is_raw, span }
     }
+    fn dollar_crate(span: Span) -> Ident {
+        // `$crate` is accepted as an ident only if it comes from the compiler.
+        Ident { sym: keywords::DollarCrate.name(), is_raw: false, span }
+    }
 }
 
 // FIXME(eddyb) `Literal` should not expose internal `Debug` impls.