Skip to content

Commit 840682e

Browse files
committed
anytype -> *Writer
1 parent 7fe7551 commit 840682e

File tree

6 files changed

+128
-93
lines changed

6 files changed

+128
-93
lines changed

src/cli/lsp.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,12 @@ pub fn @"textDocument/formatting"(
225225

226226
log.debug("format!!", .{});
227227

228-
var buf = std.ArrayList(u8).init(arena);
229-
try doc.html.render(doc.src, buf.writer());
228+
var aw = std.Io.Writer.Allocating.init(arena);
229+
try doc.html.render(doc.src, &aw.writer);
230230

231231
return try arena.dupe(types.TextEdit, &.{.{
232232
.range = range,
233-
.newText = buf.items,
233+
.newText = aw.getWritten(),
234234
}});
235235
}
236236

src/css/Ast.zig

Lines changed: 106 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
const Ast = @This();
2+
13
const std = @import("std");
4+
const Writer = std.Io.Writer();
25
const Tokenizer = @import("Tokenizer.zig");
36
const root = @import("../root.zig");
47
const Span = root.Span;
58

6-
const Ast = @This();
7-
89
const at_rules = &.{
910
.{ .name = "media", .func = parseMediaRule },
1011
};
@@ -41,29 +42,39 @@ pub const Rule = struct {
4142
pseudo_element: Span,
4243
};
4344

44-
pub fn render(self: Simple, ast: Ast, src: []const u8, out_stream: anytype) !void {
45+
pub fn render(
46+
self: Simple,
47+
ast: Ast,
48+
src: []const u8,
49+
w: *Writer,
50+
) !void {
4551
if (self.element_name) |element_name| {
4652
switch (element_name) {
47-
.name => |name| _ = try out_stream.write(name.slice(src)),
48-
.all => _ = try out_stream.write("*"),
53+
.name => |name| _ = try w.write(name.slice(src)),
54+
.all => _ = try w.write("*"),
4955
}
5056
}
5157

5258
for (ast.specifiers[self.specifiers.start..self.specifiers.end]) |specifier| {
5359
switch (specifier) {
54-
.hash => |hash| try out_stream.print("#{s}", .{hash.slice(src)}),
55-
.class => |class| try out_stream.print(".{s}", .{class.slice(src)}),
60+
.hash => |hash| try w.print("#{s}", .{hash.slice(src)}),
61+
.class => |class| try w.print(".{s}", .{class.slice(src)}),
5662
.attrib => @panic("TODO"),
57-
.pseudo_class => |pseudo_class| try out_stream.print(":{s}", .{pseudo_class.slice(src)}),
58-
.pseudo_element => |pseudo_element| try out_stream.print("::{s}", .{pseudo_element.slice(src)}),
63+
.pseudo_class => |pseudo_class| try w.print(":{s}", .{pseudo_class.slice(src)}),
64+
.pseudo_element => |pseudo_element| try w.print("::{s}", .{pseudo_element.slice(src)}),
5965
}
6066
}
6167
}
6268
};
6369

64-
pub fn render(self: Selector, ast: Ast, src: []const u8, out_stream: anytype) !void {
65-
switch (self) {
66-
inline else => |sel| try sel.render(ast, src, out_stream),
70+
pub fn render(
71+
selector: Selector,
72+
ast: Ast,
73+
src: []const u8,
74+
w: *Writer,
75+
) !void {
76+
switch (selector) {
77+
inline else => |sel| try sel.render(ast, src, w),
6778
}
6879
}
6980
};
@@ -72,64 +83,77 @@ pub const Rule = struct {
7283
property: Span,
7384
value: Span,
7485

75-
pub fn render(self: Declaration, src: []const u8, out_stream: anytype) !void {
76-
_ = try out_stream.write(self.property.slice(src));
77-
_ = try out_stream.write(": ");
78-
try renderValue(self.value.slice(src), out_stream);
86+
pub fn render(
87+
declaration: Declaration,
88+
src: []const u8,
89+
w: *Writer,
90+
) !void {
91+
_ = try w.write(declaration.property.slice(src));
92+
_ = try w.write(": ");
93+
try renderValue(declaration.value.slice(src), w);
7994
}
8095
};
8196

82-
pub fn render(self: Style, ast: Ast, src: []const u8, out_stream: anytype, depth: usize) !void {
83-
for (0..depth) |_| _ = try out_stream.write(" ");
84-
for (ast.selectors[self.selectors.start..self.selectors.end], 0..) |selector, i| {
97+
pub fn render(
98+
style: Style,
99+
ast: Ast,
100+
src: []const u8,
101+
w: *Writer,
102+
depth: usize,
103+
) !void {
104+
for (0..depth) |_| _ = try w.write(" ");
105+
for (ast.selectors[style.selectors.start..style.selectors.end], 0..) |selector, i| {
85106
if (i != 0) {
86-
_ = try out_stream.write(", ");
107+
_ = try w.write(", ");
87108
}
88109

89-
try selector.render(ast, src, out_stream);
110+
try selector.render(ast, src, w);
90111
}
91112

92-
_ = try out_stream.write(" {");
113+
_ = try w.write(" {");
93114

94-
if (self.multiline_decl) {
95-
_ = try out_stream.write("\n");
115+
if (style.multiline_decl) {
116+
_ = try w.write("\n");
96117

97-
for (ast.declarations[self.declarations.start..self.declarations.end]) |declaration| {
98-
for (0..depth + 1) |_| _ = try out_stream.write(" ");
99-
try declaration.render(src, out_stream);
100-
_ = try out_stream.write(";\n");
118+
for (ast.declarations[style.declarations.start..style.declarations.end]) |declaration| {
119+
for (0..depth + 1) |_| _ = try w.write(" ");
120+
try declaration.render(src, w);
121+
_ = try w.write(";\n");
101122
}
102123

103-
for (0..depth) |_| _ = try out_stream.write(" ");
124+
for (0..depth) |_| _ = try w.write(" ");
104125
} else {
105-
_ = try out_stream.write(" ");
106-
for (ast.declarations[self.declarations.start..self.declarations.end], 0..) |declaration, i| {
107-
if (i != 0) _ = try out_stream.write("; ");
108-
try declaration.render(src, out_stream);
126+
_ = try w.write(" ");
127+
for (ast.declarations[style.declarations.start..style.declarations.end], 0..) |declaration, i| {
128+
if (i != 0) _ = try w.write("; ");
129+
try declaration.render(src, w);
109130
}
110-
_ = try out_stream.write(" ");
131+
_ = try w.write(" ");
111132
}
112133

113-
_ = try out_stream.write("}");
134+
_ = try w.write("}");
114135
}
115136
};
116137

117138
pub const Media = struct {
118139
queries: Span,
119140
first_rule: ?u32,
120141

121-
fn renderMediaQuery(query: []const u8, out_stream: anytype) !void {
142+
fn renderMediaQuery(
143+
query: []const u8,
144+
w: *Writer,
145+
) !void {
122146
var query_tokenizer: Tokenizer = .{};
123147

124148
while (query_tokenizer.next(query)) |token| {
125149
switch (token) {
126-
.ident => |ident| _ = try out_stream.write(ident.slice(query)),
150+
.ident => |ident| _ = try w.write(ident.slice(query)),
127151
.open_paren => {
128-
_ = try out_stream.write("(");
129-
_ = try out_stream.write(query_tokenizer.next(query).?.ident.slice(query));
152+
_ = try w.write("(");
153+
_ = try w.write(query_tokenizer.next(query).?.ident.slice(query));
130154
switch (query_tokenizer.next(query).?) {
131155
.colon => {
132-
_ = try out_stream.write(": ");
156+
_ = try w.write(": ");
133157

134158
var span: ?Span = null;
135159
while (true) {
@@ -145,60 +169,72 @@ pub const Rule = struct {
145169

146170
std.debug.assert(span != null);
147171

148-
try renderValue(span.?.slice(query), out_stream);
172+
try renderValue(span.?.slice(query), w);
149173
},
150174
.close_paren => {},
151175
else => unreachable,
152176
}
153-
_ = try out_stream.write(")");
177+
_ = try w.write(")");
154178
},
155179
else => unreachable,
156180
}
157181
}
158182
}
159183

160-
pub fn render(self: Media, ast: Ast, src: []const u8, out_stream: anytype, depth: usize) !void {
161-
for (0..depth) |_| _ = try out_stream.write(" ");
184+
pub fn render(
185+
media: Media,
186+
ast: Ast,
187+
src: []const u8,
188+
w: *Writer,
189+
depth: usize,
190+
) !void {
191+
for (0..depth) |_| _ = try w.write(" ");
162192

163-
_ = try out_stream.write("@media ");
193+
_ = try w.write("@media ");
164194

165-
for (ast.media_queries[self.queries.start..self.queries.end], 0..) |query, i| {
195+
for (ast.media_queries[media.queries.start..media.queries.end], 0..) |query, i| {
166196
if (i != 0) {
167-
_ = try out_stream.write(", ");
197+
_ = try w.write(", ");
168198
}
169199

170-
try renderMediaQuery(query.slice(src), out_stream);
200+
try renderMediaQuery(query.slice(src), w);
171201
}
172202

173-
_ = try out_stream.write(" {");
203+
_ = try w.write(" {");
174204

175-
if (self.first_rule) |first_rule| {
176-
_ = try out_stream.write("\n");
205+
if (media.first_rule) |first_rule| {
206+
_ = try w.write("\n");
177207

178208
var first = true;
179209
var rule = ast.rules[first_rule];
180210
while (true) {
181211
if (!first) {
182-
_ = try out_stream.write("\n\n");
212+
_ = try w.write("\n\n");
183213
}
184214
first = false;
185215

186-
try rule.render(ast, src, out_stream, depth + 1);
216+
try rule.render(ast, src, w, depth + 1);
187217

188218
rule = ast.rules[rule.next orelse break];
189219
}
190-
_ = try out_stream.write("\n");
220+
_ = try w.write("\n");
191221
}
192222

193-
for (0..depth) |_| _ = try out_stream.write(" ");
194-
_ = try out_stream.write("}");
223+
for (0..depth) |_| _ = try w.write(" ");
224+
_ = try w.write("}");
195225
}
196226
};
197227

198-
pub fn render(self: Rule, ast: Ast, src: []const u8, out_stream: anytype, depth: usize) anyerror!void {
199-
switch (self.type) {
200-
.style => |style| try style.render(ast, src, out_stream, depth),
201-
.media => |media| try media.render(ast, src, out_stream, depth),
228+
pub fn render(
229+
rule: Rule,
230+
ast: Ast,
231+
src: []const u8,
232+
w: *Writer,
233+
depth: usize,
234+
) anyerror!void {
235+
switch (rule.type) {
236+
.style => |style| try style.render(ast, src, w, depth),
237+
.media => |media| try media.render(ast, src, w, depth),
202238
}
203239
}
204240
};
@@ -275,16 +311,8 @@ const Formatter = struct {
275311
ast: Ast,
276312
src: []const u8,
277313

278-
pub fn format(
279-
f: Formatter,
280-
comptime fmt: []const u8,
281-
options: std.fmt.FormatOptions,
282-
out_stream: anytype,
283-
) !void {
284-
_ = fmt;
285-
_ = options;
286-
287-
try f.ast.render(f.src, out_stream);
314+
pub fn format(f: Formatter, w: *Writer) !void {
315+
try f.ast.render(f.src, w);
288316
}
289317
};
290318

@@ -295,22 +323,22 @@ pub fn formatter(self: Ast, src: []const u8) Formatter {
295323
};
296324
}
297325

298-
pub fn render(self: Ast, src: []const u8, out_stream: anytype) !void {
326+
pub fn render(ast: Ast, src: []const u8, w: *Writer) !void {
299327
var first = true;
300-
var rule = self.rules[self.first_rule orelse return];
328+
var rule = ast.rules[ast.first_rule orelse return];
301329
while (true) {
302330
if (!first) {
303-
_ = try out_stream.write("\n\n");
331+
_ = try w.write("\n\n");
304332
}
305333
first = false;
306334

307-
try rule.render(self, src, out_stream, 0);
335+
try rule.render(ast, src, w, 0);
308336

309-
rule = self.rules[rule.next orelse break];
337+
rule = ast.rules[rule.next orelse break];
310338
}
311339
}
312340

313-
fn renderValue(value: []const u8, out_stream: anytype) !void {
341+
fn renderValue(value: []const u8, w: *Writer) !void {
314342
var value_tokenizer: Tokenizer = .{};
315343

316344
var last_token: ?Tokenizer.Token = null;
@@ -322,9 +350,9 @@ fn renderValue(value: []const u8, out_stream: anytype) !void {
322350
.function => false,
323351
else => true,
324352
} else false) {
325-
_ = try out_stream.write(" ");
353+
_ = try w.write(" ");
326354
}
327-
_ = try out_stream.write(token.span().slice(value));
355+
_ = try w.write(token.span().slice(value));
328356
}
329357
}
330358

src/fuzz.zig

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ pub fn main() !void {
2020
defer ast.deinit(gpa);
2121

2222
if (ast.errors.len == 0) {
23-
try ast.render(src, std.io.null_writer);
23+
var dw: std.Io.Writer.Discarding = .init(&.{});
24+
try ast.render(src, &dw.writer);
2425
}
2526
}
2627

@@ -45,7 +46,8 @@ test "afl++ fuzz cases" {
4546
const ast = try super.html.Ast.init(std.testing.allocator, c, .html);
4647
defer ast.deinit(std.testing.allocator);
4748
if (ast.errors.len == 0) {
48-
try ast.render(c, std.io.null_writer);
49+
var dw: std.Io.Writer.Discarding = .init(&.{});
50+
try ast.render(c, &dw.writer);
4951
}
5052
// ast.debug(c);
5153
}

src/fuzz/astgen.zig

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const std = @import("std");
2+
const Writer = std.Io.Writer;
3+
24
const builtin = @import("builtin");
35
const super = @import("superhtml");
46

@@ -77,7 +79,7 @@ const Element = struct {
7779

7880
pub fn commit(
7981
e: *Element,
80-
w: anytype,
82+
w: *Writer,
8183
src: []const u8,
8284
ends: *std.ArrayList(Tag),
8385
) !void {
@@ -208,7 +210,7 @@ pub fn build(gpa: std.mem.Allocator, src: []const u8) ![]const u8 {
208210
return out.items;
209211
}
210212
pub fn buildInternal(
211-
w: anytype,
213+
w: *Writer,
212214
src: []const u8,
213215
ends: *std.ArrayList(Element.Tag),
214216
current: *Element,

0 commit comments

Comments
 (0)