about summary refs log tree commit diff
path: root/src/libsyntax_pos
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-07-07 23:07:06 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-07-08 18:16:09 +0300
commitfc74e359819002fad402f68728f6e5ba2d4cb704 (patch)
tree32c1c6b774ff39648ef7508739ef83975358996e /src/libsyntax_pos
parent94ef9f57f5fa985beb7588e5cb4c73f1b5f2dcba (diff)
downloadrust-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.rs46
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(