| ... | ... | @@ -68,7 +68,7 @@ fn renderRoot( |
| 68 | 68 | tree: *ast.Tree, |
| 69 | 69 | ) (@TypeOf(stream).Error || Error)!void { |
| 70 | 70 | // render all the line comments at the beginning of the file |
| 71 | | for (tree.tokens) |*token, i| { |
| 71 | for (tree.tokens) |token, i| { |
| 72 | 72 | if (token.id != .LineComment) break; |
| 73 | 73 | try stream.print("{}\n", .{mem.trimRight(u8, tree.tokenSlicePtr(token), " ")}); |
| 74 | 74 | const next_token = &tree.tokens[i + 1]; |
| ... | ... | @@ -321,10 +321,10 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, |
| 321 | 321 | |
| 322 | 322 | .DocComment => { |
| 323 | 323 | const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl); |
| 324 | | var it = comment.lines.iterator(0); |
| 325 | | while (it.next()) |line_token_index| { |
| 326 | | try renderToken(tree, stream, line_token_index.*, indent, start_col, .Newline); |
| 327 | | if (it.peek()) |_| { |
| 324 | var it = comment.lines.first; |
| 325 | while (it) |node| : (it = node.next) { |
| 326 | try renderToken(tree, stream, node.data, indent, start_col, .Newline); |
| 327 | if (node.next != null) { |
| 328 | 328 | try stream.writeByteNTimes(' ', indent); |
| 329 | 329 | } |
| 330 | 330 | } |
| ... | ... | @@ -355,20 +355,21 @@ fn renderExpression( |
| 355 | 355 | try renderToken(tree, stream, tree.nextToken(label), indent, start_col, Space.Space); |
| 356 | 356 | } |
| 357 | 357 | |
| 358 | | if (block.statements.len == 0) { |
| 358 | if (block.statements.first == null) { |
| 359 | 359 | try renderToken(tree, stream, block.lbrace, indent + indent_delta, start_col, Space.None); |
| 360 | 360 | return renderToken(tree, stream, block.rbrace, indent, start_col, space); |
| 361 | 361 | } else { |
| 362 | 362 | const block_indent = indent + indent_delta; |
| 363 | 363 | try renderToken(tree, stream, block.lbrace, block_indent, start_col, Space.Newline); |
| 364 | 364 | |
| 365 | | var it = block.statements.iterator(0); |
| 366 | | while (it.next()) |statement| { |
| 365 | var it = block.statements.first; |
| 366 | while (it) |statement_node| : (it = statement_node.next) { |
| 367 | const statement = statement_node.data; |
| 367 | 368 | try stream.writeByteNTimes(' ', block_indent); |
| 368 | | try renderStatement(allocator, stream, tree, block_indent, start_col, statement.*); |
| 369 | try renderStatement(allocator, stream, tree, block_indent, start_col, statement); |
| 369 | 370 | |
| 370 | | if (it.peek()) |next_statement| { |
| 371 | | try renderExtraNewline(tree, stream, start_col, next_statement.*); |
| 371 | if (statement_node.next) |next_statement| { |
| 372 | try renderExtraNewline(tree, stream, start_col, next_statement.data); |
| 372 | 373 | } |
| 373 | 374 | } |
| 374 | 375 | |
| ... | ... | @@ -620,7 +621,7 @@ fn renderExpression( |
| 620 | 621 | |
| 621 | 622 | const lparen = tree.nextToken(suffix_op.lhs.node.lastToken()); |
| 622 | 623 | |
| 623 | | if (call_info.params.len == 0) { |
| 624 | if (call_info.params.first == null) { |
| 624 | 625 | try renderToken(tree, stream, lparen, indent, start_col, Space.None); |
| 625 | 626 | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 626 | 627 | } |
| ... | ... | @@ -634,24 +635,26 @@ fn renderExpression( |
| 634 | 635 | const new_indent = indent + indent_delta; |
| 635 | 636 | try renderToken(tree, stream, lparen, new_indent, start_col, Space.Newline); |
| 636 | 637 | |
| 637 | | var it = call_info.params.iterator(0); |
| 638 | var it = call_info.params.first; |
| 638 | 639 | while (true) { |
| 639 | | const param_node = it.next().?; |
| 640 | const param_node_node = it.?; |
| 641 | it = param_node_node.next; |
| 642 | const param_node = param_node_node.data; |
| 640 | 643 | |
| 641 | | const param_node_new_indent = if (param_node.*.id == .MultilineStringLiteral) blk: { |
| 644 | const param_node_new_indent = if (param_node.id == .MultilineStringLiteral) blk: { |
| 642 | 645 | break :blk indent; |
| 643 | 646 | } else blk: { |
| 644 | 647 | try stream.writeByteNTimes(' ', new_indent); |
| 645 | 648 | break :blk new_indent; |
| 646 | 649 | }; |
| 647 | 650 | |
| 648 | | if (it.peek()) |next_node| { |
| 649 | | try renderExpression(allocator, stream, tree, param_node_new_indent, start_col, param_node.*, Space.None); |
| 650 | | const comma = tree.nextToken(param_node.*.lastToken()); |
| 651 | if (it) |next_node| { |
| 652 | try renderExpression(allocator, stream, tree, param_node_new_indent, start_col, param_node, Space.None); |
| 653 | const comma = tree.nextToken(param_node.lastToken()); |
| 651 | 654 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); // , |
| 652 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 655 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 653 | 656 | } else { |
| 654 | | try renderExpression(allocator, stream, tree, param_node_new_indent, start_col, param_node.*, Space.Comma); |
| 657 | try renderExpression(allocator, stream, tree, param_node_new_indent, start_col, param_node, Space.Comma); |
| 655 | 658 | try stream.writeByteNTimes(' ', indent); |
| 656 | 659 | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 657 | 660 | } |
| ... | ... | @@ -660,12 +663,13 @@ fn renderExpression( |
| 660 | 663 | |
| 661 | 664 | try renderToken(tree, stream, lparen, indent, start_col, Space.None); // ( |
| 662 | 665 | |
| 663 | | var it = call_info.params.iterator(0); |
| 664 | | while (it.next()) |param_node| { |
| 665 | | try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.None); |
| 666 | var it = call_info.params.first; |
| 667 | while (it) |param_node_node| : (it = param_node_node.next) { |
| 668 | const param_node = param_node_node.data; |
| 669 | try renderExpression(allocator, stream, tree, indent, start_col, param_node, Space.None); |
| 666 | 670 | |
| 667 | | if (it.peek() != null) { |
| 668 | | const comma = tree.nextToken(param_node.*.lastToken()); |
| 671 | if (param_node_node.next != null) { |
| 672 | const comma = tree.nextToken(param_node.lastToken()); |
| 669 | 673 | try renderToken(tree, stream, comma, indent, start_col, Space.Space); |
| 670 | 674 | } |
| 671 | 675 | } |
| ... | ... | @@ -736,7 +740,7 @@ fn renderExpression( |
| 736 | 740 | .node => |node| tree.nextToken(node.lastToken()), |
| 737 | 741 | }; |
| 738 | 742 | |
| 739 | | if (field_inits.len == 0) { |
| 743 | if (field_inits.first == null) { |
| 740 | 744 | switch (suffix_op.lhs) { |
| 741 | 745 | .dot => |dot| try renderToken(tree, stream, dot, indent, start_col, Space.None), |
| 742 | 746 | .node => |node| try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None), |
| ... | ... | @@ -757,18 +761,19 @@ fn renderExpression( |
| 757 | 761 | |
| 758 | 762 | const expr_outputs_one_line = blk: { |
| 759 | 763 | // render field expressions until a LF is found |
| 760 | | var it = field_inits.iterator(0); |
| 761 | | while (it.next()) |field_init| { |
| 764 | var it = field_inits.first; |
| 765 | while (it) |field_init_node| : (it = field_init_node.next) { |
| 766 | const field_init = field_init_node.data; |
| 762 | 767 | var find_stream = FindByteOutStream.init('\n'); |
| 763 | 768 | var dummy_col: usize = 0; |
| 764 | | try renderExpression(allocator, find_stream.outStream(), tree, 0, &dummy_col, field_init.*, Space.None); |
| 769 | try renderExpression(allocator, find_stream.outStream(), tree, 0, &dummy_col, field_init, Space.None); |
| 765 | 770 | if (find_stream.byte_found) break :blk false; |
| 766 | 771 | } |
| 767 | 772 | break :blk true; |
| 768 | 773 | }; |
| 769 | 774 | |
| 770 | | if (field_inits.len == 1) blk: { |
| 771 | | const field_init = field_inits.at(0).*.cast(ast.Node.FieldInitializer).?; |
| 775 | if (field_inits.first != null and field_inits.first.?.next == null) blk: { |
| 776 | const field_init = field_inits.first.?.data.cast(ast.Node.FieldInitializer).?; |
| 772 | 777 | |
| 773 | 778 | if (field_init.expr.cast(ast.Node.SuffixOp)) |nested_suffix_op| { |
| 774 | 779 | if (nested_suffix_op.op == .StructInitializer) { |
| ... | ... | @@ -798,15 +803,16 @@ fn renderExpression( |
| 798 | 803 | } |
| 799 | 804 | try renderToken(tree, stream, lbrace, indent, start_col, Space.Space); |
| 800 | 805 | |
| 801 | | var it = field_inits.iterator(0); |
| 802 | | while (it.next()) |field_init| { |
| 803 | | if (it.peek() != null) { |
| 804 | | try renderExpression(allocator, stream, tree, indent, start_col, field_init.*, Space.None); |
| 806 | var it = field_inits.first; |
| 807 | while (it) |field_init_node| : (it = field_init_node.next) { |
| 808 | const field_init = field_init_node.data; |
| 809 | if (field_init_node.next != null) { |
| 810 | try renderExpression(allocator, stream, tree, indent, start_col, field_init, Space.None); |
| 805 | 811 | |
| 806 | | const comma = tree.nextToken(field_init.*.lastToken()); |
| 812 | const comma = tree.nextToken(field_init.lastToken()); |
| 807 | 813 | try renderToken(tree, stream, comma, indent, start_col, Space.Space); |
| 808 | 814 | } else { |
| 809 | | try renderExpression(allocator, stream, tree, indent, start_col, field_init.*, Space.Space); |
| 815 | try renderExpression(allocator, stream, tree, indent, start_col, field_init, Space.Space); |
| 810 | 816 | } |
| 811 | 817 | } |
| 812 | 818 | |
| ... | ... | @@ -821,19 +827,20 @@ fn renderExpression( |
| 821 | 827 | } |
| 822 | 828 | try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline); |
| 823 | 829 | |
| 824 | | var it = field_inits.iterator(0); |
| 825 | | while (it.next()) |field_init| { |
| 830 | var it = field_inits.first; |
| 831 | while (it) |field_init_node| : (it = field_init_node.next) { |
| 832 | const field_init = field_init_node.data; |
| 826 | 833 | try stream.writeByteNTimes(' ', new_indent); |
| 827 | 834 | |
| 828 | | if (it.peek()) |next_field_init| { |
| 829 | | try renderExpression(allocator, stream, tree, new_indent, start_col, field_init.*, Space.None); |
| 835 | if (field_init_node.next) |next_field_init| { |
| 836 | try renderExpression(allocator, stream, tree, new_indent, start_col, field_init, Space.None); |
| 830 | 837 | |
| 831 | | const comma = tree.nextToken(field_init.*.lastToken()); |
| 838 | const comma = tree.nextToken(field_init.lastToken()); |
| 832 | 839 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Newline); |
| 833 | 840 | |
| 834 | | try renderExtraNewline(tree, stream, start_col, next_field_init.*); |
| 841 | try renderExtraNewline(tree, stream, start_col, next_field_init.data); |
| 835 | 842 | } else { |
| 836 | | try renderExpression(allocator, stream, tree, new_indent, start_col, field_init.*, Space.Comma); |
| 843 | try renderExpression(allocator, stream, tree, new_indent, start_col, field_init, Space.Comma); |
| 837 | 844 | } |
| 838 | 845 | } |
| 839 | 846 | |
| ... | ... | @@ -847,7 +854,7 @@ fn renderExpression( |
| 847 | 854 | .node => |node| tree.nextToken(node.lastToken()), |
| 848 | 855 | }; |
| 849 | 856 | |
| 850 | | if (exprs.len == 0) { |
| 857 | if (exprs.first == null) { |
| 851 | 858 | switch (suffix_op.lhs) { |
| 852 | 859 | .dot => |dot| try renderToken(tree, stream, dot, indent, start_col, Space.None), |
| 853 | 860 | .node => |node| try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None), |
| ... | ... | @@ -855,16 +862,17 @@ fn renderExpression( |
| 855 | 862 | try renderToken(tree, stream, lbrace, indent, start_col, Space.None); |
| 856 | 863 | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 857 | 864 | } |
| 858 | | if (exprs.len == 1 and tree.tokens[exprs.at(0).*.lastToken() + 1].id == .RBrace) { |
| 859 | | const expr = exprs.at(0).*; |
| 860 | | |
| 861 | | switch (suffix_op.lhs) { |
| 862 | | .dot => |dot| try renderToken(tree, stream, dot, indent, start_col, Space.None), |
| 863 | | .node => |node| try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None), |
| 865 | if (exprs.first) |first_expr_node| { |
| 866 | const expr = first_expr_node.data; |
| 867 | if (first_expr_node.next == null and tree.tokens[expr.lastToken() + 1].id == .RBrace) { |
| 868 | switch (suffix_op.lhs) { |
| 869 | .dot => |dot| try renderToken(tree, stream, dot, indent, start_col, Space.None), |
| 870 | .node => |node| try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None), |
| 871 | } |
| 872 | try renderToken(tree, stream, lbrace, indent, start_col, Space.None); |
| 873 | try renderExpression(allocator, stream, tree, indent, start_col, expr, Space.None); |
| 874 | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 864 | 875 | } |
| 865 | | try renderToken(tree, stream, lbrace, indent, start_col, Space.None); |
| 866 | | try renderExpression(allocator, stream, tree, indent, start_col, expr, Space.None); |
| 867 | | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 868 | 876 | } |
| 869 | 877 | |
| 870 | 878 | switch (suffix_op.lhs) { |
| ... | ... | @@ -875,16 +883,18 @@ fn renderExpression( |
| 875 | 883 | // scan to find row size |
| 876 | 884 | const maybe_row_size: ?usize = blk: { |
| 877 | 885 | var count: usize = 1; |
| 878 | | var it = exprs.iterator(0); |
| 886 | var it = exprs.first; |
| 879 | 887 | while (true) { |
| 880 | | const expr = it.next().?.*; |
| 881 | | if (it.peek()) |next_expr| { |
| 882 | | const expr_last_token = expr.*.lastToken() + 1; |
| 883 | | const loc = tree.tokenLocation(tree.tokens[expr_last_token].end, next_expr.*.firstToken()); |
| 888 | const expr_node = it.?; |
| 889 | it = expr_node.next; |
| 890 | const expr = expr_node.data; |
| 891 | if (expr_node.next) |next_expr| { |
| 892 | const expr_last_token = expr.lastToken() + 1; |
| 893 | const loc = tree.tokenLocation(tree.tokens[expr_last_token].end, next_expr.data.firstToken()); |
| 884 | 894 | if (loc.line != 0) break :blk count; |
| 885 | 895 | count += 1; |
| 886 | 896 | } else { |
| 887 | | const expr_last_token = expr.*.lastToken(); |
| 897 | const expr_last_token = expr.lastToken(); |
| 888 | 898 | const loc = tree.tokenLocation(tree.tokens[expr_last_token].end, suffix_op.rtoken); |
| 889 | 899 | if (loc.line == 0) { |
| 890 | 900 | // all on one line |
| ... | ... | @@ -905,7 +915,8 @@ fn renderExpression( |
| 905 | 915 | |
| 906 | 916 | if (maybe_row_size) |row_size| { |
| 907 | 917 | // A place to store the width of each expression and its column's maximum |
| 908 | | var widths = try allocator.alloc(usize, exprs.len + row_size); |
| 918 | const exprs_len = countLen(exprs.first); |
| 919 | var widths = try allocator.alloc(usize, exprs_len + row_size); |
| 909 | 920 | defer allocator.free(widths); |
| 910 | 921 | mem.set(usize, widths, 0); |
| 911 | 922 | |
| ... | ... | @@ -915,13 +926,14 @@ fn renderExpression( |
| 915 | 926 | // Null stream for counting the printed length of each expression |
| 916 | 927 | var counting_stream = std.io.countingOutStream(std.io.null_out_stream); |
| 917 | 928 | |
| 918 | | var it = exprs.iterator(0); |
| 929 | var it = exprs.first; |
| 919 | 930 | var i: usize = 0; |
| 920 | 931 | |
| 921 | | while (it.next()) |expr| : (i += 1) { |
| 932 | while (it) |expr_node| : ({i += 1; it = expr_node.next;}) { |
| 933 | const expr = expr_node.data; |
| 922 | 934 | counting_stream.bytes_written = 0; |
| 923 | 935 | var dummy_col: usize = 0; |
| 924 | | try renderExpression(allocator, counting_stream.outStream(), tree, indent, &dummy_col, expr.*, Space.None); |
| 936 | try renderExpression(allocator, counting_stream.outStream(), tree, indent, &dummy_col, expr, Space.None); |
| 925 | 937 | const width = @intCast(usize, counting_stream.bytes_written); |
| 926 | 938 | const col = i % row_size; |
| 927 | 939 | column_widths[col] = std.math.max(column_widths[col], width); |
| ... | ... | @@ -938,14 +950,16 @@ fn renderExpression( |
| 938 | 950 | try renderToken(tree, stream, lbrace, new_indent, start_col, Space.None); |
| 939 | 951 | } |
| 940 | 952 | |
| 941 | | it.set(0); |
| 953 | it = exprs.first; |
| 942 | 954 | i = 0; |
| 943 | 955 | var col: usize = 1; |
| 944 | | while (it.next()) |expr| : (i += 1) { |
| 945 | | if (it.peek()) |next_expr| { |
| 946 | | try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.None); |
| 956 | var last_node = it.?; |
| 957 | while (it) |expr_node| : ({i += 1; it = expr_node.next; last_node = expr_node;}) { |
| 958 | const expr = expr_node.data; |
| 959 | if (expr_node.next) |next_expr| { |
| 960 | try renderExpression(allocator, stream, tree, new_indent, start_col, expr, Space.None); |
| 947 | 961 | |
| 948 | | const comma = tree.nextToken(expr.*.lastToken()); |
| 962 | const comma = tree.nextToken(expr.lastToken()); |
| 949 | 963 | |
| 950 | 964 | if (col != row_size) { |
| 951 | 965 | try renderToken(tree, stream, comma, new_indent, start_col, Space.Space); // , |
| ... | ... | @@ -964,29 +978,29 @@ fn renderExpression( |
| 964 | 978 | try renderToken(tree, stream, comma, new_indent, start_col, Space.None); // , |
| 965 | 979 | } |
| 966 | 980 | |
| 967 | | try renderExtraNewline(tree, stream, start_col, next_expr.*); |
| 968 | | if (next_expr.*.id != .MultilineStringLiteral) { |
| 981 | try renderExtraNewline(tree, stream, start_col, next_expr.data); |
| 982 | if (next_expr.data.id != .MultilineStringLiteral) { |
| 969 | 983 | try stream.writeByteNTimes(' ', new_indent); |
| 970 | 984 | } |
| 971 | 985 | } else { |
| 972 | | try renderExpression(allocator, stream, tree, new_indent, start_col, expr.*, Space.Comma); // , |
| 986 | try renderExpression(allocator, stream, tree, new_indent, start_col, expr, Space.Comma); // , |
| 973 | 987 | } |
| 974 | 988 | } |
| 975 | | const last_node = it.prev().?; |
| 976 | | if (last_node.*.id != .MultilineStringLiteral) { |
| 989 | if (last_node.data.id != .MultilineStringLiteral) { |
| 977 | 990 | try stream.writeByteNTimes(' ', indent); |
| 978 | 991 | } |
| 979 | 992 | return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); |
| 980 | 993 | } else { |
| 981 | 994 | try renderToken(tree, stream, lbrace, indent, start_col, Space.Space); |
| 982 | | var it = exprs.iterator(0); |
| 983 | | while (it.next()) |expr| { |
| 984 | | if (it.peek()) |next_expr| { |
| 985 | | try renderExpression(allocator, stream, tree, indent, start_col, expr.*, Space.None); |
| 986 | | const comma = tree.nextToken(expr.*.lastToken()); |
| 995 | var it = exprs.first; |
| 996 | while (it) |expr_node| : (it = expr_node.next) { |
| 997 | const expr = expr_node.data; |
| 998 | if (expr_node.next) |next_expr| { |
| 999 | try renderExpression(allocator, stream, tree, indent, start_col, expr, Space.None); |
| 1000 | const comma = tree.nextToken(expr.lastToken()); |
| 987 | 1001 | try renderToken(tree, stream, comma, indent, start_col, Space.Space); // , |
| 988 | 1002 | } else { |
| 989 | | try renderExpression(allocator, stream, tree, indent, start_col, expr.*, Space.Space); |
| 1003 | try renderExpression(allocator, stream, tree, indent, start_col, expr, Space.Space); |
| 990 | 1004 | } |
| 991 | 1005 | } |
| 992 | 1006 | |
| ... | ... | @@ -1176,7 +1190,7 @@ fn renderExpression( |
| 1176 | 1190 | }, |
| 1177 | 1191 | } |
| 1178 | 1192 | |
| 1179 | | if (container_decl.fields_and_decls.len == 0) { |
| 1193 | if (container_decl.fields_and_decls.first == null) { |
| 1180 | 1194 | try renderToken(tree, stream, container_decl.lbrace_token, indent + indent_delta, start_col, Space.None); // { |
| 1181 | 1195 | return renderToken(tree, stream, container_decl.rbrace_token, indent, start_col, space); // } |
| 1182 | 1196 | } |
| ... | ... | @@ -1193,15 +1207,16 @@ fn renderExpression( |
| 1193 | 1207 | // Check if the first declaration and the { are on the same line |
| 1194 | 1208 | const src_has_newline = !tree.tokensOnSameLine( |
| 1195 | 1209 | container_decl.lbrace_token, |
| 1196 | | container_decl.fields_and_decls.at(0).*.firstToken(), |
| 1210 | container_decl.fields_and_decls.first.?.data.firstToken(), |
| 1197 | 1211 | ); |
| 1198 | 1212 | |
| 1199 | 1213 | // We can only print all the elements in-line if all the |
| 1200 | 1214 | // declarations inside are fields |
| 1201 | 1215 | const src_has_only_fields = blk: { |
| 1202 | | var it = container_decl.fields_and_decls.iterator(0); |
| 1203 | | while (it.next()) |decl| { |
| 1204 | | if (decl.*.id != .ContainerField) break :blk false; |
| 1216 | var it = container_decl.fields_and_decls.first; |
| 1217 | while (it) |decl_node| : (it = decl_node.next) { |
| 1218 | const decl = decl_node.data; |
| 1219 | if (decl.id != .ContainerField) break :blk false; |
| 1205 | 1220 | } |
| 1206 | 1221 | break :blk true; |
| 1207 | 1222 | }; |
| ... | ... | @@ -1211,13 +1226,14 @@ fn renderExpression( |
| 1211 | 1226 | const new_indent = indent + indent_delta; |
| 1212 | 1227 | try renderToken(tree, stream, container_decl.lbrace_token, new_indent, start_col, .Newline); // { |
| 1213 | 1228 | |
| 1214 | | var it = container_decl.fields_and_decls.iterator(0); |
| 1215 | | while (it.next()) |decl| { |
| 1229 | var it = container_decl.fields_and_decls.first; |
| 1230 | while (it) |decl_node| : (it = decl_node.next) { |
| 1231 | const decl = decl_node.data; |
| 1216 | 1232 | try stream.writeByteNTimes(' ', new_indent); |
| 1217 | | try renderContainerDecl(allocator, stream, tree, new_indent, start_col, decl.*, .Newline); |
| 1233 | try renderContainerDecl(allocator, stream, tree, new_indent, start_col, decl, .Newline); |
| 1218 | 1234 | |
| 1219 | | if (it.peek()) |next_decl| { |
| 1220 | | try renderExtraNewline(tree, stream, start_col, next_decl.*); |
| 1235 | if (decl_node.next) |next_decl| { |
| 1236 | try renderExtraNewline(tree, stream, start_col, next_decl.data); |
| 1221 | 1237 | } |
| 1222 | 1238 | } |
| 1223 | 1239 | |
| ... | ... | @@ -1230,10 +1246,11 @@ fn renderExpression( |
| 1230 | 1246 | const new_indent = indent + indent_delta; |
| 1231 | 1247 | try stream.writeByteNTimes(' ', new_indent); |
| 1232 | 1248 | |
| 1233 | | var it = container_decl.fields_and_decls.iterator(0); |
| 1234 | | while (it.next()) |decl| { |
| 1235 | | const space_after_decl: Space = if (it.peek() == null) .Newline else .Space; |
| 1236 | | try renderContainerDecl(allocator, stream, tree, new_indent, start_col, decl.*, space_after_decl); |
| 1249 | var it = container_decl.fields_and_decls.first; |
| 1250 | while (it) |decl_node| : (it = decl_node.next) { |
| 1251 | const decl = decl_node.data; |
| 1252 | const space_after_decl: Space = if (decl_node.next == null) .Newline else .Space; |
| 1253 | try renderContainerDecl(allocator, stream, tree, new_indent, start_col, decl, space_after_decl); |
| 1237 | 1254 | } |
| 1238 | 1255 | |
| 1239 | 1256 | try stream.writeByteNTimes(' ', indent); |
| ... | ... | @@ -1241,9 +1258,10 @@ fn renderExpression( |
| 1241 | 1258 | // All the declarations on the same line |
| 1242 | 1259 | try renderToken(tree, stream, container_decl.lbrace_token, indent, start_col, .Space); // { |
| 1243 | 1260 | |
| 1244 | | var it = container_decl.fields_and_decls.iterator(0); |
| 1245 | | while (it.next()) |decl| { |
| 1246 | | try renderContainerDecl(allocator, stream, tree, indent, start_col, decl.*, .Space); |
| 1261 | var it = container_decl.fields_and_decls.first; |
| 1262 | while (it) |decl_node| : (it = decl_node.next) { |
| 1263 | const decl = decl_node.data; |
| 1264 | try renderContainerDecl(allocator, stream, tree, indent, start_col, decl, .Space); |
| 1247 | 1265 | } |
| 1248 | 1266 | } |
| 1249 | 1267 | |
| ... | ... | @@ -1255,14 +1273,14 @@ fn renderExpression( |
| 1255 | 1273 | |
| 1256 | 1274 | const lbrace = tree.nextToken(err_set_decl.error_token); |
| 1257 | 1275 | |
| 1258 | | if (err_set_decl.decls.len == 0) { |
| 1276 | if (err_set_decl.decls.first == null) { |
| 1259 | 1277 | try renderToken(tree, stream, err_set_decl.error_token, indent, start_col, Space.None); |
| 1260 | 1278 | try renderToken(tree, stream, lbrace, indent, start_col, Space.None); |
| 1261 | 1279 | return renderToken(tree, stream, err_set_decl.rbrace_token, indent, start_col, space); |
| 1262 | 1280 | } |
| 1263 | 1281 | |
| 1264 | | if (err_set_decl.decls.len == 1) blk: { |
| 1265 | | const node = err_set_decl.decls.at(0).*; |
| 1282 | if (err_set_decl.decls.first.?.next == null) blk: { |
| 1283 | const node = err_set_decl.decls.first.?.data; |
| 1266 | 1284 | |
| 1267 | 1285 | // if there are any doc comments or same line comments |
| 1268 | 1286 | // don't try to put it all on one line |
| ... | ... | @@ -1289,17 +1307,18 @@ fn renderExpression( |
| 1289 | 1307 | try renderToken(tree, stream, lbrace, indent, start_col, Space.Newline); // { |
| 1290 | 1308 | const new_indent = indent + indent_delta; |
| 1291 | 1309 | |
| 1292 | | var it = err_set_decl.decls.iterator(0); |
| 1293 | | while (it.next()) |node| { |
| 1310 | var it = err_set_decl.decls.first; |
| 1311 | while (it) |node_node| : (it = node_node.next) { |
| 1312 | const node = node_node.data; |
| 1294 | 1313 | try stream.writeByteNTimes(' ', new_indent); |
| 1295 | 1314 | |
| 1296 | | if (it.peek()) |next_node| { |
| 1297 | | try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.None); |
| 1298 | | try renderToken(tree, stream, tree.nextToken(node.*.lastToken()), new_indent, start_col, Space.Newline); // , |
| 1315 | if (node_node.next) |next_node| { |
| 1316 | try renderExpression(allocator, stream, tree, new_indent, start_col, node, Space.None); |
| 1317 | try renderToken(tree, stream, tree.nextToken(node.lastToken()), new_indent, start_col, Space.Newline); // , |
| 1299 | 1318 | |
| 1300 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 1319 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 1301 | 1320 | } else { |
| 1302 | | try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma); |
| 1321 | try renderExpression(allocator, stream, tree, new_indent, start_col, node, Space.Comma); |
| 1303 | 1322 | } |
| 1304 | 1323 | } |
| 1305 | 1324 | |
| ... | ... | @@ -1308,17 +1327,18 @@ fn renderExpression( |
| 1308 | 1327 | } else { |
| 1309 | 1328 | try renderToken(tree, stream, lbrace, indent, start_col, Space.Space); // { |
| 1310 | 1329 | |
| 1311 | | var it = err_set_decl.decls.iterator(0); |
| 1312 | | while (it.next()) |node| { |
| 1313 | | if (it.peek()) |next_node| { |
| 1314 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None); |
| 1330 | var it = err_set_decl.decls.first; |
| 1331 | while (it) |node_node| : (it = node_node.next) { |
| 1332 | const node = node_node.data; |
| 1333 | if (node_node.next) |next_node| { |
| 1334 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None); |
| 1315 | 1335 | |
| 1316 | | const comma_token = tree.nextToken(node.*.lastToken()); |
| 1336 | const comma_token = tree.nextToken(node.lastToken()); |
| 1317 | 1337 | assert(tree.tokens[comma_token].id == .Comma); |
| 1318 | 1338 | try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // , |
| 1319 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 1339 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 1320 | 1340 | } else { |
| 1321 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Space); |
| 1341 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.Space); |
| 1322 | 1342 | } |
| 1323 | 1343 | } |
| 1324 | 1344 | |
| ... | ... | @@ -1344,9 +1364,9 @@ fn renderExpression( |
| 1344 | 1364 | skip_first_indent = false; |
| 1345 | 1365 | } |
| 1346 | 1366 | |
| 1347 | | var i: usize = 0; |
| 1348 | | while (i < multiline_str_literal.lines.len) : (i += 1) { |
| 1349 | | const t = multiline_str_literal.lines.at(i).*; |
| 1367 | var it = multiline_str_literal.lines.first; |
| 1368 | while (it) |t_node| : (it = t_node.next) { |
| 1369 | const t = t_node.data; |
| 1350 | 1370 | if (!skip_first_indent) { |
| 1351 | 1371 | try stream.writeByteNTimes(' ', indent + indent_delta); |
| 1352 | 1372 | } |
| ... | ... | @@ -1366,8 +1386,12 @@ fn renderExpression( |
| 1366 | 1386 | try renderToken(tree, stream, builtin_call.builtin_token, indent, start_col, Space.None); // @name |
| 1367 | 1387 | |
| 1368 | 1388 | const src_params_trailing_comma = blk: { |
| 1369 | | if (builtin_call.params.len < 2) break :blk false; |
| 1370 | | const last_node = builtin_call.params.at(builtin_call.params.len - 1).*; |
| 1389 | if (builtin_call.params.first == null or |
| 1390 | builtin_call.params.first.?.next == null) |
| 1391 | { |
| 1392 | break :blk false; |
| 1393 | } |
| 1394 | const last_node = findLast(builtin_call.params.first.?).data; |
| 1371 | 1395 | const maybe_comma = tree.nextToken(last_node.lastToken()); |
| 1372 | 1396 | break :blk tree.tokens[maybe_comma].id == .Comma; |
| 1373 | 1397 | }; |
| ... | ... | @@ -1378,12 +1402,13 @@ fn renderExpression( |
| 1378 | 1402 | try renderToken(tree, stream, lparen, indent, start_col, Space.None); // ( |
| 1379 | 1403 | |
| 1380 | 1404 | // render all on one line, no trailing comma |
| 1381 | | var it = builtin_call.params.iterator(0); |
| 1382 | | while (it.next()) |param_node| { |
| 1383 | | try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.None); |
| 1405 | var it = builtin_call.params.first; |
| 1406 | while (it) |param_node_node| : (it = param_node_node.next) { |
| 1407 | const param_node = param_node_node.data; |
| 1408 | try renderExpression(allocator, stream, tree, indent, start_col, param_node, Space.None); |
| 1384 | 1409 | |
| 1385 | | if (it.peek() != null) { |
| 1386 | | const comma_token = tree.nextToken(param_node.*.lastToken()); |
| 1410 | if (param_node_node.next != null) { |
| 1411 | const comma_token = tree.nextToken(param_node.lastToken()); |
| 1387 | 1412 | try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // , |
| 1388 | 1413 | } |
| 1389 | 1414 | } |
| ... | ... | @@ -1392,10 +1417,11 @@ fn renderExpression( |
| 1392 | 1417 | const new_indent = indent + indent_delta; |
| 1393 | 1418 | try renderToken(tree, stream, lparen, new_indent, start_col, Space.Newline); // ( |
| 1394 | 1419 | |
| 1395 | | var it = builtin_call.params.iterator(0); |
| 1396 | | while (it.next()) |param_node| { |
| 1420 | var it = builtin_call.params.first; |
| 1421 | while (it) |param_node_node| : (it = param_node_node.next) { |
| 1422 | const param_node = param_node_node.data; |
| 1397 | 1423 | try stream.writeByteNTimes(' ', new_indent); |
| 1398 | | try renderExpression(allocator, stream, tree, indent, start_col, param_node.*, Space.Comma); |
| 1424 | try renderExpression(allocator, stream, tree, indent, start_col, param_node, Space.Comma); |
| 1399 | 1425 | } |
| 1400 | 1426 | try stream.writeByteNTimes(' ', indent); |
| 1401 | 1427 | } |
| ... | ... | @@ -1457,12 +1483,13 @@ fn renderExpression( |
| 1457 | 1483 | try renderToken(tree, stream, lparen, indent, start_col, Space.None); // ( |
| 1458 | 1484 | |
| 1459 | 1485 | // render all on one line, no trailing comma |
| 1460 | | var it = fn_proto.params.iterator(0); |
| 1461 | | while (it.next()) |param_decl_node| { |
| 1462 | | try renderParamDecl(allocator, stream, tree, indent, start_col, param_decl_node.*, Space.None); |
| 1486 | var it = fn_proto.params.first; |
| 1487 | while (it) |param_decl_node_node| : (it = param_decl_node_node.next) { |
| 1488 | const param_decl_node = param_decl_node_node.data; |
| 1489 | try renderParamDecl(allocator, stream, tree, indent, start_col, param_decl_node, Space.None); |
| 1463 | 1490 | |
| 1464 | | if (it.peek() != null) { |
| 1465 | | const comma = tree.nextToken(param_decl_node.*.lastToken()); |
| 1491 | if (param_decl_node_node.next != null) { |
| 1492 | const comma = tree.nextToken(param_decl_node.lastToken()); |
| 1466 | 1493 | try renderToken(tree, stream, comma, indent, start_col, Space.Space); // , |
| 1467 | 1494 | } |
| 1468 | 1495 | } |
| ... | ... | @@ -1471,10 +1498,11 @@ fn renderExpression( |
| 1471 | 1498 | const new_indent = indent + indent_delta; |
| 1472 | 1499 | try renderToken(tree, stream, lparen, new_indent, start_col, Space.Newline); // ( |
| 1473 | 1500 | |
| 1474 | | var it = fn_proto.params.iterator(0); |
| 1475 | | while (it.next()) |param_decl_node| { |
| 1501 | var it = fn_proto.params.first; |
| 1502 | while (it) |param_decl_node_node| : (it = param_decl_node_node.next) { |
| 1503 | const param_decl_node = param_decl_node_node.data; |
| 1476 | 1504 | try stream.writeByteNTimes(' ', new_indent); |
| 1477 | | try renderParamDecl(allocator, stream, tree, new_indent, start_col, param_decl_node.*, Space.Comma); |
| 1505 | try renderParamDecl(allocator, stream, tree, new_indent, start_col, param_decl_node, Space.Comma); |
| 1478 | 1506 | } |
| 1479 | 1507 | try stream.writeByteNTimes(' ', indent); |
| 1480 | 1508 | } |
| ... | ... | @@ -1553,7 +1581,7 @@ fn renderExpression( |
| 1553 | 1581 | const rparen = tree.nextToken(switch_node.expr.lastToken()); |
| 1554 | 1582 | const lbrace = tree.nextToken(rparen); |
| 1555 | 1583 | |
| 1556 | | if (switch_node.cases.len == 0) { |
| 1584 | if (switch_node.cases.first == null) { |
| 1557 | 1585 | try renderExpression(allocator, stream, tree, indent, start_col, switch_node.expr, Space.None); |
| 1558 | 1586 | try renderToken(tree, stream, rparen, indent, start_col, Space.Space); // ) |
| 1559 | 1587 | try renderToken(tree, stream, lbrace, indent, start_col, Space.None); // { |
| ... | ... | @@ -1567,13 +1595,14 @@ fn renderExpression( |
| 1567 | 1595 | try renderToken(tree, stream, rparen, indent, start_col, Space.Space); // ) |
| 1568 | 1596 | try renderToken(tree, stream, lbrace, new_indent, start_col, Space.Newline); // { |
| 1569 | 1597 | |
| 1570 | | var it = switch_node.cases.iterator(0); |
| 1571 | | while (it.next()) |node| { |
| 1598 | var it = switch_node.cases.first; |
| 1599 | while (it) |node_node| : (it = node_node.next) { |
| 1600 | const node = node_node.data; |
| 1572 | 1601 | try stream.writeByteNTimes(' ', new_indent); |
| 1573 | | try renderExpression(allocator, stream, tree, new_indent, start_col, node.*, Space.Comma); |
| 1602 | try renderExpression(allocator, stream, tree, new_indent, start_col, node, Space.Comma); |
| 1574 | 1603 | |
| 1575 | | if (it.peek()) |next_node| { |
| 1576 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 1604 | if (node_node.next) |next_node| { |
| 1605 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 1577 | 1606 | } |
| 1578 | 1607 | } |
| 1579 | 1608 | |
| ... | ... | @@ -1584,38 +1613,40 @@ fn renderExpression( |
| 1584 | 1613 | .SwitchCase => { |
| 1585 | 1614 | const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base); |
| 1586 | 1615 | |
| 1587 | | assert(switch_case.items.len != 0); |
| 1616 | assert(switch_case.items.first != null); |
| 1588 | 1617 | const src_has_trailing_comma = blk: { |
| 1589 | | const last_node = switch_case.items.at(switch_case.items.len - 1).*; |
| 1618 | const last_node = findLast(switch_case.items.first.?).data; |
| 1590 | 1619 | const maybe_comma = tree.nextToken(last_node.lastToken()); |
| 1591 | 1620 | break :blk tree.tokens[maybe_comma].id == .Comma; |
| 1592 | 1621 | }; |
| 1593 | 1622 | |
| 1594 | | if (switch_case.items.len == 1 or !src_has_trailing_comma) { |
| 1595 | | var it = switch_case.items.iterator(0); |
| 1596 | | while (it.next()) |node| { |
| 1597 | | if (it.peek()) |next_node| { |
| 1598 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None); |
| 1623 | if (switch_case.items.first.?.next == null or !src_has_trailing_comma) { |
| 1624 | var it = switch_case.items.first; |
| 1625 | while (it) |node_node| : (it = node_node.next) { |
| 1626 | const node = node_node.data; |
| 1627 | if (node_node.next) |next_node| { |
| 1628 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None); |
| 1599 | 1629 | |
| 1600 | | const comma_token = tree.nextToken(node.*.lastToken()); |
| 1630 | const comma_token = tree.nextToken(node.lastToken()); |
| 1601 | 1631 | try renderToken(tree, stream, comma_token, indent, start_col, Space.Space); // , |
| 1602 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 1632 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 1603 | 1633 | } else { |
| 1604 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Space); |
| 1634 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.Space); |
| 1605 | 1635 | } |
| 1606 | 1636 | } |
| 1607 | 1637 | } else { |
| 1608 | | var it = switch_case.items.iterator(0); |
| 1609 | | while (it.next()) |node| { |
| 1610 | | if (it.peek()) |next_node| { |
| 1611 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.None); |
| 1638 | var it = switch_case.items.first; |
| 1639 | while (it) |node_node| : (it = node_node.next) { |
| 1640 | const node = node_node.data; |
| 1641 | if (node_node.next) |next_node| { |
| 1642 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.None); |
| 1612 | 1643 | |
| 1613 | | const comma_token = tree.nextToken(node.*.lastToken()); |
| 1644 | const comma_token = tree.nextToken(node.lastToken()); |
| 1614 | 1645 | try renderToken(tree, stream, comma_token, indent, start_col, Space.Newline); // , |
| 1615 | | try renderExtraNewline(tree, stream, start_col, next_node.*); |
| 1646 | try renderExtraNewline(tree, stream, start_col, next_node.data); |
| 1616 | 1647 | try stream.writeByteNTimes(' ', indent); |
| 1617 | 1648 | } else { |
| 1618 | | try renderExpression(allocator, stream, tree, indent, start_col, node.*, Space.Comma); |
| 1649 | try renderExpression(allocator, stream, tree, indent, start_col, node, Space.Comma); |
| 1619 | 1650 | try stream.writeByteNTimes(' ', indent); |
| 1620 | 1651 | } |
| 1621 | 1652 | } |
| ... | ... | @@ -1887,7 +1918,7 @@ fn renderExpression( |
| 1887 | 1918 | try renderToken(tree, stream, tree.nextToken(asm_node.asm_token), indent, start_col, Space.None); // ( |
| 1888 | 1919 | } |
| 1889 | 1920 | |
| 1890 | | if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1921 | if (asm_node.outputs.first == null and asm_node.inputs.first == null and asm_node.clobbers.first == null) { |
| 1891 | 1922 | try renderExpression(allocator, stream, tree, indent, start_col, asm_node.template, Space.None); |
| 1892 | 1923 | return renderToken(tree, stream, asm_node.rparen, indent, start_col, space); |
| 1893 | 1924 | } |
| ... | ... | @@ -1907,7 +1938,7 @@ fn renderExpression( |
| 1907 | 1938 | const colon1 = tree.nextToken(asm_node.template.lastToken()); |
| 1908 | 1939 | const indent_extra = indent_once + 2; |
| 1909 | 1940 | |
| 1910 | | const colon2 = if (asm_node.outputs.len == 0) blk: { |
| 1941 | const colon2 = if (asm_node.outputs.first == null) blk: { |
| 1911 | 1942 | try renderToken(tree, stream, colon1, indent, start_col, Space.Newline); // : |
| 1912 | 1943 | try stream.writeByteNTimes(' ', indent_once); |
| 1913 | 1944 | |
| ... | ... | @@ -1915,21 +1946,23 @@ fn renderExpression( |
| 1915 | 1946 | } else blk: { |
| 1916 | 1947 | try renderToken(tree, stream, colon1, indent, start_col, Space.Space); // : |
| 1917 | 1948 | |
| 1918 | | var it = asm_node.outputs.iterator(0); |
| 1949 | var it = asm_node.outputs.first; |
| 1919 | 1950 | while (true) { |
| 1920 | | const asm_output = it.next().?; |
| 1921 | | const node = &(asm_output.*).base; |
| 1951 | const asm_output_node = it.?; |
| 1952 | it = asm_output_node.next; |
| 1953 | const asm_output = asm_output_node.data; |
| 1954 | const node = &asm_output.base; |
| 1922 | 1955 | |
| 1923 | | if (it.peek()) |next_asm_output| { |
| 1956 | if (asm_output_node.next) |next_asm_output| { |
| 1924 | 1957 | try renderExpression(allocator, stream, tree, indent_extra, start_col, node, Space.None); |
| 1925 | | const next_node = &(next_asm_output.*).base; |
| 1958 | const next_node = &next_asm_output.data.base; |
| 1926 | 1959 | |
| 1927 | | const comma = tree.prevToken(next_asm_output.*.firstToken()); |
| 1960 | const comma = tree.prevToken(next_asm_output.data.firstToken()); |
| 1928 | 1961 | try renderToken(tree, stream, comma, indent_extra, start_col, Space.Newline); // , |
| 1929 | 1962 | try renderExtraNewline(tree, stream, start_col, next_node); |
| 1930 | 1963 | |
| 1931 | 1964 | try stream.writeByteNTimes(' ', indent_extra); |
| 1932 | | } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1965 | } else if (asm_node.inputs.first == null and asm_node.clobbers.first == null) { |
| 1933 | 1966 | try renderExpression(allocator, stream, tree, indent_extra, start_col, node, Space.Newline); |
| 1934 | 1967 | try stream.writeByteNTimes(' ', indent); |
| 1935 | 1968 | return renderToken(tree, stream, asm_node.rparen, indent, start_col, space); |
| ... | ... | @@ -1945,7 +1978,7 @@ fn renderExpression( |
| 1945 | 1978 | } |
| 1946 | 1979 | }; |
| 1947 | 1980 | |
| 1948 | | const colon3 = if (asm_node.inputs.len == 0) blk: { |
| 1981 | const colon3 = if (asm_node.inputs.first == null) blk: { |
| 1949 | 1982 | try renderToken(tree, stream, colon2, indent, start_col, Space.Newline); // : |
| 1950 | 1983 | try stream.writeByteNTimes(' ', indent_once); |
| 1951 | 1984 | |
| ... | ... | @@ -1953,21 +1986,22 @@ fn renderExpression( |
| 1953 | 1986 | } else blk: { |
| 1954 | 1987 | try renderToken(tree, stream, colon2, indent, start_col, Space.Space); // : |
| 1955 | 1988 | |
| 1956 | | var it = asm_node.inputs.iterator(0); |
| 1989 | var it = asm_node.inputs.first; |
| 1957 | 1990 | while (true) { |
| 1958 | | const asm_input = it.next().?; |
| 1959 | | const node = &(asm_input.*).base; |
| 1991 | const asm_input_node = it.?; |
| 1992 | it = asm_input_node.next; |
| 1993 | const node = &asm_input_node.data.base; |
| 1960 | 1994 | |
| 1961 | | if (it.peek()) |next_asm_input| { |
| 1995 | if (it) |next_asm_input| { |
| 1962 | 1996 | try renderExpression(allocator, stream, tree, indent_extra, start_col, node, Space.None); |
| 1963 | | const next_node = &(next_asm_input.*).base; |
| 1997 | const next_node = &next_asm_input.data.base; |
| 1964 | 1998 | |
| 1965 | | const comma = tree.prevToken(next_asm_input.*.firstToken()); |
| 1999 | const comma = tree.prevToken(next_asm_input.data.firstToken()); |
| 1966 | 2000 | try renderToken(tree, stream, comma, indent_extra, start_col, Space.Newline); // , |
| 1967 | 2001 | try renderExtraNewline(tree, stream, start_col, next_node); |
| 1968 | 2002 | |
| 1969 | 2003 | try stream.writeByteNTimes(' ', indent_extra); |
| 1970 | | } else if (asm_node.clobbers.len == 0) { |
| 2004 | } else if (asm_node.clobbers.first == null) { |
| 1971 | 2005 | try renderExpression(allocator, stream, tree, indent_extra, start_col, node, Space.Newline); |
| 1972 | 2006 | try stream.writeByteNTimes(' ', indent); |
| 1973 | 2007 | return renderToken(tree, stream, asm_node.rparen, indent, start_col, space); // ) |
| ... | ... | @@ -1985,11 +2019,13 @@ fn renderExpression( |
| 1985 | 2019 | |
| 1986 | 2020 | try renderToken(tree, stream, colon3, indent, start_col, Space.Space); // : |
| 1987 | 2021 | |
| 1988 | | var it = asm_node.clobbers.iterator(0); |
| 2022 | var it = asm_node.clobbers.first; |
| 1989 | 2023 | while (true) { |
| 1990 | | const clobber_node = it.next().?.*; |
| 2024 | const clobber_node_node = it.?; |
| 2025 | it = clobber_node_node.next; |
| 2026 | const clobber_node = clobber_node_node.data; |
| 1991 | 2027 | |
| 1992 | | if (it.peek() == null) { |
| 2028 | if (it == null) { |
| 1993 | 2029 | try renderExpression(allocator, stream, tree, indent_extra, start_col, clobber_node, Space.Newline); |
| 1994 | 2030 | try stream.writeByteNTimes(' ', indent); |
| 1995 | 2031 | return renderToken(tree, stream, asm_node.rparen, indent, start_col, space); |
| ... | ... | @@ -2401,14 +2437,15 @@ fn renderDocComments( |
| 2401 | 2437 | start_col: *usize, |
| 2402 | 2438 | ) (@TypeOf(stream).Error || Error)!void { |
| 2403 | 2439 | const comment = node.doc_comments orelse return; |
| 2404 | | var it = comment.lines.iterator(0); |
| 2440 | var it = comment.lines.first; |
| 2405 | 2441 | const first_token = node.firstToken(); |
| 2406 | | while (it.next()) |line_token_index| { |
| 2407 | | if (line_token_index.* < first_token) { |
| 2408 | | try renderToken(tree, stream, line_token_index.*, indent, start_col, Space.Newline); |
| 2442 | while (it) |line_token_index_node| : (it = line_token_index_node.next) { |
| 2443 | const line_token_index = line_token_index_node.data; |
| 2444 | if (line_token_index < first_token) { |
| 2445 | try renderToken(tree, stream, line_token_index, indent, start_col, Space.Newline); |
| 2409 | 2446 | try stream.writeByteNTimes(' ', indent); |
| 2410 | 2447 | } else { |
| 2411 | | try renderToken(tree, stream, line_token_index.*, indent, start_col, Space.NoComment); |
| 2448 | try renderToken(tree, stream, line_token_index, indent, start_col, Space.NoComment); |
| 2412 | 2449 | try stream.writeAll("\n"); |
| 2413 | 2450 | try stream.writeByteNTimes(' ', indent); |
| 2414 | 2451 | } |
| ... | ... | @@ -2473,3 +2510,19 @@ fn copyFixingWhitespace(stream: var, slice: []const u8) @TypeOf(stream).Error!vo |
| 2473 | 2510 | else => try stream.writeByte(byte), |
| 2474 | 2511 | }; |
| 2475 | 2512 | } |
| 2513 | |
| 2514 | fn countLen(node: ?*std.SinglyLinkedList(*ast.Node).Node) usize { |
| 2515 | var count: usize = 0; |
| 2516 | var it = node; |
| 2517 | while (it) |n| : (it = n.next) { |
| 2518 | count += 1; |
| 2519 | } |
| 2520 | return count; |
| 2521 | } |
| 2522 | |
| 2523 | fn findLast(node: *std.SinglyLinkedList(*ast.Node).Node) *std.SinglyLinkedList(*ast.Node).Node { |
| 2524 | var it = node; |
| 2525 | while (true) { |
| 2526 | it = it.next orelse return it; |
| 2527 | } |
| 2528 | } |