aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-10-29 11:35:21 +0000
committergingerBill <bill@gingerbill.org>2017-10-29 11:35:21 +0000
commita43b89f36e988df8268ee92ea54017806b3226bb (patch)
treeb9db9300453604a565ee3ac7e56c9fe6ad17be08 /src/parser.cpp
parent0ed34af19d20aa5ae13c2147bd0f767d68d2e965 (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.cpp21
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) {