| author | |
| committer | |
| log | 3e93796e246f22bad43634682966390c15d7f936 |
| tree | 322908f080d1a6a48453824919f9274ec49a727f |
| parent | 5fdefe58e43730b3ce28306b8fe28d7bd70c736d |
closes #292.5 files changed, 18 insertions(+), 2 deletions(-)
src/all_types.hpp+2| ... | @@ -320,6 +320,7 @@ enum NodeType { | ... | @@ -320,6 +320,7 @@ enum NodeType { |
| 320 | NodeTypeFnDecl, | 320 | NodeTypeFnDecl, |
| 321 | NodeTypeParamDecl, | 321 | NodeTypeParamDecl, |
| 322 | NodeTypeBlock, | 322 | NodeTypeBlock, |
| 323 | NodeTypeGroupedExpr, | ||
| 323 | NodeTypeReturnExpr, | 324 | NodeTypeReturnExpr, |
| 324 | NodeTypeDefer, | 325 | NodeTypeDefer, |
| 325 | NodeTypeVariableDeclaration, | 326 | NodeTypeVariableDeclaration, |
| ... | @@ -793,6 +794,7 @@ struct AstNode { | ... | @@ -793,6 +794,7 @@ struct AstNode { |
| 793 | AstNodeFnProto fn_proto; | 794 | AstNodeFnProto fn_proto; |
| 794 | AstNodeParamDecl param_decl; | 795 | AstNodeParamDecl param_decl; |
| 795 | AstNodeBlock block; | 796 | AstNodeBlock block; |
| 797 | AstNode * grouped_expr; | ||
| 796 | AstNodeReturnExpr return_expr; | 798 | AstNodeReturnExpr return_expr; |
| 797 | AstNodeDefer defer; | 799 | AstNodeDefer defer; |
| 798 | AstNodeVariableDeclaration variable_declaration; | 800 | AstNodeVariableDeclaration variable_declaration; |
src/analyze.cpp+1| ... | @@ -2076,6 +2076,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) { | ... | @@ -2076,6 +2076,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) { |
| 2076 | case NodeTypeReturnExpr: | 2076 | case NodeTypeReturnExpr: |
| 2077 | case NodeTypeDefer: | 2077 | case NodeTypeDefer: |
| 2078 | case NodeTypeBlock: | 2078 | case NodeTypeBlock: |
| 2079 | case NodeTypeGroupedExpr: | ||
| 2079 | case NodeTypeBinOpExpr: | 2080 | case NodeTypeBinOpExpr: |
| 2080 | case NodeTypeUnwrapErrorExpr: | 2081 | case NodeTypeUnwrapErrorExpr: |
| 2081 | case NodeTypeFnCallExpr: | 2082 | case NodeTypeFnCallExpr: |
src/ast_render.cpp+7| ... | @@ -150,6 +150,8 @@ static const char *node_type_str(NodeType node_type) { | ... | @@ -150,6 +150,8 @@ static const char *node_type_str(NodeType node_type) { |
| 150 | return "ParamDecl"; | 150 | return "ParamDecl"; |
| 151 | case NodeTypeBlock: | 151 | case NodeTypeBlock: |
| 152 | return "Block"; | 152 | return "Block"; |
| 153 | case NodeTypeGroupedExpr: | ||
| 154 | return "Parens"; | ||
| 153 | case NodeTypeBinOpExpr: | 155 | case NodeTypeBinOpExpr: |
| 154 | return "BinOpExpr"; | 156 | return "BinOpExpr"; |
| 155 | case NodeTypeUnwrapErrorExpr: | 157 | case NodeTypeUnwrapErrorExpr: |
| ... | @@ -469,6 +471,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { | ... | @@ -469,6 +471,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { |
| 469 | print_indent(ar); | 471 | print_indent(ar); |
| 470 | fprintf(ar->f, "}"); | 472 | fprintf(ar->f, "}"); |
| 471 | break; | 473 | break; |
| 474 | case NodeTypeGroupedExpr: | ||
| 475 | fprintf(ar->f, "("); | ||
| 476 | render_node_ungrouped(ar, node->data.grouped_expr); | ||
| 477 | fprintf(ar->f, ")"); | ||
| 478 | break; | ||
| 472 | case NodeTypeReturnExpr: | 479 | case NodeTypeReturnExpr: |
| 473 | { | 480 | { |
| 474 | const char *return_str = return_string(node->data.return_expr.kind); | 481 | const char *return_str = return_string(node->data.return_expr.kind); |
src/ir.cpp+2| ... | @@ -5574,6 +5574,8 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop | ... | @@ -5574,6 +5574,8 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop |
| 5574 | zig_unreachable(); | 5574 | zig_unreachable(); |
| 5575 | case NodeTypeBlock: | 5575 | case NodeTypeBlock: |
| 5576 | return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval); | 5576 | return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval); |
| 5577 | case NodeTypeGroupedExpr: | ||
| 5578 | return ir_gen_node_raw(irb, node->data.grouped_expr, scope, lval); | ||
| 5577 | case NodeTypeBinOpExpr: | 5579 | case NodeTypeBinOpExpr: |
| 5578 | return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval); | 5580 | return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval); |
| 5579 | case NodeTypeNumberLiteral: | 5581 | case NodeTypeNumberLiteral: |
src/parser.cpp+6-2| ... | @@ -363,10 +363,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, size_t *token_index, bo | ... | @@ -363,10 +363,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, size_t *token_index, bo |
| 363 | return nullptr; | 363 | return nullptr; |
| 364 | } | 364 | } |
| 365 | } | 365 | } |
| 366 | |||
| 367 | *token_index += 1; | 366 | *token_index += 1; |
| 368 | 367 | ||
| 369 | AstNode *node = ast_parse_expression(pc, token_index, true); | 368 | AstNode *node = ast_create_node(pc, NodeTypeGroupedExpr, l_paren); |
| 369 | |||
| 370 | node->data.grouped_expr = ast_parse_expression(pc, token_index, true); | ||
| 370 | 371 | ||
| 371 | Token *r_paren = &pc->tokens->at(*token_index); | 372 | Token *r_paren = &pc->tokens->at(*token_index); |
| 372 | *token_index += 1; | 373 | *token_index += 1; |
| ... | @@ -2605,6 +2606,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont | ... | @@ -2605,6 +2606,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont |
| 2605 | case NodeTypeBlock: | 2606 | case NodeTypeBlock: |
| 2606 | visit_node_list(&node->data.block.statements, visit, context); | 2607 | visit_node_list(&node->data.block.statements, visit, context); |
| 2607 | break; | 2608 | break; |
| 2609 | case NodeTypeGroupedExpr: | ||
| 2610 | visit_field(&node->data.grouped_expr, visit, context); | ||
| 2611 | break; | ||
| 2608 | case NodeTypeReturnExpr: | 2612 | case NodeTypeReturnExpr: |
| 2609 | visit_field(&node->data.return_expr.expr, visit, context); | 2613 | visit_field(&node->data.return_expr.expr, visit, context); |
| 2610 | break; | 2614 | break; |