summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-11-02 22:56:19 +0800
committerJohn Hodge <tpg@mutabah.net>2016-11-02 22:56:19 +0800
commitdc69b7313160536c4a361a4474ec361ec3b1e55b (patch)
treede593eda4fb273edc1cd18d063109fa3461d4559 /src/macro_rules
parente31eef7a4a00d46ce184dd33aea4d8c07b7ffb39 (diff)
downloadmrust-dc69b7313160536c4a361a4474ec361ec3b1e55b.tar.gz
Hygiene - Possibly working
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp8
-rw-r--r--src/macro_rules/macro_rules.hpp2
-rw-r--r--src/macro_rules/parse.cpp3
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);