aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-03-24 19:25:53 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-03-24 19:25:53 -0400
commit897e783763d60449ad1b9514cb5ba86a38f7ae4a (patch)
tree1f1603884432590aba99c7d2edd0d035548c5286 /src/parser.cpp
parent18af2f9a2764cc340571578d58cb2575faeccdc6 (diff)
downloadzig-897e783763d60449ad1b9514cb5ba86a38f7ae4a.tar.gz
zig-897e783763d60449ad1b9514cb5ba86a38f7ae4a.zip
add promise->T syntax parsing
closes #857
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 666b9da3c3..d6faf4c984 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -705,7 +705,7 @@ static AstNode *ast_parse_comptime_expr(ParseContext *pc, size_t *token_index, b
}
/*
-PrimaryExpression = Integer | Float | String | CharLiteral | KeywordLiteral | GroupedExpression | BlockExpression(BlockOrExpression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | FnProto | AsmExpression | ContainerDecl | ("continue" option(":" Symbol)) | ErrorSetDecl
+PrimaryExpression = Integer | Float | String | CharLiteral | KeywordLiteral | GroupedExpression | BlockExpression(BlockOrExpression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | FnProto | AsmExpression | ContainerDecl | ("continue" option(":" Symbol)) | ErrorSetDecl | PromiseType
KeywordLiteral = "true" | "false" | "null" | "undefined" | "error" | "this" | "unreachable" | "suspend"
ErrorSetDecl = "error" "{" list(Symbol, ",") "}"
*/
@@ -774,6 +774,15 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, size_t *token_index, bo
AstNode *node = ast_create_node(pc, NodeTypeSuspend, token);
*token_index += 1;
return node;
+ } else if (token->id == TokenIdKeywordPromise) {
+ AstNode *node = ast_create_node(pc, NodeTypePromiseType, token);
+ *token_index += 1;
+ Token *arrow_tok = &pc->tokens->at(*token_index);
+ if (arrow_tok->id == TokenIdArrow) {
+ *token_index += 1;
+ node->data.promise_type.payload_type = ast_parse_type_expr(pc, token_index, true);
+ }
+ return node;
} else if (token->id == TokenIdKeywordError) {
Token *next_token = &pc->tokens->at(*token_index + 1);
if (next_token->id == TokenIdLBrace) {
@@ -3081,6 +3090,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
visit_field(&node->data.array_type.child_type, visit, context);
visit_field(&node->data.array_type.align_expr, visit, context);
break;
+ case NodeTypePromiseType:
+ visit_field(&node->data.promise_type.payload_type, visit, context);
+ break;
case NodeTypeErrorType:
// none
break;