mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-29 17:34:34 +00:00
Try try and or_else built-in procedures with operators try and try else
This commit is contained in:
@@ -199,6 +199,15 @@ Ast *clone_ast(Ast *node) {
|
||||
n->AutoCast.expr = clone_ast(n->AutoCast.expr);
|
||||
break;
|
||||
|
||||
case Ast_TryExpr:
|
||||
n->TryExpr.expr = clone_ast(n->TryExpr.expr);
|
||||
break;
|
||||
|
||||
case Ast_TryElseExpr:
|
||||
n->TryElseExpr.expr = clone_ast(n->TryElseExpr.expr);
|
||||
n->TryElseExpr.else_expr = clone_ast(n->TryElseExpr.else_expr);
|
||||
break;
|
||||
|
||||
case Ast_InlineAsmExpr:
|
||||
n->InlineAsmExpr.param_types = clone_ast_array(n->InlineAsmExpr.param_types);
|
||||
n->InlineAsmExpr.return_type = clone_ast(n->InlineAsmExpr.return_type);
|
||||
@@ -680,6 +689,22 @@ Ast *ast_auto_cast(AstFile *f, Token token, Ast *expr) {
|
||||
return result;
|
||||
}
|
||||
|
||||
Ast *ast_try_expr(AstFile *f, Token token, Ast *expr) {
|
||||
Ast *result = alloc_ast_node(f, Ast_TryExpr);
|
||||
result->TryExpr.token = token;
|
||||
result->TryExpr.expr = expr;
|
||||
return result;
|
||||
}
|
||||
Ast *ast_try_else_expr(AstFile *f, Token try_token, Ast *expr, Token else_token, Ast *else_expr) {
|
||||
Ast *result = alloc_ast_node(f, Ast_TryElseExpr);
|
||||
result->TryElseExpr.try_token = try_token;
|
||||
result->TryElseExpr.expr = expr;
|
||||
result->TryElseExpr.else_token = else_token;
|
||||
result->TryElseExpr.else_expr = else_expr;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Ast *ast_inline_asm_expr(AstFile *f, Token token, Token open, Token close,
|
||||
Array<Ast *> const ¶m_types,
|
||||
Ast *return_type,
|
||||
@@ -2723,6 +2748,16 @@ Ast *parse_unary_expr(AstFile *f, bool lhs) {
|
||||
return ast_auto_cast(f, token, expr);
|
||||
}
|
||||
|
||||
case Token_try: {
|
||||
Token try_token = advance_token(f);
|
||||
Ast *expr = parse_unary_expr(f, lhs);
|
||||
if (f->curr_token.kind == Token_else) {
|
||||
Token else_token = advance_token(f);
|
||||
Ast *else_expr = parse_expr(f, lhs);
|
||||
return ast_try_else_expr(f, try_token, expr, else_token, else_expr);
|
||||
}
|
||||
return ast_try_expr(f, try_token, expr);
|
||||
}
|
||||
|
||||
case Token_Add:
|
||||
case Token_Sub:
|
||||
|
||||
Reference in New Issue
Block a user