diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-26 15:39:11 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-26 15:39:11 +0800 |
commit | 0fa288e8c23292b597090d76d5204b597b953757 (patch) | |
tree | cdb13ee2a42f26a86e636839814236930c2530d4 /src/parse | |
parent | 5f68e80e8290f225db72221b1172bfb5cde8423e (diff) | |
download | mrust-0fa288e8c23292b597090d76d5204b597b953757.tar.gz |
Parse - Transfer new attributes to :item fragments
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/root.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/parse/root.cpp b/src/parse/root.cpp index d5df911f..97f0dc30 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -404,20 +404,19 @@ AST::Function Parse_FunctionDefWithCode(TokenStream& lex, ::std::string abi, AST return ret;
}
-AST::TypeAlias Parse_TypeAlias(TokenStream& lex, AST::MetaItems& meta_items)
+AST::TypeAlias Parse_TypeAlias(TokenStream& lex)
{
TRACE_FUNCTION;
Token tok;
// Params
- tok = lex.getToken();
AST::GenericParams params;
- if( tok.type() == TOK_LT )
+ if( GET_TOK(tok, lex) == TOK_LT )
{
params = Parse_GenericParams(lex);
GET_CHECK_TOK(tok, lex, TOK_GT);
- tok = lex.getToken();
+ GET_TOK(tok, lex);
}
if( tok.type() == TOK_RWORD_WHERE )
@@ -1286,13 +1285,9 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin // TODO: Extract single-item parsing into a method that returns just the item
::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, const AST::Module::FileInfo& mod_fileinfo, const ::AST::Path& mod_path, AST::MetaItems meta_items)
{
+ TRACE_FUNCTION_F("mod_path="<<mod_path<<", meta_items="<<meta_items);
Token tok;
- if( LOOK_AHEAD(lex) == TOK_INTERPOLATED_ITEM ) {
- GET_TOK(tok, lex);
- return tok.take_frag_item();
- }
-
while( LOOK_AHEAD(lex) == TOK_ATTR_OPEN /* || LOOKAHEAD2(lex, TOK_HASH, TOK_SQUARE_OPEN) */ )
{
// Attributes!
@@ -1301,11 +1296,20 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin GET_CHECK_TOK(tok, lex, TOK_SQUARE_CLOSE);
}
+ if( LOOK_AHEAD(lex) == TOK_INTERPOLATED_ITEM ) {
+ GET_TOK(tok, lex);
+ auto rv = tok.take_frag_item();
+ // Transfer new attributes onto the item
+ for(auto& mi : meta_items.m_items)
+ rv.data.attrs.m_items.push_back( mv$(mi) );
+ return rv;
+ }
+
auto ps = lex.start_span();
::std::string item_name;
::AST::Item item_data;
-
+
bool is_public = false;
if( GET_TOK(tok, lex) == TOK_RWORD_PUB ) {
is_public = true;
@@ -1528,7 +1532,7 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin case TOK_RWORD_TYPE:
GET_CHECK_TOK(tok, lex, TOK_IDENT);
item_name = mv$(tok.str());
- item_data = ::AST::Item( Parse_TypeAlias(lex, meta_items) );
+ item_data = ::AST::Item( Parse_TypeAlias(lex) );
break;
// `struct`
case TOK_RWORD_STRUCT:
|