summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-26 12:34:27 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-26 12:34:27 +0800
commit32bf8d1daa49b1f35bac61732f815c339c5df26e (patch)
tree8d5703dd56d6cfa2ee8773727c56275ac6f11846 /src
parentb2e0f5c122b64fe31ba935f9cb5c6a397fd8f6ab (diff)
downloadmrust-32bf8d1daa49b1f35bac61732f815c339c5df26e.tar.gz
Parse - Accept TOK_INTERPOLATED_ITEM
Diffstat (limited to 'src')
-rw-r--r--src/macro_rules/eval.cpp1
-rw-r--r--src/macro_rules/mod.cpp1
-rw-r--r--src/parse/root.cpp5
-rw-r--r--src/parse/token.cpp9
-rw-r--r--src/parse/token.hpp4
5 files changed, 20 insertions, 0 deletions
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<MacroExpansionEnt>& 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<void(AST::UseStmt, ::std::strin
{
Token tok;
+ if( LOOK_AHEAD(lex) == TOK_INTERPOLATED_ITEM ) {
+ GET_TOK(tok, lex);
+ return tok.take_frag_item();
+ }
+
auto ps = lex.start_span();
::std::string item_name;
diff --git a/src/parse/token.cpp b/src/parse/token.cpp
index c5add18a..6899eecb 100644
--- a/src/parse/token.cpp
+++ b/src/parse/token.cpp
@@ -205,6 +205,15 @@ Token Token::clone() const
m_data.as_Fragment() = nullptr;
return ::std::unique_ptr<AST::ExprNode>( reinterpret_cast<AST::ExprNode*>( ptr ) );
}
+::AST::Named<AST::Item> Token::take_frag_item()
+{
+ assert( m_type == TOK_INTERPOLATED_ITEM );
+ auto ptr = reinterpret_cast<AST::Named<AST::Item>*>(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<typename T>
+ class Named;
};
class InterpolatedFragment;
@@ -118,6 +121,7 @@ public:
AST::Pattern& frag_pattern() { assert(m_type == TOK_INTERPOLATED_PATTERN); return *reinterpret_cast<AST::Pattern*>( m_data.as_Fragment() ); }
AST::MetaItem& frag_meta() { assert(m_type == TOK_INTERPOLATED_META); return *reinterpret_cast<AST::MetaItem*>( m_data.as_Fragment() ); }
::std::unique_ptr<AST::ExprNode> take_frag_node();
+ ::AST::Named<AST::Item> take_frag_item();
bool operator==(const Token& r) const {
if(type() != r.type())