diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-26 12:34:27 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-26 12:34:27 +0800 |
commit | 32bf8d1daa49b1f35bac61732f815c339c5df26e (patch) | |
tree | 8d5703dd56d6cfa2ee8773727c56275ac6f11846 /src/parse | |
parent | b2e0f5c122b64fe31ba935f9cb5c6a397fd8f6ab (diff) | |
download | mrust-32bf8d1daa49b1f35bac61732f815c339c5df26e.tar.gz |
Parse - Accept TOK_INTERPOLATED_ITEM
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/root.cpp | 5 | ||||
-rw-r--r-- | src/parse/token.cpp | 9 | ||||
-rw-r--r-- | src/parse/token.hpp | 4 |
3 files changed, 18 insertions, 0 deletions
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()) |