authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-05 18:58:58-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-05 18:58:58-05:00
log7749ffd797e927f93051060db49b76c595879697
tree53f3861a67d42e47ea35636f81a6a43618e44483
parentb9c943b0667ed8253382cb787d4705f6619f7296

try expression can omit variable assignments


3 files changed, 42 insertions(+), 11 deletions(-)

doc/langref.md+1-1
...@@ -93,7 +93,7 @@ IfExpression = IfVarExpression | IfBoolExpression...@@ -93,7 +93,7 @@ IfExpression = IfVarExpression | IfBoolExpression
9393
94IfBoolExpression = "if" "(" Expression ")" Expression option(Else)94IfBoolExpression = "if" "(" Expression ")" Expression option(Else)
9595
96TryExpression = "try" "(" ("const" | "var") option("*") Symbol "=" Expression ")" Expression option("else" option("|" Symbol "|") Expression)96TryExpression = "try" "(" option(("const" | "var") option("*") Symbol "=") Expression ")" Expression option("else" option("|" Symbol "|") Expression)
9797
98IfVarExpression = "if" "(" ("const" | "var") option("*") Symbol option(":" TypeExpr) "?=" Expression ")" Expression Option(Else)98IfVarExpression = "if" "(" ("const" | "var") option("*") Symbol option(":" TypeExpr) "?=" Expression ")" Expression Option(Else)
9999
src/parser.cpp+15-10
...@@ -628,7 +628,7 @@ static AstNode *ast_parse_comptime_expr(ParseContext *pc, size_t *token_index, b...@@ -628,7 +628,7 @@ static AstNode *ast_parse_comptime_expr(ParseContext *pc, size_t *token_index, b
628}628}
629629
630/*630/*
631TryExpression = "try" "(" ("const" | "var") option("*") Symbol "=" Expression ")" Expression option("else" option("|" Symbol "|") Expression)631TryExpression = "try" "(" option(("const" | "var") option("*") Symbol "=") Expression ")" Expression option("else" option("|" Symbol "|") Expression)
632*/632*/
633static AstNode *ast_parse_try_expr(ParseContext *pc, size_t *token_index, bool mandatory) {633static AstNode *ast_parse_try_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
634 Token *try_token = &pc->tokens->at(*token_index);634 Token *try_token = &pc->tokens->at(*token_index);
...@@ -646,26 +646,31 @@ static AstNode *ast_parse_try_expr(ParseContext *pc, size_t *token_index, bool m...@@ -646,26 +646,31 @@ static AstNode *ast_parse_try_expr(ParseContext *pc, size_t *token_index, bool m
646 ast_eat_token(pc, token_index, TokenIdLParen);646 ast_eat_token(pc, token_index, TokenIdLParen);
647647
648 Token *var_token = &pc->tokens->at(*token_index);648 Token *var_token = &pc->tokens->at(*token_index);
649 bool have_vars;
649 if (var_token->id == TokenIdKeywordVar) {650 if (var_token->id == TokenIdKeywordVar) {
650 node->data.try_expr.var_is_const = false;651 node->data.try_expr.var_is_const = false;
651 *token_index += 1;652 *token_index += 1;
653 have_vars = true;
652 } else if (var_token->id == TokenIdKeywordConst) {654 } else if (var_token->id == TokenIdKeywordConst) {
653 node->data.try_expr.var_is_const = true;655 node->data.try_expr.var_is_const = true;
654 *token_index += 1;656 *token_index += 1;
657 have_vars = true;
655 } else {658 } else {
656 ast_invalid_token_error(pc, var_token);659 have_vars = false;
657 }660 }
658661
659 Token *star_token = &pc->tokens->at(*token_index);662 if (have_vars) {
660 if (star_token->id == TokenIdStar) {663 Token *star_token = &pc->tokens->at(*token_index);
661 node->data.try_expr.var_is_ptr = true;664 if (star_token->id == TokenIdStar) {
662 *token_index += 1;665 node->data.try_expr.var_is_ptr = true;
663 }666 *token_index += 1;
667 }
664668
665 Token *var_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);669 Token *var_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
666 node->data.try_expr.var_symbol = token_buf(var_name_tok);670 node->data.try_expr.var_symbol = token_buf(var_name_tok);
667671
668 ast_eat_token(pc, token_index, TokenIdEq);672 ast_eat_token(pc, token_index, TokenIdEq);
673 }
669674
670 node->data.try_expr.target_node = ast_parse_expression(pc, token_index, true);675 node->data.try_expr.target_node = ast_parse_expression(pc, token_index, true);
671676
test/cases/try.zig+26
...@@ -31,3 +31,29 @@ error CrappedOut;...@@ -31,3 +31,29 @@ error CrappedOut;
31fn returnsTen() -> %i32 {31fn returnsTen() -> %i32 {
32 1032 10
33}33}
34
35fn tryWithoutVars() {
36 @setFnTest(this);
37
38 const result1 = try (failIfTrue(true)) {
39 1
40 } else {
41 i32(2)
42 };
43 assert(result1 == 2);
44
45 const result2 = try (failIfTrue(false)) {
46 1
47 } else {
48 i32(2)
49 };
50 assert(result2 == 1);
51}
52
53fn failIfTrue(ok: bool) -> %void {
54 if (ok) {
55 return error.ItBroke;
56 } else {
57 return;
58 }
59}