diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-06-11 21:03:45 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-06-11 21:03:45 +0800 |
commit | b3af24cd9e3715097997c8215f82f1184586f542 (patch) | |
tree | 97074debb75d2a80651112f077dd0cc901b6fa66 /src/macro_rules/eval.cpp | |
parent | 52d872b36d7fda733273d70100d21b16506f1647 (diff) | |
download | mrust-b3af24cd9e3715097997c8215f82f1184586f542.tar.gz |
Expand - Make file!/line! get the invocation location of a macro
Diffstat (limited to 'src/macro_rules/eval.cpp')
-rw-r--r-- | src/macro_rules/eval.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 1bac45ee..fffe9b68 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -577,6 +577,7 @@ class MacroExpander: const RcString m_macro_filename; const ::std::string m_crate_name; + ::std::shared_ptr<Span> m_invocation_span; ParameterMappings m_mappings; MacroExpandState m_state; @@ -588,9 +589,10 @@ class MacroExpander: public: MacroExpander(const MacroExpander& x) = delete; - MacroExpander(const ::std::string& macro_name, const Ident::Hygiene& parent_hygiene, const ::std::vector<MacroExpansionEnt>& contents, ParameterMappings mappings, ::std::string crate_name): + MacroExpander(const ::std::string& macro_name, const Span& sp, 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_invocation_span( new Span(sp) ), m_mappings( mv$(mappings) ), m_state( contents, m_mappings ), m_hygiene( Ident::Hygiene::new_scope_chained(parent_hygiene) ) @@ -598,6 +600,7 @@ public: } Position getPosition() const override; + ::std::shared_ptr<Span> outerSpan() const override; Ident::Hygiene realGetHygiene() const override; Token realGetToken() override; }; @@ -722,7 +725,7 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type } /// Parse the input TokenTree according to the `macro_rules!` patterns and return a token stream of the replacement -::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input, AST::Module& mod) +::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const Span& sp, TokenTree input, AST::Module& mod) { TRACE_FUNCTION_F("'" << name << "', " << input); @@ -741,7 +744,7 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type // 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, rules.m_hygiene, rule.m_contents, mv$(bound_tts), rules.m_source_crate); + TokenStream* ret_ptr = new MacroExpander(name, sp, rules.m_hygiene, rule.m_contents, mv$(bound_tts), rules.m_source_crate); return ::std::unique_ptr<TokenStream>( ret_ptr ); } @@ -1065,9 +1068,13 @@ void Macro_InvokeRules_CountSubstUses(ParameterMappings& bound_tts, const ::std: Position MacroExpander::getPosition() const { - // TODO: Return a far better span - invocaion location? + // TODO: Return the attached position of the last fetched token return Position(m_macro_filename, 0, m_state.top_pos()); } +::std::shared_ptr<Span> MacroExpander::outerSpan() const +{ + return m_invocation_span; +} Ident::Hygiene MacroExpander::realGetHygiene() const { if( m_ttstream ) |