diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-03-24 23:03:15 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-05-25 05:52:05 +0000 |
| commit | bfa2ef62a1d283eea2779ce0a4676a855536bfcd (patch) | |
| tree | 6f975fa9c0b699448069c165590c113f0a8615cc /src/libsyntax_pos | |
| parent | 1f175fa35d4263f1d2c4c3433a495a78996305f4 (diff) | |
| download | rust-bfa2ef62a1d283eea2779ce0a4676a855536bfcd.tar.gz rust-bfa2ef62a1d283eea2779ce0a4676a855536bfcd.zip | |
Hygienize `librustc_typeck`.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 20 |
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)) + }) + } +} |
