diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-01-21 08:16:22 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-01-21 08:16:22 +0800 |
commit | d1ea840742dac3d3af66667508c8a841a6c6ca70 (patch) | |
tree | 55ab13c70683ec4ae1f15cdbc644ded1e29994ca /src | |
parent | 048666d6415bf8dfff11ddbf287fc488833ab609 (diff) | |
download | mrust-d1ea840742dac3d3af66667508c8a841a6c6ca70.tar.gz |
Parse (partial) - `extern { type Foo; }`, very rough
Diffstat (limited to 'src')
-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}); } } |