Commit 3e93796e24
Changed files (5)
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;
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:
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);
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:
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;