diff options
| author | gingerBill <bill@gingerbill.org> | 2017-10-29 11:35:21 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-10-29 11:35:21 +0000 |
| commit | a43b89f36e988df8268ee92ea54017806b3226bb (patch) | |
| tree | b9db9300453604a565ee3ac7e56c9fe6ad17be08 /src/parser.cpp | |
| parent | 0ed34af19d20aa5ae13c2147bd0f767d68d2e965 (diff) | |
#alias type declarations; core library additions; `_global` import name for the global scope
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 56e768bc3..94a4e7585 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -407,6 +407,10 @@ AST_NODE_KIND(_TypeBegin, "", i32) \ Token token; \ AstNode *type; \ }) \ + AST_NODE_KIND(AliasType, "alias type", struct { \ + Token token; \ + AstNode *type; \ + }) \ AST_NODE_KIND(PolyType, "polymorphic type", struct { \ Token token; \ AstNode *type; \ @@ -611,6 +615,7 @@ Token ast_node_token(AstNode *node) { case AstNode_TypeType: return node->TypeType.token; case AstNode_HelperType: return node->HelperType.token; + case AstNode_AliasType: return node->AliasType.token; case AstNode_PolyType: return node->PolyType.token; case AstNode_ProcType: return node->ProcType.token; case AstNode_PointerType: return node->PointerType.token; @@ -857,6 +862,9 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) { case AstNode_HelperType: n->HelperType.type = clone_ast_node(a, n->HelperType.type); break; + case AstNode_AliasType: + n->AliasType.type = clone_ast_node(a, n->AliasType.type); + break; case AstNode_ProcType: n->ProcType.params = clone_ast_node(a, n->ProcType.params); n->ProcType.results = clone_ast_node(a, n->ProcType.results); @@ -1411,6 +1419,13 @@ AstNode *ast_helper_type(AstFile *f, Token token, AstNode *type) { return result; } +AstNode *ast_alias_type(AstFile *f, Token token, AstNode *type) { + AstNode *result = make_ast_node(f, AstNode_AliasType); + result->AliasType.token = token; + result->AliasType.type = type; + return result; +} + AstNode *ast_poly_type(AstFile *f, Token token, AstNode *type, AstNode *specialization) { AstNode *result = make_ast_node(f, AstNode_PolyType); @@ -2256,8 +2271,10 @@ AstNode *parse_operand(AstFile *f, bool lhs) { if (allow_token(f, Token_type)) { return ast_helper_type(f, token, parse_type(f)); } - Token name = expect_token(f, Token_Ident); - if (name.string == "run") { + Token name = expect_token(f, Token_Ident); + if (name.string == "alias") { + return ast_alias_type(f, token, parse_type(f)); + } else if (name.string == "run") { AstNode *expr = parse_expr(f, false); operand = ast_run_expr(f, token, name, expr); if (unparen_expr(expr)->kind != AstNode_CallExpr) { |