aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-07-26 19:52:35 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-07-26 19:52:35 -0400
commitee64a22045ccbc39773779d4e386e25f563c8a90 (patch)
tree95263984be9a72a1c9cc102b55e715a83a38b8eb /src/parser.cpp
parent018a89c7a1b2763a50375f6d6d168dfa1f877f6a (diff)
downloadzig-ee64a22045ccbc39773779d4e386e25f563c8a90.tar.gz
zig-ee64a22045ccbc39773779d4e386e25f563c8a90.zip
add the `anyframe` and `anyframe->T` types
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index b1a593d9c9..82312aacf3 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -282,6 +282,9 @@ static AstNode *ast_parse_prefix_op_expr(
case NodeTypeAwaitExpr:
right = &prefix->data.await_expr.expr;
break;
+ case NodeTypeAnyFrameType:
+ right = &prefix->data.anyframe_type.payload_type;
+ break;
case NodeTypeArrayType:
right = &prefix->data.array_type.child_type;
break;
@@ -1640,6 +1643,10 @@ static AstNode *ast_parse_primary_type_expr(ParseContext *pc) {
if (null != nullptr)
return ast_create_node(pc, NodeTypeNullLiteral, null);
+ Token *anyframe = eat_token_if(pc, TokenIdKeywordAnyFrame);
+ if (anyframe != nullptr)
+ return ast_create_node(pc, NodeTypeAnyFrameType, anyframe);
+
Token *true_token = eat_token_if(pc, TokenIdKeywordTrue);
if (true_token != nullptr) {
AstNode *res = ast_create_node(pc, NodeTypeBoolLiteral, true_token);
@@ -2510,7 +2517,7 @@ static AstNode *ast_parse_prefix_op(ParseContext *pc) {
// PrefixTypeOp
// <- QUESTIONMARK
-// / KEYWORD_promise MINUSRARROW
+// / KEYWORD_anyframe MINUSRARROW
// / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile)*
// / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile)*
static AstNode *ast_parse_prefix_type_op(ParseContext *pc) {
@@ -2521,6 +2528,16 @@ static AstNode *ast_parse_prefix_type_op(ParseContext *pc) {
return res;
}
+ Token *anyframe = eat_token_if(pc, TokenIdKeywordAnyFrame);
+ if (anyframe != nullptr) {
+ if (eat_token_if(pc, TokenIdArrow) != nullptr) {
+ AstNode *res = ast_create_node(pc, NodeTypeAnyFrameType, anyframe);
+ return res;
+ }
+
+ put_back_token(pc);
+ }
+
AstNode *array = ast_parse_array_type_start(pc);
if (array != nullptr) {
assert(array->type == NodeTypeArrayType);
@@ -3005,6 +3022,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
case NodeTypeInferredArrayType:
visit_field(&node->data.array_type.child_type, visit, context);
break;
+ case NodeTypeAnyFrameType:
+ visit_field(&node->data.anyframe_type.payload_type, visit, context);
+ break;
case NodeTypeErrorType:
// none
break;