From 32bf8d1daa49b1f35bac61732f815c339c5df26e Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 26 Sep 2016 12:34:27 +0800 Subject: Parse - Accept TOK_INTERPOLATED_ITEM --- src/macro_rules/eval.cpp | 1 + src/macro_rules/mod.cpp | 1 + src/parse/root.cpp | 5 +++++ src/parse/token.cpp | 9 +++++++++ src/parse/token.hpp | 4 ++++ 5 files changed, 20 insertions(+) (limited to 'src') diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index aa20a1dc..95d7c2d2 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -827,6 +827,7 @@ bool Macro_HandlePattern(TokenStream& lex, const MacroPatEnt& pat, ::std::vector void Macro_InvokeRules_CountSubstUses(ParameterMappings& bound_tts, const ::std::vector& contents) { + TRACE_FUNCTION; MacroExpandState state(contents, bound_tts); while(const auto* ent_ptr = state.next_ent()) diff --git a/src/macro_rules/mod.cpp b/src/macro_rules/mod.cpp index 4f7dad45..3d1f04c5 100644 --- a/src/macro_rules/mod.cpp +++ b/src/macro_rules/mod.cpp @@ -123,6 +123,7 @@ bool is_token_item(eTokenType tt) { case TOK_RWORD_MOD: //case TOK_RWORD_IMPL: // TODO: more? + case TOK_INTERPOLATED_ITEM: return true; default: return false; diff --git a/src/parse/root.cpp b/src/parse/root.cpp index 3a942b6c..43c89a36 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -1284,6 +1284,11 @@ void Parse_Use(TokenStream& lex, ::std::function( reinterpret_cast( ptr ) ); } +::AST::Named Token::take_frag_item() +{ + assert( m_type == TOK_INTERPOLATED_ITEM ); + auto ptr = reinterpret_cast*>(m_data.as_Fragment()); + m_data.as_Fragment() = nullptr; + auto rv = mv$( *ptr ); + delete ptr; + return mv$(rv); +} const char* Token::typestr(enum eTokenType type) { diff --git a/src/parse/token.hpp b/src/parse/token.hpp index 93ce9c6c..d496a4b2 100644 --- a/src/parse/token.hpp +++ b/src/parse/token.hpp @@ -42,6 +42,9 @@ namespace AST { class Path; class ExprNode; class MetaItem; + class Item; + template + class Named; }; class InterpolatedFragment; @@ -118,6 +121,7 @@ public: AST::Pattern& frag_pattern() { assert(m_type == TOK_INTERPOLATED_PATTERN); return *reinterpret_cast( m_data.as_Fragment() ); } AST::MetaItem& frag_meta() { assert(m_type == TOK_INTERPOLATED_META); return *reinterpret_cast( m_data.as_Fragment() ); } ::std::unique_ptr take_frag_node(); + ::AST::Named take_frag_item(); bool operator==(const Token& r) const { if(type() != r.type()) -- cgit v1.2.3