From 5af08604e03340657d3823fcd4eefe3d21f2fb30 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Tue, 27 Sep 2016 17:07:38 +0800 Subject: AST - Refactor extern blocks into Items --- src/parse/root.cpp | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) (limited to 'src/parse/root.cpp') diff --git a/src/parse/root.cpp b/src/parse/root.cpp index 97f0dc30..ff792788 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -1077,7 +1077,7 @@ void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl) impl.items().back().data->attrs = mv$(item_attrs); // Empty for functions } -void Parse_ExternBlock(TokenStream& lex, AST::Module& mod, ::std::string abi, ::AST::MetaItems block_attrs) +AST::ExternBlock Parse_ExternBlock(TokenStream& lex, ::std::string abi, ::AST::MetaItems& block_attrs) { TRACE_FUNCTION; Token tok; @@ -1088,7 +1088,8 @@ void Parse_ExternBlock(TokenStream& lex, AST::Module& mod, ::std::string abi, :: GET_CHECK_TOK(tok, lex, TOK_SQUARE_CLOSE); } PUTBACK(tok, lex); - // TODO: Use `block_attrs` + + AST::ExternBlock rv { mv$(abi) }; while( GET_TOK(tok, lex) != TOK_BRACE_CLOSE ) { @@ -1101,6 +1102,8 @@ void Parse_ExternBlock(TokenStream& lex, AST::Module& mod, ::std::string abi, :: } SET_ATTRS(lex, meta_items); + auto ps = lex.start_span(); + bool is_public = false; if( tok.type() == TOK_RWORD_PUB ) { is_public = true; @@ -1114,8 +1117,12 @@ void Parse_ExternBlock(TokenStream& lex, AST::Module& mod, ::std::string abi, :: // parse function as prototype // - no self auto i = ::AST::Item( Parse_FunctionDef(lex, abi, meta_items, false, true) ); - mod.add_item( is_public, mv$(name), mv$(i), mv$(meta_items) ); GET_CHECK_TOK(tok, lex, TOK_SEMICOLON); + + i.attrs = mv$(meta_items); + i.span = lex.end_span(ps); + + rv.add_item( AST::Named { mv$(name), mv$(i), is_public } ); break; } case TOK_RWORD_STATIC: { bool is_mut = false; @@ -1130,12 +1137,16 @@ void Parse_ExternBlock(TokenStream& lex, AST::Module& mod, ::std::string abi, :: GET_CHECK_TOK(tok, lex, TOK_SEMICOLON); auto i = ::AST::Item(::AST::Static( (is_mut ? ::AST::Static::MUT : ::AST::Static::STATIC), type, ::AST::Expr() )); - mod.add_item(is_public, mv$(name), mv$(i), mv$(meta_items)); + i.attrs = mv$(meta_items); + i.span = lex.end_span(ps); + rv.add_item( AST::Named { mv$(name), mv$(i), is_public } ); break; } default: throw ParseError::Unexpected(lex, tok, {TOK_RWORD_FN, TOK_RWORD_STATIC}); } } + + return rv; } void Parse_Use_Wildcard(Span sp, AST::Path base_path, ::std::function fcn) @@ -1355,7 +1366,9 @@ void Parse_Use(TokenStream& lex, ::std::function" { ...` - GET_CHECK_TOK(tok, lex, TOK_RWORD_EXTERN); - ::std::string abi = "C"; - if( GET_TOK(tok, lex) == TOK_STRING ) { - abi = tok.str(); - GET_TOK(tok, lex); - } - CHECK_TOK(tok, TOK_BRACE_OPEN); - - Parse_ExternBlock(lex, mod, mv$(abi), mv$(meta_items)); - } // `unsafe impl` // TODO: Move these two into Parse_Mod_Item_S //else if( LOOKAHEAD1(lex, TOK_RWORD_IMPL) || LOOKAHEAD2(lex, TOK_RWORD_UNSAFE, TOK_RWORD_IMPL) ) -- cgit v1.2.3