about summary refs log tree commit diff
path: root/src/libsyntax_pos
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-03-24 23:03:15 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-05-25 05:52:05 +0000
commitbfa2ef62a1d283eea2779ce0a4676a855536bfcd (patch)
tree6f975fa9c0b699448069c165590c113f0a8615cc /src/libsyntax_pos
parent1f175fa35d4263f1d2c4c3433a495a78996305f4 (diff)
downloadrust-bfa2ef62a1d283eea2779ce0a4676a855536bfcd.tar.gz
rust-bfa2ef62a1d283eea2779ce0a4676a855536bfcd.zip
Hygienize `librustc_typeck`.
Diffstat (limited to 'src/libsyntax_pos')
-rw-r--r--src/libsyntax_pos/hygiene.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs
index 24a21faa7eb..f23398bda6b 100644
--- a/src/libsyntax_pos/hygiene.rs
+++ b/src/libsyntax_pos/hygiene.rs
@@ -16,7 +16,7 @@
 //! DOI=10.1017/S0956796812000093 http://dx.doi.org/10.1017/S0956796812000093
 
 use Span;
-use symbol::Symbol;
+use symbol::{Ident, Symbol};
 
 use serialize::{Encodable, Decodable, Encoder, Decoder};
 use std::cell::RefCell;
@@ -106,6 +106,7 @@ struct HygieneData {
     marks: Vec<MarkData>,
     syntax_contexts: Vec<SyntaxContextData>,
     markings: HashMap<(SyntaxContext, Mark), SyntaxContext>,
+    idents: HashMap<Symbol, Ident>,
 }
 
 impl HygieneData {
@@ -114,6 +115,7 @@ impl HygieneData {
             marks: vec![MarkData::default()],
             syntax_contexts: vec![SyntaxContextData::default()],
             markings: HashMap::new(),
+            idents: HashMap::new(),
         }
     }
 
@@ -348,3 +350,19 @@ impl Decodable for SyntaxContext {
         Ok(SyntaxContext::empty()) // FIXME(jseyfried) intercrate hygiene
     }
 }
+
+impl Symbol {
+    pub fn from_ident(ident: Ident) -> Symbol {
+        HygieneData::with(|data| {
+            let symbol = Symbol::gensym(&ident.name.as_str());
+            data.idents.insert(symbol, ident);
+            symbol
+        })
+    }
+
+    pub fn to_ident(self) -> Ident {
+        HygieneData::with(|data| {
+            data.idents.get(&self).cloned().unwrap_or(Ident::with_empty_ctxt(self))
+        })
+    }
+}