| ... | @@ -534,36 +534,42 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -534,36 +534,42 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 534 | | 534 | |
| 535 | // scan to find row size | 535 | // scan to find row size |
| 536 | const maybe_row_size: ?usize = blk: { | 536 | const maybe_row_size: ?usize = blk: { |
| 537 | var count: usize = 0; | 537 | var count: usize = 1; |
| 538 | var it = exprs.iterator(0); | 538 | var it = exprs.iterator(0); |
| 539 | var prev_token = (??it.peek()).*.lastToken() + 1; | 539 | while (true) { |
| 540 | while (it.next()) |expr| { | 540 | const expr = (??it.next()).*; |
| 541 | const expr_last_token = expr.*.lastToken() + 1; | 541 | if (it.peek()) |next_expr| { |
| 542 | const next_token = tree.tokens.at(expr_last_token + 1); | 542 | const expr_last_token = expr.*.lastToken() + 1; |
| 543 | const loc = tree.tokenLocationPtr(tree.tokens.at(prev_token).end, next_token); | 543 | const loc = tree.tokenLocation(tree.tokens.at(expr_last_token).end, next_expr.*.firstToken()); |
| 544 | if (loc.line != 0) break :blk null; | 544 | if (loc.line != 0) break :blk count; |
| 545 | if (next_token.id == Token.Id.LineComment) { | 545 | count += 1; |
| 546 | const trimmed = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " "); | 546 | } else { |
| 547 | if (trimmed.len == 2) { | 547 | const expr_last_token = expr.*.lastToken(); |
| 548 | break :blk count; | 548 | const loc = tree.tokenLocation(tree.tokens.at(expr_last_token).end, suffix_op.rtoken); |
| 549 | } else { | 549 | if (loc.line == 0) { |
| 550 | break :blk null; | 550 | // all on one line |
| | 551 | const src_has_trailing_comma = trailblk: { |
| | 552 | const maybe_comma = tree.prevToken(suffix_op.rtoken); |
| | 553 | break :trailblk tree.tokens.at(maybe_comma).id == Token.Id.Comma; |
| | 554 | }; |
| | 555 | if (src_has_trailing_comma) { |
| | 556 | break :blk 1; // force row size 1 |
| | 557 | } else { |
| | 558 | break :blk null; // no newlines |
| | 559 | } |
| 551 | } | 560 | } |
| | 561 | break :blk count; |
| 552 | } | 562 | } |
| 553 | prev_token = expr_last_token; | | |
| 554 | count += 1; | | |
| 555 | } | 563 | } |
| 556 | break :blk null; | | |
| 557 | }; | 564 | }; |
| 558 | | 565 | |
| 559 | | | |
| 560 | if (maybe_row_size) |row_size| { | 566 | if (maybe_row_size) |row_size| { |
| 561 | const new_indent = indent + indent_delta; | 567 | const new_indent = indent + indent_delta; |
| 562 | try renderToken(tree, stream, lbrace, new_indent, Space.Newline); | 568 | try renderToken(tree, stream, lbrace, new_indent, Space.Newline); |
| 563 | try stream.writeByteNTimes(' ', new_indent); | 569 | try stream.writeByteNTimes(' ', new_indent); |
| 564 | | 570 | |
| 565 | var it = exprs.iterator(0); | 571 | var it = exprs.iterator(0); |
| 566 | var i: usize = 0; | 572 | var i: usize = 1; |
| 567 | while (it.next()) |expr| { | 573 | while (it.next()) |expr| { |
| 568 | if (it.peek()) |next_expr| { | 574 | if (it.peek()) |next_expr| { |
| 569 | try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None); | 575 | try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None); |
| ... | @@ -571,23 +577,16 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -571,23 +577,16 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 571 | const comma = tree.nextToken(expr.*.lastToken()); | 577 | const comma = tree.nextToken(expr.*.lastToken()); |
| 572 | | 578 | |
| 573 | if (i != row_size) { | 579 | if (i != row_size) { |
| 574 | try renderToken(tree, stream, comma, new_indent, Space.IgnoreEmptyComment); // , | 580 | try renderToken(tree, stream, comma, new_indent, Space.Space); // , |
| 575 | i += 1; | 581 | i += 1; |
| 576 | continue; | 582 | continue; |
| 577 | } | 583 | } |
| 578 | i = 0; | 584 | i = 1; |
| 579 | | | |
| 580 | try renderToken(tree, stream, comma, new_indent, Space.NoIndent); // , | | |
| 581 | | 585 | |
| 582 | const next_token = tree.tokens.at(comma + 1); | 586 | try renderToken(tree, stream, comma, new_indent, Space.Newline); // , |
| 583 | if (next_token.id != Token.Id.LineComment) { | | |
| 584 | try stream.print(" //\n"); | | |
| 585 | } | | |
| 586 | | 587 | |
| 587 | try renderExtraNewline(tree, stream, next_expr.*); | 588 | try renderExtraNewline(tree, stream, next_expr.*); |
| 588 | try stream.writeByteNTimes(' ', new_indent); | 589 | try stream.writeByteNTimes(' ', new_indent); |
| 589 | } else if (i == row_size) { | | |
| 590 | try renderTrailingCommaAndEmptyComment(allocator, stream, tree, new_indent, expr.*); // , // | | |
| 591 | } else { | 590 | } else { |
| 592 | try renderTrailingComma(allocator, stream, tree, new_indent, expr.*, Space.Newline); // , | 591 | try renderTrailingComma(allocator, stream, tree, new_indent, expr.*, Space.Newline); // , |
| 593 | } | 592 | } |
| ... | @@ -595,50 +594,22 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -595,50 +594,22 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 595 | try stream.writeByteNTimes(' ', indent); | 594 | try stream.writeByteNTimes(' ', indent); |
| 596 | try renderToken(tree, stream, suffix_op.rtoken, indent, space); | 595 | try renderToken(tree, stream, suffix_op.rtoken, indent, space); |
| 597 | return; | 596 | return; |
| 598 | } | 597 | } else { |
| 599 | | | |
| 600 | const src_has_trailing_comma = blk: { | | |
| 601 | const maybe_comma = tree.prevToken(suffix_op.rtoken); | | |
| 602 | break :blk tree.tokens.at(maybe_comma).id == Token.Id.Comma; | | |
| 603 | }; | | |
| 604 | if (!src_has_trailing_comma) { | | |
| 605 | try renderToken(tree, stream, lbrace, indent, Space.Space); | 598 | try renderToken(tree, stream, lbrace, indent, Space.Space); |
| 606 | var it = exprs.iterator(0); | 599 | var it = exprs.iterator(0); |
| 607 | while (it.next()) |expr| { | 600 | while (it.next()) |expr| { |
| 608 | try renderExpression(allocator, stream, tree, indent, expr.*, Space.None); | | |
| 609 | | | |
| 610 | if (it.peek()) |next_expr| { | 601 | if (it.peek()) |next_expr| { |
| | 602 | try renderExpression(allocator, stream, tree, indent, expr.*, Space.None); |
| 611 | const comma = tree.nextToken(expr.*.lastToken()); | 603 | const comma = tree.nextToken(expr.*.lastToken()); |
| 612 | try renderToken(tree, stream, comma, indent, Space.Space); // , | 604 | try renderToken(tree, stream, comma, indent, Space.Space); // , |
| | 605 | } else { |
| | 606 | try renderExpression(allocator, stream, tree, indent, expr.*, Space.Space); |
| 613 | } | 607 | } |
| 614 | } | 608 | } |
| 615 | | 609 | |
| 616 | try renderToken(tree, stream, suffix_op.rtoken, indent, space); | 610 | try renderToken(tree, stream, suffix_op.rtoken, indent, space); |
| 617 | return; | 611 | return; |
| 618 | } | 612 | } |
| 619 | | | |
| 620 | const new_indent = indent + indent_delta; | | |
| 621 | try renderToken(tree, stream, lbrace, new_indent, Space.Newline); | | |
| 622 | try stream.writeByteNTimes(' ', new_indent); | | |
| 623 | | | |
| 624 | var it = exprs.iterator(0); | | |
| 625 | while (it.next()) |expr| { | | |
| 626 | | | |
| 627 | if (it.peek()) |next_expr| { | | |
| 628 | try renderExpression(allocator, stream, tree, new_indent, expr.*, Space.None); | | |
| 629 | | | |
| 630 | const comma = tree.nextToken(expr.*.lastToken()); | | |
| 631 | try renderToken(tree, stream, comma, new_indent, Space.Newline); // , | | |
| 632 | | | |
| 633 | try renderExtraNewline(tree, stream, next_expr.*); | | |
| 634 | try stream.writeByteNTimes(' ', new_indent); | | |
| 635 | } else { | | |
| 636 | try renderTrailingComma(allocator, stream, tree, new_indent, expr.*, Space.Newline); | | |
| 637 | } | | |
| 638 | } | | |
| 639 | | | |
| 640 | try stream.writeByteNTimes(' ', indent); | | |
| 641 | try renderToken(tree, stream, suffix_op.rtoken, indent, space); | | |
| 642 | }, | 613 | }, |
| 643 | } | 614 | } |
| 644 | }, | 615 | }, |