aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLoris Cro <kappaloris@gmail.com>2022-09-10 21:08:26 +0200
committerLoris Cro <kappaloris@gmail.com>2022-09-11 21:35:01 +0200
commit2a96f80d03c70546e5166e7752ee2b4b64c7cc5f (patch)
tree7f70dd408413dba97d039afdee3a62a261c322e4 /src
parent81939a4939638fb296bc874afcef2f0f141f5c0c (diff)
downloadzig-2a96f80d03c70546e5166e7752ee2b4b64c7cc5f.tar.gz
zig-2a96f80d03c70546e5166e7752ee2b4b64c7cc5f.zip
autodoc: reduce json payload size
this commit removes whitespace and changes Decl, AstNode and Type to be json arrays instead of json objects. This change reduces json payload size for the stdlib from 25mb to < 10mb.
Diffstat (limited to 'src')
-rw-r--r--src/Autodoc.zig102
1 files changed, 83 insertions, 19 deletions
diff --git a/src/Autodoc.zig b/src/Autodoc.zig
index e6e025b5b4..cb17c19cb3 100644
--- a/src/Autodoc.zig
+++ b/src/Autodoc.zig
@@ -280,8 +280,8 @@ pub fn generateZirData(self: *Autodoc) !void {
try std.json.stringify(
data,
.{
- .whitespace = .{ .indent = if (builtin.mode == .Debug) .{ .Space = 4 } else .None },
- .emit_null_optional_fields = false,
+ .whitespace = .{ .indent = .None, .separator = false },
+ .emit_null_optional_fields = true,
},
out,
);
@@ -404,6 +404,7 @@ const DocData = struct {
w: anytype,
) !void {
var jsw = std.json.writeStream(w, 15);
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
try jsw.beginObject();
inline for (comptime std.meta.tags(std.meta.FieldEnum(DocData))) |f| {
const f_name = @tagName(f);
@@ -449,6 +450,8 @@ const DocData = struct {
w: anytype,
) !void {
var jsw = std.json.writeStream(w, 15);
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
+
try jsw.beginObject();
inline for (comptime std.meta.tags(std.meta.FieldEnum(DocPackage))) |f| {
const f_name = @tagName(f);
@@ -474,6 +477,22 @@ const DocData = struct {
// The index in astNodes of the `test declname { }` node
decltest: ?usize = null,
_analyzed: bool, // omitted in json data
+
+ pub fn jsonStringify(
+ self: Decl,
+ opts: std.json.StringifyOptions,
+ w: anytype,
+ ) !void {
+ var jsw = std.json.writeStream(w, 15);
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
+ try jsw.beginArray();
+ inline for (comptime std.meta.fields(Decl)) |f| {
+ try jsw.arrayElem();
+ try std.json.stringify(@field(self, f.name), opts, w);
+ jsw.state_index -= 1;
+ }
+ try jsw.endArray();
+ }
};
const AstNode = struct {
@@ -485,6 +504,22 @@ const DocData = struct {
docs: ?[]const u8 = null,
fields: ?[]usize = null, // index into astNodes
@"comptime": bool = false,
+
+ pub fn jsonStringify(
+ self: AstNode,
+ opts: std.json.StringifyOptions,
+ w: anytype,
+ ) !void {
+ var jsw = std.json.writeStream(w, 15);
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
+ try jsw.beginArray();
+ inline for (comptime std.meta.fields(AstNode)) |f| {
+ try jsw.arrayElem();
+ try std.json.stringify(@field(self, f.name), opts, w);
+ jsw.state_index -= 1;
+ }
+ try jsw.endArray();
+ }
};
const Type = union(enum) {
@@ -525,7 +560,6 @@ const DocData = struct {
fields: ?[]Expr = null, // (use src->fields to find names)
line_number: usize,
outer_decl: usize,
- ast: usize,
},
ComptimeExpr: struct { name: []const u8 },
ComptimeFloat: struct { name: []const u8 },
@@ -548,7 +582,6 @@ const DocData = struct {
src: usize, // index into astNodes
privDecls: []usize = &.{}, // index into decls
pubDecls: []usize = &.{}, // index into decls
- ast: usize,
// (use src->fields to find field names)
},
Union: struct {
@@ -557,7 +590,6 @@ const DocData = struct {
privDecls: []usize = &.{}, // index into decls
pubDecls: []usize = &.{}, // index into decls
fields: []Expr = &.{}, // (use src->fields to find names)
- ast: usize,
},
Fn: struct {
name: []const u8,
@@ -582,7 +614,6 @@ const DocData = struct {
src: usize, // index into astNodes
privDecls: []usize = &.{}, // index into decls
pubDecls: []usize = &.{}, // index into decls
- ast: usize,
},
Frame: struct { name: []const u8 },
AnyFrame: struct { name: []const u8 },
@@ -601,14 +632,15 @@ const DocData = struct {
) !void {
const active_tag = std.meta.activeTag(self);
var jsw = std.json.writeStream(w, 15);
- try jsw.beginObject();
- try jsw.objectField("kind");
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
+ try jsw.beginArray();
+ try jsw.arrayElem();
try jsw.emitNumber(@enumToInt(active_tag));
inline for (comptime std.meta.fields(Type)) |case| {
if (@field(Type, case.name) == active_tag) {
const current_value = @field(self, case.name);
inline for (comptime std.meta.fields(case.field_type)) |f| {
- try jsw.objectField(f.name);
+ try jsw.arrayElem();
if (f.field_type == std.builtin.TypeInfo.Pointer.Size) {
try jsw.emitNumber(@enumToInt(@field(current_value, f.name)));
} else {
@@ -618,7 +650,7 @@ const DocData = struct {
}
}
}
- try jsw.endObject();
+ try jsw.endArray();
}
};
@@ -686,7 +718,7 @@ const DocData = struct {
const SwitchOp = struct {
cond_index: usize,
file_name: []const u8,
- ast: usize,
+ src: usize,
outer_decl: usize, // index in `types`
};
const BuiltinBin = struct {
@@ -704,7 +736,15 @@ const DocData = struct {
end: ?usize = null,
sentinel: ?usize = null, // index in `exprs`
};
- const Cmpxchg = struct { name: []const u8, type: usize, ptr: usize, expected_value: usize, new_value: usize, success_order: usize, failure_order: usize };
+ const Cmpxchg = struct {
+ name: []const u8,
+ type: usize,
+ ptr: usize,
+ expected_value: usize,
+ new_value: usize,
+ success_order: usize,
+ failure_order: usize,
+ };
const As = struct {
typeRefArg: ?usize, // index in `exprs`
exprArg: usize, // index in `exprs`
@@ -721,11 +761,12 @@ const DocData = struct {
pub fn jsonStringify(
self: Expr,
- opt: std.json.StringifyOptions,
+ opts: std.json.StringifyOptions,
w: anytype,
) !void {
const active_tag = std.meta.activeTag(self);
var jsw = std.json.writeStream(w, 15);
+ if (opts.whitespace) |ws| jsw.whitespace = ws;
try jsw.beginObject();
try jsw.objectField(@tagName(active_tag));
switch (self) {
@@ -742,7 +783,7 @@ const DocData = struct {
if (comptime std.mem.eql(u8, case.name, "builtinField"))
continue;
if (@field(Expr, case.name) == active_tag) {
- try std.json.stringify(@field(self, case.name), opt, w);
+ try std.json.stringify(@field(self, case.name), opts, w);
jsw.state_index -= 1;
// TODO: we should not reach into the state of the
// json writer, but alas, this is what's
@@ -1874,7 +1915,12 @@ fn walkInstruction(
// log.debug("{s}", .{sep});
const switch_index = self.exprs.items.len;
- try self.exprs.append(self.arena, .{ .switchOp = .{ .cond_index = cond_index, .file_name = file.sub_file_path, .ast = ast_index, .outer_decl = type_index } });
+ try self.exprs.append(self.arena, .{ .switchOp = .{
+ .cond_index = cond_index,
+ .file_name = file.sub_file_path,
+ .src = ast_index,
+ .outer_decl = type_index,
+ } });
return DocData.WalkResult{
.typeRef = .{ .type = @enumToInt(Ref.type_type) },
@@ -2505,7 +2551,6 @@ fn walkInstruction(
.src = self_ast_node_index,
.privDecls = priv_decl_indexes.items,
.pubDecls = decl_indexes.items,
- .ast = self_ast_node_index,
},
};
if (self.ref_paths_pending_on_types.get(type_slot_index)) |paths| {
@@ -2644,7 +2689,13 @@ fn walkInstruction(
self.ast_nodes.items[self_ast_node_index].fields = field_name_indexes.items;
self.types.items[type_slot_index] = .{
- .Union = .{ .name = "todo_name", .src = self_ast_node_index, .privDecls = priv_decl_indexes.items, .pubDecls = decl_indexes.items, .fields = field_type_refs.items, .ast = self_ast_node_index },
+ .Union = .{
+ .name = "todo_name",
+ .src = self_ast_node_index,
+ .privDecls = priv_decl_indexes.items,
+ .pubDecls = decl_indexes.items,
+ .fields = field_type_refs.items,
+ },
};
if (self.ref_paths_pending_on_types.get(type_slot_index)) |paths| {
@@ -2796,7 +2847,12 @@ fn walkInstruction(
self.ast_nodes.items[self_ast_node_index].fields = field_name_indexes.items;
self.types.items[type_slot_index] = .{
- .Enum = .{ .name = "todo_name", .src = self_ast_node_index, .privDecls = priv_decl_indexes.items, .pubDecls = decl_indexes.items, .ast = self_ast_node_index },
+ .Enum = .{
+ .name = "todo_name",
+ .src = self_ast_node_index,
+ .privDecls = priv_decl_indexes.items,
+ .pubDecls = decl_indexes.items,
+ },
};
if (self.ref_paths_pending_on_types.get(type_slot_index)) |paths| {
for (paths.items) |resume_info| {
@@ -2910,7 +2966,15 @@ fn walkInstruction(
self.ast_nodes.items[self_ast_node_index].fields = field_name_indexes.items;
self.types.items[type_slot_index] = .{
- .Struct = .{ .name = "todo_name", .src = self_ast_node_index, .privDecls = priv_decl_indexes.items, .pubDecls = decl_indexes.items, .fields = field_type_refs.items, .line_number = self.ast_nodes.items[self_ast_node_index].line, .outer_decl = type_slot_index - 1, .ast = self_ast_node_index },
+ .Struct = .{
+ .name = "todo_name",
+ .src = self_ast_node_index,
+ .privDecls = priv_decl_indexes.items,
+ .pubDecls = decl_indexes.items,
+ .fields = field_type_refs.items,
+ .line_number = self.ast_nodes.items[self_ast_node_index].line,
+ .outer_decl = type_slot_index - 1,
+ },
};
if (self.ref_paths_pending_on_types.get(type_slot_index)) |paths| {
for (paths.items) |resume_info| {