diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-07-07 23:07:06 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-07-08 18:16:09 +0300 |
| commit | fc74e359819002fad402f68728f6e5ba2d4cb704 (patch) | |
| tree | 32c1c6b774ff39648ef7508739ef83975358996e /src/libsyntax_pos | |
| parent | 94ef9f57f5fa985beb7588e5cb4c73f1b5f2dcba (diff) | |
| download | rust-fc74e359819002fad402f68728f6e5ba2d4cb704.tar.gz rust-fc74e359819002fad402f68728f6e5ba2d4cb704.zip | |
Remove fallback to parent modules from lexical resolution
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 385174ea7fe..c7076478332 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -72,26 +72,16 @@ pub enum Transparency { } impl Mark { - fn fresh_with_data(mark_data: MarkData, data: &mut HygieneData) -> Self { - data.marks.push(mark_data); - Mark(data.marks.len() as u32 - 1) - } - pub fn fresh(parent: Mark) -> Self { HygieneData::with(|data| { - Mark::fresh_with_data(MarkData { + data.marks.push(MarkData { parent, // By default expansions behave like `macro_rules`. default_transparency: Transparency::SemiTransparent, is_builtin: false, expn_info: None, - }, data) - }) - } - - pub fn fresh_cloned(clone_from: Mark) -> Self { - HygieneData::with(|data| { - Mark::fresh_with_data(data.marks[clone_from.0 as usize].clone(), data) + }); + Mark(data.marks.len() as u32 - 1) }) } @@ -128,17 +118,6 @@ impl Mark { }) } - // FIXME: This operation doesn't really make sense when single macro expansion - // can produce tokens with different transparencies. Figure out how to avoid it. - pub fn modern(mut self) -> Mark { - HygieneData::with(|data| { - while data.marks[self.0 as usize].default_transparency != Transparency::Opaque { - self = data.marks[self.0 as usize].parent; - } - self - }) - } - #[inline] pub fn set_default_transparency(self, transparency: Transparency) { assert_ne!(self, Mark::root()); @@ -194,6 +173,24 @@ impl Mark { b }) } + + // Used for enabling some compatibility fallback in resolve. + #[inline] + pub fn looks_like_proc_macro_derive(self) -> bool { + HygieneData::with(|data| { + let mark_data = &data.marks[self.0 as usize]; + if mark_data.default_transparency == Transparency::Opaque { + if let Some(expn_info) = &mark_data.expn_info { + if let ExpnFormat::MacroAttribute(name) = expn_info.format { + if name.as_str().starts_with("derive(") { + return true; + } + } + } + } + false + }) + } } #[derive(Debug)] @@ -285,6 +282,7 @@ impl SyntaxContext { }) } + /// Extend a syntax context with a given mark and default transparency for that mark. pub fn apply_mark(self, mark: Mark) -> SyntaxContext { assert_ne!(mark, Mark::root()); self.apply_mark_with_transparency( |
