@@ -42,6 +42,7 @@ Ptr<ast::Decl> Parser::parse_decl(bool is_top_level) {
4242 case Token::Struct: decl = parse_struct_decl (); break ;
4343 case Token::Enum: decl = parse_enum_decl (); break ;
4444 case Token::Type: decl = parse_type_decl (); break ;
45+ case Token::TypeExt: decl = parse_ext_type_decl (); break ;
4546 case Token::Implicit: decl = parse_implicit_decl (); break ;
4647 case Token::Static: decl = parse_static_decl (); break ;
4748 case Token::Mod: decl = parse_mod_decl (); break ;
@@ -200,6 +201,28 @@ Ptr<ast::TypeDecl> Parser::parse_type_decl() {
200201 return _arena.make_ptr <ast::TypeDecl>(tracker (), std::move (id), std::move (type_params), std::move (aliased_type));
201202}
202203
204+ Ptr<ast::ExtTypeDecl> Parser::parse_ext_type_decl () {
205+ Tracker tracker (this );
206+ eat (Token::TypeExt);
207+ auto id = parse_id ();
208+
209+ Ptr<ast::TypeParamList> type_params;
210+ if (ahead ().tag () == Token::LBracket)
211+ type_params = parse_type_params ();
212+
213+ PtrVector<std::string> type_args;
214+ if (accept (Token::Eq)) {
215+ expect (Token::LBrace);
216+
217+ parse_list (Token::RBrace, Token::Comma, [&] {
218+ type_args.emplace_back (_arena.make_ptr <std::string>(parse_str ()));
219+ });
220+ }
221+
222+ expect (Token::Semi);
223+ return _arena.make_ptr <ast::ExtTypeDecl>(tracker (), std::move (id), std::move (type_params), std::move (type_args));
224+ }
225+
203226Ptr<ast::ImplicitDecl> Parser::parse_implicit_decl () {
204227 Tracker tracker (this );
205228 eat (Token::Implicit);
0 commit comments