diff --git a/src/all_types.hpp b/src/all_types.hpp index 359bd20ae2..2a1ef3fefe 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -320,6 +320,7 @@ enum NodeType { NodeTypeFnDecl, NodeTypeParamDecl, NodeTypeBlock, + NodeTypeGroupedExpr, NodeTypeReturnExpr, NodeTypeDefer, NodeTypeVariableDeclaration, @@ -793,6 +794,7 @@ struct AstNode { AstNodeFnProto fn_proto; AstNodeParamDecl param_decl; AstNodeBlock block; + AstNode * grouped_expr; AstNodeReturnExpr return_expr; AstNodeDefer defer; AstNodeVariableDeclaration variable_declaration; diff --git a/src/analyze.cpp b/src/analyze.cpp index 3b0b9753e8..c3e2522ab4 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2076,6 +2076,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) { case NodeTypeReturnExpr: case NodeTypeDefer: case NodeTypeBlock: + case NodeTypeGroupedExpr: case NodeTypeBinOpExpr: case NodeTypeUnwrapErrorExpr: case NodeTypeFnCallExpr: diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 0a6c856da9..17f285008b 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -150,6 +150,8 @@ static const char *node_type_str(NodeType node_type) { return "ParamDecl"; case NodeTypeBlock: return "Block"; + case NodeTypeGroupedExpr: + return "Parens"; case NodeTypeBinOpExpr: return "BinOpExpr"; case NodeTypeUnwrapErrorExpr: @@ -469,6 +471,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { print_indent(ar); fprintf(ar->f, "}"); break; + case NodeTypeGroupedExpr: + fprintf(ar->f, "("); + render_node_ungrouped(ar, node->data.grouped_expr); + fprintf(ar->f, ")"); + break; case NodeTypeReturnExpr: { const char *return_str = return_string(node->data.return_expr.kind); diff --git a/src/ir.cpp b/src/ir.cpp index 07c77ebc81..2159e8472d 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -5574,6 +5574,8 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop zig_unreachable(); case NodeTypeBlock: return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval); + case NodeTypeGroupedExpr: + return ir_gen_node_raw(irb, node->data.grouped_expr, scope, lval); case NodeTypeBinOpExpr: return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval); case NodeTypeNumberLiteral: diff --git a/src/parser.cpp b/src/parser.cpp index d1184e9fd4..a4e8e3c464 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -363,10 +363,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, size_t *token_index, bo return nullptr; } } - *token_index += 1; - AstNode *node = ast_parse_expression(pc, token_index, true); + AstNode *node = ast_create_node(pc, NodeTypeGroupedExpr, l_paren); + + node->data.grouped_expr = ast_parse_expression(pc, token_index, true); Token *r_paren = &pc->tokens->at(*token_index); *token_index += 1; @@ -2605,6 +2606,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont case NodeTypeBlock: visit_node_list(&node->data.block.statements, visit, context); break; + case NodeTypeGroupedExpr: + visit_field(&node->data.grouped_expr, visit, context); + break; case NodeTypeReturnExpr: visit_field(&node->data.return_expr.expr, visit, context); break;