summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-06-11 21:03:45 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-06-11 21:03:45 +0800
commitb3af24cd9e3715097997c8215f82f1184586f542 (patch)
tree97074debb75d2a80651112f077dd0cc901b6fa66 /src/macro_rules
parent52d872b36d7fda733273d70100d21b16506f1647 (diff)
downloadmrust-b3af24cd9e3715097997c8215f82f1184586f542.tar.gz
Expand - Make file!/line! get the invocation location of a macro
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp15
-rw-r--r--src/macro_rules/macro_rules.hpp2
2 files changed, 12 insertions, 5 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 )
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp
index aed0e8ce..2a588a78 100644
--- a/src/macro_rules/macro_rules.hpp
+++ b/src/macro_rules/macro_rules.hpp
@@ -156,7 +156,7 @@ public:
SERIALISABLE_PROTOTYPES();
};
-extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input, AST::Module& mod);
+extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const Span& sp, TokenTree input, AST::Module& mod);
extern MacroRulesPtr Parse_MacroRules(TokenStream& lex);
#endif // MACROS_HPP_INCLUDED