diff options
-rw-r--r-- | src/ast/ast.cpp | 2 | ||||
-rw-r--r-- | src/parse/root.cpp | 13 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index f3a81e80..9893e87f 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -262,7 +262,7 @@ UseItem UseItem::clone() const void ExternBlock::add_item(Named<Item> named_item) { - ASSERT_BUG(named_item.data.span, named_item.data.is_Function() || named_item.data.is_Static(), "Incorrect item type for ExternBlock"); + ASSERT_BUG(named_item.data.span, named_item.data.is_Function() || named_item.data.is_Static() || named_item.data.is_Type(), "Incorrect item type for ExternBlock - " << named_item.data.tag_str()); m_items.push_back( mv$(named_item) ); } ExternBlock ExternBlock::clone() const diff --git a/src/parse/root.cpp b/src/parse/root.cpp index 4d9c96e0..a58e05d5 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -1325,8 +1325,19 @@ AST::ExternBlock Parse_ExternBlock(TokenStream& lex, ::std::string abi, ::AST::A i.span = lex.end_span(ps); rv.add_item( AST::Named<AST::Item> { mv$(name), mv$(i), is_public } ); break; } + case TOK_RWORD_TYPE: { + GET_CHECK_TOK(tok, lex, TOK_IDENT); + auto name = mv$(tok.str()); + GET_CHECK_TOK(tok, lex, TOK_SEMICOLON); + auto sp = lex.end_span(ps); + //TODO(sp, "Extern type"); + auto i = ::AST::Item(::AST::TypeAlias( ::AST::GenericParams(), ::TypeRef(sp) )); + i.attrs = mv$(meta_items); + i.span = mv$(sp); + rv.add_item( AST::Named<AST::Item> { mv$(name), mv$(i), is_public } ); + break; } default: - throw ParseError::Unexpected(lex, tok, {TOK_RWORD_FN, TOK_RWORD_STATIC}); + throw ParseError::Unexpected(lex, tok, {TOK_RWORD_FN, TOK_RWORD_STATIC, TOK_RWORD_TYPE}); } } |