authorgravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-08-31 23:39:30+10:00
committergravatar for lachlan@lakebythewoods.xyzLachlan Easton <lachlan@lakebythewoods.xyz> 2020-08-31 23:39:50+10:00
log5aca3baea62326dee301ec29c567dc224baa4a08
tree66897f2950cb209d463601c90cd37d02ee0d5280
parent50c8a53188bdd20321990b7a4999f534b9e613dd

zig fmt: Remove dynamic stack from auto-indenting-stream


7 files changed, 68 insertions(+), 82 deletions(-)

lib/std/io.zig+2-2
......@@ -191,10 +191,10 @@ pub const BufferedAtomicFile = @import("io/buffered_atomic_file.zig").BufferedAt
191191pub const StreamSource = @import("io/stream_source.zig").StreamSource;
192192
193193/// A Writer that doesn't write to anything.
194pub var null_writer = @as(NullWriter, .{ .context = {} });
194pub const null_writer = @as(NullWriter, .{ .context = {} });
195195
196196/// Deprecated: use `null_writer`
197pub var null_out_stream = null_writer;
197pub const null_out_stream = null_writer;
198198
199199const NullWriter = Writer(void, error{}, dummyWrite);
200200/// Deprecated: use NullWriter
lib/std/io/auto_indenting_stream.zig+22-36
......@@ -1,37 +1,31 @@
11const std = @import("../std.zig");
22const io = std.io;
33const mem = std.mem;
4const Allocator = mem.Allocator;
5const ArrayList = std.ArrayList;
64const assert = std.debug.assert;
75
86/// Automatically inserts indentation of written data by keeping
97/// track of the current indentation level
10pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: type) type {
8pub fn AutoIndentingStream(comptime WriterType: type) type {
119 return struct {
1210 const Self = @This();
1311 pub const Error = WriterType.Error;
14 pub const PushError = Allocator.Error;
1512 pub const Writer = io.Writer(*Self, Error, write);
16 const Stack = ArrayList(usize);
1713
1814 writer_pointer: *WriterType,
19 indent_stack: Stack,
2015
16 indent_stack: usize = 0,
17 indent_delta: usize,
2118 current_line_empty: bool = true,
2219 indent_one_shot_count: usize = 0, // automatically popped when applied
2320 applied_indent: usize = 0, // the most recently applied indent
2421 indent_next_line: usize = 0, // not used until the next line
2522
26 pub fn init(writer_pointer: *WriterType, allocator: *Allocator) Self {
27 var indent_stack = Stack.init(allocator);
28 return Self{ .writer_pointer = writer_pointer, .indent_stack = indent_stack };
23 pub fn init(indent_delta: usize, writer_pointer: *WriterType) Self {
24 return Self{ .writer_pointer = writer_pointer, .indent_delta = indent_delta };
2925 }
3026
3127 /// Release all allocated memory.
32 pub fn deinit(self: Self) void {
33 self.indent_stack.deinit();
34 }
28 pub fn deinit(self: Self) void {}
3529
3630 pub fn writer(self: *Self) Writer {
3731 return .{ .context = self };
......@@ -71,21 +65,16 @@ pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: ty
7165 }
7266
7367 /// Push default indentation
74 pub fn pushIndent(self: *Self) PushError!void {
68 pub fn pushIndent(self: *Self) void {
7569 // Doesn't actually write any indentation.
7670 // Just primes the stream to be able to write the correct indentation if it needs to.
77 try self.pushIndentN(indent_delta);
78 }
79
80 /// Push an indent of arbitrary width
81 pub fn pushIndentN(self: *Self, n: usize) PushError!void {
82 try self.indent_stack.append(n);
71 self.indent_stack += 1;
8372 }
8473
8574 /// Push an indent that is automatically popped after being applied
86 pub fn pushIndentOneShot(self: *Self) PushError!void {
75 pub fn pushIndentOneShot(self: *Self) void {
8776 self.indent_one_shot_count += 1;
88 try self.pushIndent();
77 self.pushIndent();
8978 }
9079
9180 /// Turns all one-shot indents into regular indents
......@@ -97,15 +86,15 @@ pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: ty
9786 }
9887
9988 /// Push an indent that should not take effect until the next line
100 pub fn pushIndentNextLine(self: *Self) PushError!void {
89 pub fn pushIndentNextLine(self: *Self) void {
10190 self.indent_next_line += 1;
102 try self.pushIndent();
91 self.pushIndent();
10392 }
10493
10594 pub fn popIndent(self: *Self) void {
106 assert(self.indent_stack.items.len != 0);
107 self.indent_stack.items.len -= 1;
108 self.indent_next_line = std.math.min(self.indent_stack.items.len, self.indent_next_line); // Tentative indent may have been popped before there was a newline
95 assert(self.indent_stack != 0);
96 self.indent_stack -= 1;
97 self.indent_next_line = std.math.min(self.indent_stack, self.indent_next_line); // Tentative indent may have been popped before there was a newline
10998 }
11099
111100 /// Writes ' ' bytes if the current line is empty
......@@ -116,7 +105,7 @@ pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: ty
116105 self.applied_indent = current_indent;
117106 }
118107
119 self.indent_stack.items.len -= self.indent_one_shot_count;
108 self.indent_stack -= self.indent_one_shot_count;
120109 self.indent_one_shot_count = 0;
121110 self.current_line_empty = false;
122111 }
......@@ -129,11 +118,9 @@ pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: ty
129118
130119 fn currentIndent(self: *Self) usize {
131120 var indent_current: usize = 0;
132 if (self.indent_stack.items.len > 0) {
133 const stack_top = self.indent_stack.items.len - self.indent_next_line;
134 for (self.indent_stack.items[0..stack_top]) |indent| {
135 indent_current += indent;
136 }
121 if (self.indent_stack > 0) {
122 const stack_top = self.indent_stack - self.indent_next_line;
123 indent_current = stack_top * self.indent_delta;
137124 }
138125 return indent_current;
139126 }
......@@ -141,10 +128,9 @@ pub fn AutoIndentingStream(comptime indent_delta: usize, comptime WriterType: ty
141128}
142129
143130pub fn autoIndentingStream(
144 comptime indent_delta: usize,
131 indent_delta: usize,
145132 underlying_stream: anytype,
146 allocator: *Allocator,
147) AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child) {
133) AutoIndentingStream(@TypeOf(underlying_stream).Child) {
148134 comptime assert(@typeInfo(@TypeOf(underlying_stream)) == .Pointer);
149 return AutoIndentingStream(indent_delta, @TypeOf(underlying_stream).Child).init(underlying_stream, allocator);
135 return AutoIndentingStream(@TypeOf(underlying_stream).Child).init(indent_delta, underlying_stream);
150136}
lib/std/io/change_detection_stream.zig+2-2
......@@ -11,11 +11,11 @@ pub fn ChangeDetectionStream(comptime WriterType: type) type {
1111 pub const Writer = io.Writer(*Self, Error, write);
1212
1313 anything_changed: bool = false,
14 writer_pointer: *WriterType,
14 writer_pointer: *const WriterType,
1515 source_index: usize,
1616 source: []const u8,
1717
18 pub fn init(source: []const u8, writer_pointer: *WriterType) Self {
18 pub fn init(source: []const u8, writer_pointer: *const WriterType) Self {
1919 return Self{
2020 .writer_pointer = writer_pointer,
2121 .source_index = 0,
lib/std/io/find_byte_out_stream.zig+2-2
......@@ -10,11 +10,11 @@ pub fn FindByteOutStream(comptime WriterType: type) type {
1010 pub const Error = WriterType.Error;
1111 pub const Writer = io.Writer(*Self, Error, write);
1212
13 writer_pointer: *WriterType,
13 writer_pointer: *const WriterType,
1414 byte_found: bool,
1515 byte: u8,
1616
17 pub fn init(byte: u8, writer_pointer: *WriterType) Self {
17 pub fn init(byte: u8, writer_pointer: *const WriterType) Self {
1818 return Self{
1919 .writer_pointer = writer_pointer,
2020 .byte = byte,
lib/std/target.zig+1-1
......@@ -101,7 +101,7 @@ pub const Target = struct {
101101
102102 /// Latest Windows version that the Zig Standard Library is aware of
103103 pub const latest = WindowsVersion.win10_20h1;
104
104
105105 pub const Range = struct {
106106 min: WindowsVersion,
107107 max: WindowsVersion,
lib/std/zig/parser_test.zig+5-5
......@@ -2827,7 +2827,7 @@ test "zig fmt: inline asm" {
28272827 \\ return asm volatile ("syscall"
28282828 \\ : [ret] "={rax}" (-> usize)
28292829 \\ : [number] "{rax}" (number),
2830 \\ [arg1] "{rdi}" (arg1)
2830 \\ [arg1] "{rdi}" (arg1)
28312831 \\ : "rcx", "r11"
28322832 \\ );
28332833 \\}
......@@ -2930,14 +2930,14 @@ test "zig fmt: inline asm parameter alignment" {
29302930 \\ \\ foo
29312931 \\ \\ bar
29322932 \\ : [_] "" (-> usize),
2933 \\ [_] "" (-> usize)
2933 \\ [_] "" (-> usize)
29342934 \\ );
29352935 \\ asm volatile (
29362936 \\ \\ foo
29372937 \\ \\ bar
29382938 \\ :
29392939 \\ : [_] "" (0),
2940 \\ [_] "" (0)
2940 \\ [_] "" (0)
29412941 \\ );
29422942 \\ asm volatile (
29432943 \\ \\ foo
......@@ -2950,9 +2950,9 @@ test "zig fmt: inline asm parameter alignment" {
29502950 \\ \\ foo
29512951 \\ \\ bar
29522952 \\ : [_] "" (-> usize),
2953 \\ [_] "" (-> usize)
2953 \\ [_] "" (-> usize)
29542954 \\ : [_] "" (0),
2955 \\ [_] "" (0)
2955 \\ [_] "" (0)
29562956 \\ : "", ""
29572957 \\ );
29582958 \\}
lib/std/zig/render.zig+34-34
......@@ -24,7 +24,7 @@ pub fn render(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tree) (meta
2424
2525 var s = stream.*;
2626 var change_detection_stream = std.io.changeDetectionStream(tree.source, &s);
27 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &change_detection_stream, allocator);
27 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &change_detection_stream);
2828 defer auto_indenting_stream.deinit();
2929
3030 try renderRoot(allocator, &auto_indenting_stream, tree);
......@@ -389,11 +389,11 @@ fn renderExpression(
389389 }
390390
391391 if (block.statements.len == 0) {
392 try stream.pushIndentNextLine();
392 stream.pushIndentNextLine();
393393 defer stream.popIndent();
394394 try renderToken(tree, stream, block.lbrace, Space.None);
395395 } else {
396 try stream.pushIndentNextLine();
396 stream.pushIndentNextLine();
397397 defer stream.popIndent();
398398
399399 try renderToken(tree, stream, block.lbrace, Space.Newline);
......@@ -463,7 +463,7 @@ fn renderExpression(
463463 try renderExpression(allocator, stream, tree, payload, Space.Space);
464464 }
465465
466 try stream.pushIndentOneShot();
466 stream.pushIndentOneShot();
467467 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);
468468 },
469469
......@@ -524,7 +524,7 @@ fn renderExpression(
524524 };
525525
526526 try renderToken(tree, stream, infix_op_node.op_token, after_op_space);
527 try stream.pushIndentOneShot();
527 stream.pushIndentOneShot();
528528 return renderExpression(allocator, stream, tree, infix_op_node.rhs, space);
529529 },
530530
......@@ -718,7 +718,7 @@ fn renderExpression(
718718 }
719719
720720 {
721 try stream.pushIndent();
721 stream.pushIndent();
722722 defer stream.popIndent();
723723 try renderToken(tree, stream, lbrace, Space.None);
724724 }
......@@ -783,7 +783,7 @@ fn renderExpression(
783783
784784 // Null stream for counting the printed length of each expression
785785 var counting_stream = std.io.countingOutStream(std.io.null_out_stream);
786 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &counting_stream, allocator);
786 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &counting_stream);
787787 defer auto_indenting_stream.deinit();
788788
789789 for (exprs) |expr, i| {
......@@ -796,7 +796,7 @@ fn renderExpression(
796796 }
797797
798798 {
799 try stream.pushIndentNextLine();
799 stream.pushIndentNextLine();
800800 defer stream.popIndent();
801801 try renderToken(tree, stream, lbrace, Space.Newline);
802802
......@@ -880,7 +880,7 @@ fn renderExpression(
880880 }
881881
882882 {
883 try stream.pushIndentNextLine();
883 stream.pushIndentNextLine();
884884 defer stream.popIndent();
885885 try renderToken(tree, stream, lbrace, Space.None);
886886 }
......@@ -902,7 +902,7 @@ fn renderExpression(
902902 // render field expressions until a LF is found
903903 for (field_inits) |field_init| {
904904 var find_stream = std.io.findByteOutStream('\n', &std.io.null_out_stream);
905 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &find_stream, allocator);
905 var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, &find_stream);
906906 defer auto_indenting_stream.deinit();
907907
908908 try renderExpression(allocator, &auto_indenting_stream, tree, field_init, Space.None);
......@@ -963,7 +963,7 @@ fn renderExpression(
963963 .node => |node| try renderExpression(allocator, stream, tree, node, Space.None),
964964 }
965965
966 try stream.pushIndentNextLine();
966 stream.pushIndentNextLine();
967967 defer stream.popIndent();
968968
969969 try renderToken(tree, stream, lbrace, Space.Newline);
......@@ -1011,7 +1011,7 @@ fn renderExpression(
10111011
10121012 const params = call.params();
10131013 for (params) |param_node, i| {
1014 try stream.pushIndent();
1014 stream.pushIndent();
10151015 defer stream.popIndent();
10161016
10171017 if (i + 1 < params.len) {
......@@ -1031,7 +1031,7 @@ fn renderExpression(
10311031
10321032 const params = call.params();
10331033 for (params) |param_node, i| {
1034 if (param_node.*.tag == .MultilineStringLiteral) try stream.pushIndentOneShot();
1034 if (param_node.*.tag == .MultilineStringLiteral) stream.pushIndentOneShot();
10351035
10361036 try renderExpression(allocator, stream, tree, param_node, Space.None);
10371037
......@@ -1058,7 +1058,7 @@ fn renderExpression(
10581058 {
10591059 const new_space = if (ends_with_comment) Space.Newline else Space.None;
10601060
1061 try stream.pushIndent();
1061 stream.pushIndent();
10621062 defer stream.popIndent();
10631063 try renderExpression(allocator, stream, tree, suffix_op.index_expr, new_space);
10641064 }
......@@ -1194,7 +1194,7 @@ fn renderExpression(
11941194
11951195 try renderToken(tree, stream, grouped_expr.lparen, Space.None);
11961196 {
1197 try stream.pushIndentOneShot();
1197 stream.pushIndentOneShot();
11981198 try renderExpression(allocator, stream, tree, grouped_expr.expr, Space.None);
11991199 }
12001200 return renderToken(tree, stream, grouped_expr.rparen, space);
......@@ -1254,7 +1254,7 @@ fn renderExpression(
12541254
12551255 if (container_decl.fields_and_decls_len == 0) {
12561256 {
1257 try stream.pushIndentNextLine();
1257 stream.pushIndentNextLine();
12581258 defer stream.popIndent();
12591259 try renderToken(tree, stream, container_decl.lbrace_token, Space.None); // {
12601260 }
......@@ -1289,7 +1289,7 @@ fn renderExpression(
12891289
12901290 if (src_has_trailing_comma or !src_has_only_fields) {
12911291 // One declaration per line
1292 try stream.pushIndentNextLine();
1292 stream.pushIndentNextLine();
12931293 defer stream.popIndent();
12941294 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {
12951295
......@@ -1305,7 +1305,7 @@ fn renderExpression(
13051305 // their own line
13061306 try renderToken(tree, stream, container_decl.lbrace_token, .Newline); // {
13071307
1308 try stream.pushIndent();
1308 stream.pushIndent();
13091309 defer stream.popIndent();
13101310
13111311 for (fields_and_decls) |decl, i| {
......@@ -1361,7 +1361,7 @@ fn renderExpression(
13611361
13621362 if (src_has_trailing_comma) {
13631363 {
1364 try stream.pushIndent();
1364 stream.pushIndent();
13651365 defer stream.popIndent();
13661366
13671367 try renderToken(tree, stream, lbrace, Space.Newline); // {
......@@ -1451,7 +1451,7 @@ fn renderExpression(
14511451 }
14521452 } else {
14531453 // one param per line
1454 try stream.pushIndent();
1454 stream.pushIndent();
14551455 defer stream.popIndent();
14561456 try renderToken(tree, stream, lparen, Space.Newline); // (
14571457
......@@ -1530,7 +1530,7 @@ fn renderExpression(
15301530 }
15311531 } else {
15321532 // one param per line
1533 try stream.pushIndent();
1533 stream.pushIndent();
15341534 defer stream.popIndent();
15351535 try renderToken(tree, stream, lparen, Space.Newline); // (
15361536
......@@ -1627,7 +1627,7 @@ fn renderExpression(
16271627 try renderToken(tree, stream, rparen, Space.Space); // )
16281628
16291629 {
1630 try stream.pushIndentNextLine();
1630 stream.pushIndentNextLine();
16311631 defer stream.popIndent();
16321632 try renderToken(tree, stream, lbrace, Space.Newline); // {
16331633
......@@ -1711,7 +1711,7 @@ fn renderExpression(
17111711 if (same_line) {
17121712 return renderExpression(allocator, stream, tree, else_node.body, space);
17131713 } else {
1714 try stream.pushIndent();
1714 stream.pushIndent();
17151715 defer stream.popIndent();
17161716 return renderExpression(allocator, stream, tree, else_node.body, space);
17171717 }
......@@ -1775,7 +1775,7 @@ fn renderExpression(
17751775 }
17761776
17771777 {
1778 if (!body_is_block) try stream.pushIndent();
1778 if (!body_is_block) stream.pushIndent();
17791779 defer if (!body_is_block) stream.popIndent();
17801780 try renderExpression(allocator, stream, tree, while_node.body, after_body_space);
17811781 }
......@@ -1826,7 +1826,7 @@ fn renderExpression(
18261826 };
18271827
18281828 {
1829 if (!body_on_same_line) try stream.pushIndent();
1829 if (!body_on_same_line) stream.pushIndent();
18301830 defer if (!body_on_same_line) stream.popIndent();
18311831 try renderExpression(allocator, stream, tree, for_node.body, space_after_body); // { body }
18321832 }
......@@ -1882,7 +1882,7 @@ fn renderExpression(
18821882 const else_is_block = nodeIsBlock(@"else".body);
18831883
18841884 {
1885 try stream.pushIndent();
1885 stream.pushIndent();
18861886 defer stream.popIndent();
18871887 try renderExpression(allocator, stream, tree, if_node.body, Space.Newline);
18881888 }
......@@ -1903,12 +1903,12 @@ fn renderExpression(
19031903 try renderExpression(allocator, stream, tree, payload, Space.Newline);
19041904 }
19051905
1906 try stream.pushIndent();
1906 stream.pushIndent();
19071907 defer stream.popIndent();
19081908 return renderExpression(allocator, stream, tree, @"else".body, space);
19091909 }
19101910 } else {
1911 try stream.pushIndent();
1911 stream.pushIndent();
19121912 defer stream.popIndent();
19131913 return renderExpression(allocator, stream, tree, if_node.body, space);
19141914 }
......@@ -1949,7 +1949,7 @@ fn renderExpression(
19491949 }
19501950
19511951 asmblk: {
1952 try stream.pushIndent();
1952 stream.pushIndent();
19531953 defer stream.popIndent();
19541954
19551955 if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) {
......@@ -1968,7 +1968,7 @@ fn renderExpression(
19681968 } else blk: {
19691969 try renderToken(tree, stream, colon1, Space.Space); // :
19701970
1971 try stream.pushIndentN(2);
1971 stream.pushIndent();
19721972 defer stream.popIndent();
19731973
19741974 for (asm_node.outputs) |*asm_output, i| {
......@@ -1999,7 +1999,7 @@ fn renderExpression(
19991999 break :blk tree.nextToken(colon2);
20002000 } else blk: {
20012001 try renderToken(tree, stream, colon2, Space.Space); // :
2002 try stream.pushIndentN(2);
2002 stream.pushIndent();
20032003 defer stream.popIndent();
20042004 for (asm_node.inputs) |*asm_input, i| {
20052005 if (i + 1 < asm_node.inputs.len) {
......@@ -2025,7 +2025,7 @@ fn renderExpression(
20252025 };
20262026
20272027 try renderToken(tree, stream, colon3, Space.Space); // :
2028 try stream.pushIndentN(2);
2028 stream.pushIndent();
20292029 defer stream.popIndent();
20302030 for (asm_node.clobbers) |clobber_node, i| {
20312031 if (i + 1 >= asm_node.clobbers.len) {
......@@ -2078,7 +2078,7 @@ fn renderArrayType(
20782078 const new_space = if (ends_with_comment) Space.Newline else Space.None;
20792079 {
20802080 const do_indent = (starts_with_comment or ends_with_comment);
2081 if (do_indent) try stream.pushIndent();
2081 if (do_indent) stream.pushIndent();
20822082 defer if (do_indent) stream.popIndent();
20832083
20842084 try renderToken(tree, stream, lbracket, Space.None); // [
......@@ -2212,7 +2212,7 @@ fn renderVarDecl(
22122212 if (var_decl.getTrailer("init_node")) |init_node| {
22132213 const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;
22142214 try renderToken(tree, stream, var_decl.getTrailer("eq_token").?, s); // =
2215 try stream.pushIndentOneShot();
2215 stream.pushIndentOneShot();
22162216 try renderExpression(allocator, stream, tree, init_node, Space.None);
22172217 }
22182218