| ... | ... | @@ -1449,7 +1449,24 @@ pub const Parser = struct { |
| 1449 | 1449 | @panic("TODO: inline asm"); |
| 1450 | 1450 | }, |
| 1451 | 1451 | Token.Id.Keyword_if => { |
| 1452 | | @panic("TODO: inline if"); |
| 1452 | const node = try arena.create(ast.NodeIf); |
| 1453 | *node = ast.NodeIf { |
| 1454 | .base = self.initNode(ast.Node.Id.If), |
| 1455 | .if_token = token, |
| 1456 | .condition = undefined, |
| 1457 | .payload = null, |
| 1458 | .body = undefined, |
| 1459 | .@"else" = null, |
| 1460 | }; |
| 1461 | dest_ptr.store(&node.base); |
| 1462 | |
| 1463 | stack.append(State { .Else = &node.@"else" }) catch unreachable; |
| 1464 | try stack.append(State { .Expression = DestPtr { .Field = &node.body } }); |
| 1465 | try stack.append(State { .ValuePayload = &node.payload }); |
| 1466 | try stack.append(State { .ExpectToken = Token.Id.RParen }); |
| 1467 | try stack.append(State { .Expression = DestPtr { .Field = &node.condition } }); |
| 1468 | try stack.append(State { .ExpectToken = Token.Id.LParen }); |
| 1469 | continue; |
| 1453 | 1470 | }, |
| 1454 | 1471 | Token.Id.Keyword_inline => { |
| 1455 | 1472 | stack.append(State { |
| ... | ... | @@ -2188,6 +2205,15 @@ pub const Parser = struct { |
| 2188 | 2205 | |
| 2189 | 2206 | n = for_node.body; |
| 2190 | 2207 | }, |
| 2208 | ast.Node.Id.If => { |
| 2209 | const if_node = @fieldParentPtr(ast.NodeIf, "base", n); |
| 2210 | if (if_node.@"else") |@"else"| { |
| 2211 | n = @"else".base; |
| 2212 | continue; |
| 2213 | } |
| 2214 | |
| 2215 | n = if_node.body; |
| 2216 | }, |
| 2191 | 2217 | ast.Node.Id.Else => { |
| 2192 | 2218 | const else_node = @fieldParentPtr(ast.NodeElse, "base", n); |
| 2193 | 2219 | n = else_node.body; |
| ... | ... | @@ -3363,14 +3389,19 @@ pub const Parser = struct { |
| 3363 | 3389 | const else_node = @fieldParentPtr(ast.NodeElse, "base", base); |
| 3364 | 3390 | try stream.print("{} ", self.tokenizer.getTokenSlice(else_node.else_token)); |
| 3365 | 3391 | |
| 3366 | | if (else_node.body.id == ast.Node.Id.Block) { |
| 3367 | | try stack.append(RenderState { .Expression = else_node.body }); |
| 3368 | | } else { |
| 3369 | | try stack.append(RenderState { .Indent = indent }); |
| 3370 | | try stack.append(RenderState { .Expression = else_node.body }); |
| 3371 | | try stack.append(RenderState.PrintIndent); |
| 3372 | | try stack.append(RenderState { .Indent = indent + indent_delta }); |
| 3373 | | try stack.append(RenderState { .Text = "\n" }); |
| 3392 | switch (else_node.body.id) { |
| 3393 | ast.Node.Id.Block, ast.Node.Id.If, |
| 3394 | ast.Node.Id.For, ast.Node.Id.While, |
| 3395 | ast.Node.Id.Switch => { |
| 3396 | try stack.append(RenderState { .Expression = else_node.body }); |
| 3397 | }, |
| 3398 | else => { |
| 3399 | try stack.append(RenderState { .Indent = indent }); |
| 3400 | try stack.append(RenderState { .Expression = else_node.body }); |
| 3401 | try stack.append(RenderState.PrintIndent); |
| 3402 | try stack.append(RenderState { .Indent = indent + indent_delta }); |
| 3403 | try stack.append(RenderState { .Text = "\n" }); |
| 3404 | } |
| 3374 | 3405 | } |
| 3375 | 3406 | |
| 3376 | 3407 | if (else_node.payload) |payload| { |
| ... | ... | @@ -3396,6 +3427,7 @@ pub const Parser = struct { |
| 3396 | 3427 | if (while_node.body.id == ast.Node.Id.Block) { |
| 3397 | 3428 | try stack.append(RenderState { .Text = " " }); |
| 3398 | 3429 | } else { |
| 3430 | try stack.append(RenderState.PrintIndent); |
| 3399 | 3431 | try stack.append(RenderState { .Text = "\n" }); |
| 3400 | 3432 | } |
| 3401 | 3433 | } |
| ... | ... | @@ -3445,6 +3477,7 @@ pub const Parser = struct { |
| 3445 | 3477 | if (for_node.body.id == ast.Node.Id.Block) { |
| 3446 | 3478 | try stack.append(RenderState { .Text = " " }); |
| 3447 | 3479 | } else { |
| 3480 | try stack.append(RenderState.PrintIndent); |
| 3448 | 3481 | try stack.append(RenderState { .Text = "\n" }); |
| 3449 | 3482 | } |
| 3450 | 3483 | } |
| ... | ... | @@ -3469,6 +3502,53 @@ pub const Parser = struct { |
| 3469 | 3502 | try stack.append(RenderState { .Expression = for_node.array_expr }); |
| 3470 | 3503 | try stack.append(RenderState { .Text = "(" }); |
| 3471 | 3504 | }, |
| 3505 | ast.Node.Id.If => { |
| 3506 | const if_node = @fieldParentPtr(ast.NodeIf, "base", base); |
| 3507 | try stream.print("{} ", self.tokenizer.getTokenSlice(if_node.if_token)); |
| 3508 | |
| 3509 | switch (if_node.body.id) { |
| 3510 | ast.Node.Id.Block, ast.Node.Id.If, |
| 3511 | ast.Node.Id.For, ast.Node.Id.While, |
| 3512 | ast.Node.Id.Switch => { |
| 3513 | if (if_node.@"else") |@"else"| { |
| 3514 | try stack.append(RenderState { .Expression = &@"else".base }); |
| 3515 | |
| 3516 | if (if_node.body.id == ast.Node.Id.Block) { |
| 3517 | try stack.append(RenderState { .Text = " " }); |
| 3518 | } else { |
| 3519 | try stack.append(RenderState.PrintIndent); |
| 3520 | try stack.append(RenderState { .Text = "\n" }); |
| 3521 | } |
| 3522 | } |
| 3523 | }, |
| 3524 | else => { |
| 3525 | if (if_node.@"else") |@"else"| { |
| 3526 | try stack.append(RenderState { .Expression = @"else".body }); |
| 3527 | |
| 3528 | if (@"else".payload) |payload| { |
| 3529 | try stack.append(RenderState { .Text = " " }); |
| 3530 | try stack.append(RenderState { .Expression = &payload.base }); |
| 3531 | } |
| 3532 | |
| 3533 | try stack.append(RenderState { .Text = " " }); |
| 3534 | try stack.append(RenderState { .Text = self.tokenizer.getTokenSlice(@"else".else_token) }); |
| 3535 | try stack.append(RenderState { .Text = " " }); |
| 3536 | } |
| 3537 | } |
| 3538 | } |
| 3539 | |
| 3540 | try stack.append(RenderState { .Expression = if_node.body }); |
| 3541 | try stack.append(RenderState { .Text = " " }); |
| 3542 | |
| 3543 | if (if_node.payload) |payload| { |
| 3544 | try stack.append(RenderState { .Expression = &payload.base }); |
| 3545 | try stack.append(RenderState { .Text = " " }); |
| 3546 | } |
| 3547 | |
| 3548 | try stack.append(RenderState { .Text = ")" }); |
| 3549 | try stack.append(RenderState { .Expression = if_node.condition }); |
| 3550 | try stack.append(RenderState { .Text = "(" }); |
| 3551 | }, |
| 3472 | 3552 | |
| 3473 | 3553 | ast.Node.Id.StructField, |
| 3474 | 3554 | ast.Node.Id.UnionTag, |
| ... | ... | @@ -4210,8 +4290,7 @@ test "zig fmt: if" { |
| 4210 | 4290 | \\ unreachable; |
| 4211 | 4291 | \\ } |
| 4212 | 4292 | \\ |
| 4213 | | \\ if (10 < 0) |
| 4214 | | \\ unreachable; |
| 4293 | \\ if (10 < 0) unreachable; |
| 4215 | 4294 | \\ |
| 4216 | 4295 | \\ if (10 < 0) { |
| 4217 | 4296 | \\ unreachable; |