diff options
author | John Hodge <tpg@mutabah.net> | 2016-11-02 22:56:19 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-11-02 22:56:19 +0800 |
commit | dc69b7313160536c4a361a4474ec361ec3b1e55b (patch) | |
tree | de593eda4fb273edc1cd18d063109fa3461d4559 /src/macro_rules | |
parent | e31eef7a4a00d46ce184dd33aea4d8c07b7ffb39 (diff) | |
download | mrust-dc69b7313160536c4a361a4474ec361ec3b1e55b.tar.gz |
Hygiene - Possibly working
Diffstat (limited to 'src/macro_rules')
-rw-r--r-- | src/macro_rules/eval.cpp | 8 | ||||
-rw-r--r-- | src/macro_rules/macro_rules.hpp | 2 | ||||
-rw-r--r-- | src/macro_rules/parse.cpp | 3 |
3 files changed, 8 insertions, 5 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 3a55f500..5f2ac6b0 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -571,12 +571,12 @@ class MacroExpander: public: MacroExpander(const MacroExpander& x) = delete; - MacroExpander(const ::std::string& macro_name, const ::std::vector<MacroExpansionEnt>& contents, ParameterMappings mappings, ::std::string crate_name): + MacroExpander(const ::std::string& macro_name, const Ident::Hygiene& parent_hygiene, const ::std::vector<MacroExpansionEnt>& contents, ParameterMappings mappings, ::std::string crate_name): m_macro_filename( FMT("Macro:" << macro_name) ), m_crate_name( mv$(crate_name) ), m_mappings( mv$(mappings) ), m_state( contents, m_mappings ), - m_hygiene( Ident::Hygiene::new_scope() ) + m_hygiene( Ident::Hygiene::new_scope_chained(parent_hygiene) ) { } @@ -708,7 +708,7 @@ void Macro_HandlePatternCap(TokenStream& lex, unsigned int index, MacroPatEnt::T ; else CHECK_TOK(tok, TOK_IDENT); - bound_tts.insert( index, iterations, InterpolatedFragment( TokenTree(tok) ) ); + bound_tts.insert( index, iterations, InterpolatedFragment( TokenTree(lex.getHygiene(), tok) ) ); break; } } @@ -786,7 +786,7 @@ bool Macro_HandlePattern(TokenStream& lex, const MacroPatEnt& pat, ::std::vector // Run through the expansion counting the number of times each fragment is used Macro_InvokeRules_CountSubstUses(bound_tts, rule.m_contents); - TokenStream* ret_ptr = new MacroExpander(name, rule.m_contents, mv$(bound_tts), rules.m_source_crate); + TokenStream* ret_ptr = new MacroExpander(name, rules.m_hygiene, rule.m_contents, mv$(bound_tts), rules.m_source_crate); return ::std::unique_ptr<TokenStream>( ret_ptr ); } diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp index 30e3e45b..337a4707 100644 --- a/src/macro_rules/macro_rules.hpp +++ b/src/macro_rules/macro_rules.hpp @@ -142,6 +142,8 @@ public: /// - Populated on deserialise if not already set
::std::string m_source_crate;
+ Ident::Hygiene m_hygiene;
+
/// Expansion rules
::std::vector<MacroRulesArm> m_rules;
diff --git a/src/macro_rules/parse.cpp b/src/macro_rules/parse.cpp index c7a6ef89..4da91a90 100644 --- a/src/macro_rules/parse.cpp +++ b/src/macro_rules/parse.cpp @@ -473,7 +473,8 @@ MacroRulesPtr Parse_MacroRules(TokenStream& lex) rule_arms.push_back( mv$(arm) ); } - auto rv = new MacroRules(); + auto rv = new MacroRules( ); + rv->m_hygiene = lex.getHygiene(); rv->m_rules = mv$(rule_arms); return MacroRulesPtr(rv); |