diff options
| author | bors <bors@rust-lang.org> | 2017-12-13 11:09:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-12-13 11:09:55 +0000 |
| commit | 3dfbc88a626625be01e112da11ec367e2fc71bb3 (patch) | |
| tree | 3123349d2f450ac5317944d5f5803b20c3eca65b /src/libsyntax_pos | |
| parent | 61100840e5c978a99b0489e8eaa922da06c05f65 (diff) | |
| parent | 85d19b33357897c51d80727a4208f46b19c5c5a6 (diff) | |
| download | rust-3dfbc88a626625be01e112da11ec367e2fc71bb3.tar.gz rust-3dfbc88a626625be01e112da11ec367e2fc71bb3.zip | |
Auto merge of #46550 - jseyfried:cleanup_builtin_hygiene, r=nrc
macros: hygienize use of `core`/`std` in builtin macros Today, if a builtin macro wants to access an item from `core` or `std` (depending `#![no_std]`), it generates `::core::path::to::item` or `::std::path::to::item` respectively (c.f. `fn std_path()` in `libsyntax/ext/base.rs`). This PR refactors the builtin macros to instead always emit `$crate::path::to::item` here. That is, the def site of builtin macros is taken to be in `extern crate core;` or `extern crate std;`. Since builtin macros are macros 1.0 (i.e. mostly unhygienic), changing the def site can only effect the resolution of `$crate`. r? @nrc
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 9358e654a9f..ab6c3f7d62d 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -27,7 +27,7 @@ use std::fmt; #[derive(Clone, Copy, PartialEq, Eq, Default, PartialOrd, Ord, Hash)] pub struct SyntaxContext(pub(super) u32); -#[derive(Copy, Clone, Default)] +#[derive(Copy, Clone)] pub struct SyntaxContextData { pub outer_mark: Mark, pub prev_ctxt: SyntaxContext, @@ -35,20 +35,26 @@ pub struct SyntaxContextData { } /// A mark is a unique id associated with a macro expansion. -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default, RustcEncodable, RustcDecodable)] +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, RustcEncodable, RustcDecodable)] pub struct Mark(u32); -#[derive(Default)] struct MarkData { parent: Mark, - modern: bool, + kind: MarkKind, expn_info: Option<ExpnInfo>, } +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum MarkKind { + Modern, + Builtin, + Legacy, +} + impl Mark { pub fn fresh(parent: Mark) -> Self { HygieneData::with(|data| { - data.marks.push(MarkData { parent: parent, modern: false, expn_info: None }); + data.marks.push(MarkData { parent: parent, kind: MarkKind::Legacy, expn_info: None }); Mark(data.marks.len() as u32 - 1) }) } @@ -77,7 +83,7 @@ impl Mark { pub fn modern(mut self) -> Mark { HygieneData::with(|data| { loop { - if self == Mark::root() || data.marks[self.0 as usize].modern { + if self == Mark::root() || data.marks[self.0 as usize].kind == MarkKind::Modern { return self; } self = data.marks[self.0 as usize].parent; @@ -85,12 +91,12 @@ impl Mark { }) } - pub fn is_modern(self) -> bool { - HygieneData::with(|data| data.marks[self.0 as usize].modern) + pub fn kind(self) -> MarkKind { + HygieneData::with(|data| data.marks[self.0 as usize].kind) } - pub fn set_modern(self) { - HygieneData::with(|data| data.marks[self.0 as usize].modern = true) + pub fn set_kind(self, kind: MarkKind) { + HygieneData::with(|data| data.marks[self.0 as usize].kind = kind) } pub fn is_descendant_of(mut self, ancestor: Mark) -> bool { @@ -116,8 +122,16 @@ struct HygieneData { impl HygieneData { fn new() -> Self { HygieneData { - marks: vec![MarkData::default()], - syntax_contexts: vec![SyntaxContextData::default()], + marks: vec![MarkData { + parent: Mark::root(), + kind: MarkKind::Builtin, + expn_info: None, + }], + syntax_contexts: vec![SyntaxContextData { + outer_mark: Mark::root(), + prev_ctxt: SyntaxContext(0), + modern: SyntaxContext(0), + }], markings: HashMap::new(), gensym_to_ctxt: HashMap::new(), } @@ -150,7 +164,7 @@ impl SyntaxContext { HygieneData::with(|data| { data.marks.push(MarkData { parent: Mark::root(), - modern: false, + kind: MarkKind::Legacy, expn_info: Some(expansion_info) }); @@ -170,7 +184,7 @@ impl SyntaxContext { HygieneData::with(|data| { let syntax_contexts = &mut data.syntax_contexts; let mut modern = syntax_contexts[self.0 as usize].modern; - if data.marks[mark.0 as usize].modern { + if data.marks[mark.0 as usize].kind == MarkKind::Modern { modern = *data.markings.entry((modern, mark)).or_insert_with(|| { let len = syntax_contexts.len() as u32; syntax_contexts.push(SyntaxContextData { |
