diff options
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)) + }) + } +} |
