summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-01-21 08:16:22 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-01-21 08:16:22 +0800
commitd1ea840742dac3d3af66667508c8a841a6c6ca70 (patch)
tree55ab13c70683ec4ae1f15cdbc644ded1e29994ca /src
parent048666d6415bf8dfff11ddbf287fc488833ab609 (diff)
downloadmrust-d1ea840742dac3d3af66667508c8a841a6c6ca70.tar.gz
Parse (partial) - `extern { type Foo; }`, very rough
Diffstat (limited to 'src')
-rw-r--r--src/ast/ast.cpp2
-rw-r--r--src/parse/root.cpp13
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});
}
}