diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-12-06 10:50:55 -0800 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-12-09 17:22:07 -0800 |
| commit | 9c7969d3df6ce1cd5370eea32f18a08dc1f0850d (patch) | |
| tree | cb7d5f2d7ed8deaba3a2320a0ea8a4cc1000b600 /src/libsyntax | |
| parent | 8db163e53dab4f188a60bf24b4d6ebeb1ea5cab1 (diff) | |
| download | rust-9c7969d3df6ce1cd5370eea32f18a08dc1f0850d.tar.gz rust-9c7969d3df6ce1cd5370eea32f18a08dc1f0850d.zip | |
Use hygiene to access the injected crate (`core` or `std`) from builtin macros.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 15 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/test.rs | 3 |
4 files changed, 11 insertions, 14 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 6c96692f719..bb1b7da7dba 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -21,10 +21,11 @@ use fold::{self, Folder}; use parse::{self, parser, DirectoryOwnership}; use parse::token; use ptr::P; -use symbol::Symbol; +use symbol::{keywords, Ident, Symbol}; use util::small_vector::SmallVector; use std::collections::HashMap; +use std::iter; use std::path::PathBuf; use std::rc::Rc; use std::default::Default; @@ -664,7 +665,6 @@ pub struct ExpansionData { pub struct ExtCtxt<'a> { pub parse_sess: &'a parse::ParseSess, pub ecfg: expand::ExpansionConfig<'a>, - pub crate_root: Option<&'static str>, pub root_path: PathBuf, pub resolver: &'a mut Resolver, pub resolve_err_count: usize, @@ -680,7 +680,6 @@ impl<'a> ExtCtxt<'a> { ExtCtxt { parse_sess, ecfg, - crate_root: None, root_path: PathBuf::new(), resolver, resolve_err_count: 0, @@ -822,12 +821,10 @@ impl<'a> ExtCtxt<'a> { ast::Ident::from_str(st) } pub fn std_path(&self, components: &[&str]) -> Vec<ast::Ident> { - let mut v = Vec::new(); - if let Some(s) = self.crate_root { - v.push(self.ident_of(s)); - } - v.extend(components.iter().map(|s| self.ident_of(s))); - v + let def_site = SyntaxContext::empty().apply_mark(self.current_expansion.mark); + iter::once(Ident { ctxt: def_site, ..keywords::DollarCrate.ident() }) + .chain(components.iter().map(|s| self.ident_of(s))) + .collect() } pub fn name_of(&self, st: &str) -> ast::Name { Symbol::intern(st) diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 25eef6db930..82e7747b014 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -319,9 +319,12 @@ impl<'a> AstBuilder for ExtCtxt<'a> { types: Vec<P<ast::Ty>>, bindings: Vec<ast::TypeBinding> ) -> ast::Path { + use syntax::parse::token; + let last_identifier = idents.pop().unwrap(); let mut segments: Vec<ast::PathSegment> = Vec::new(); - if global { + if global && + !idents.first().map_or(false, |&ident| token::Ident(ident).is_path_segment_keyword()) { segments.push(ast::PathSegment::crate_root(span)); } diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 0d1b1c65a29..ecb396f259f 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -25,7 +25,6 @@ use parse::{DirectoryOwnership, PResult}; use parse::token::{self, Token}; use parse::parser::Parser; use ptr::P; -use std_inject; use symbol::Symbol; use symbol::keywords; use syntax_pos::{Span, DUMMY_SP}; @@ -219,7 +218,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { } pub fn expand_crate(&mut self, mut krate: ast::Crate) -> ast::Crate { - self.cx.crate_root = std_inject::injected_crate_name(&krate); let mut module = ModuleData { mod_path: vec![Ident::from_str(&self.cx.ecfg.crate_name)], directory: self.cx.codemap().span_to_unmapped_path(krate.span), diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs index a4ac5826f99..9f097169d97 100644 --- a/src/libsyntax/test.rs +++ b/src/libsyntax/test.rs @@ -272,7 +272,7 @@ fn generate_test_harness(sess: &ParseSess, let mark = Mark::fresh(Mark::root()); - let mut cx: TestCtxt = TestCtxt { + let cx = TestCtxt { span_diagnostic: sd, ext_cx: ExtCtxt::new(sess, ExpansionConfig::default("test".to_string()), resolver), path: Vec::new(), @@ -283,7 +283,6 @@ fn generate_test_harness(sess: &ParseSess, toplevel_reexport: None, ctxt: SyntaxContext::empty().apply_mark(mark), }; - cx.ext_cx.crate_root = Some("std"); mark.set_expn_info(ExpnInfo { call_site: DUMMY_SP, |
