authorgravatar for der.teufel.mail@gmail.comKrzysztof Wolicki <der.teufel.mail@gmail.com> 2023-04-12 14:50:29+02:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-04-13 17:42:29+02:00
log97b3b36c65faad1fa66df82e53e3f464b9cedb44
tree7f71e808503402b9c336549b163efa4161dfe778
parent83d1f6b15a84864232eceafb24b95b8d16282a3f

autodoc: Handling of default values for struct fields


2 files changed, 34 insertions(+), 8 deletions(-)

lib/docs/main.js+12-5
......@@ -2860,7 +2860,7 @@ const NAV_MODES = {
28602860 if (container.kind === typeKinds.Enum) {
28612861 html += ' = <span class="tok-number">' + fieldName + "</span>";
28622862 } else {
2863 let fieldTypeExpr = container.fields[i];
2863 let fieldTypeExpr = container.field_types[i];
28642864 if (container.kind !== typeKinds.Struct || !container.is_tuple) {
28652865 html += ": ";
28662866 }
......@@ -2869,6 +2869,12 @@ const NAV_MODES = {
28692869 if (tsn) {
28702870 html += "<span> (" + tsn + ")</span>";
28712871 }
2872 if (container.kind === typeKinds.Struct && !container.is_tuple) {
2873 let defaultInitExpr = container.field_defaults[i];
2874 if (defaultInitExpr !== null) {
2875 html += " = " + exprName(defaultInitExpr, { wantHtml: true, wantLink: true });
2876 }
2877 }
28722878 }
28732879
28742880 html += ",</pre></div>";
......@@ -4057,10 +4063,11 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {
40574063 src: ty[2],
40584064 privDecls: ty[3],
40594065 pubDecls: ty[4],
4060 fields: ty[5],
4061 is_tuple: ty[6],
4062 line_number: ty[7],
4063 outer_decl: ty[8],
4066 field_types: ty[5],
4067 field_defaults: ty[6],
4068 is_tuple: ty[7],
4069 line_number: ty[8],
4070 outer_decl: ty[9],
40644071 };
40654072 case 10: // ComptimeExpr
40664073 case 11: // ComptimeFloat
src/Autodoc.zig+22-3
......@@ -586,7 +586,8 @@ const DocData = struct {
586586 src: usize, // index into astNodes
587587 privDecls: []usize = &.{}, // index into decls
588588 pubDecls: []usize = &.{}, // index into decls
589 fields: ?[]Expr = null, // (use src->fields to find names)
589 field_types: ?[]Expr = null, // (use src->fields to find names)
590 field_defaults: ?[]?Expr = null,
590591 is_tuple: bool,
591592 line_number: usize,
592593 outer_decl: usize,
......@@ -2831,6 +2832,7 @@ fn walkInstruction(
28312832 );
28322833
28332834 var field_type_refs: std.ArrayListUnmanaged(DocData.Expr) = .{};
2835 var field_default_refs: std.ArrayListUnmanaged(?DocData.Expr) = .{};
28342836 var field_name_indexes: std.ArrayListUnmanaged(usize) = .{};
28352837 try self.collectStructFieldInfo(
28362838 file,
......@@ -2838,6 +2840,7 @@ fn walkInstruction(
28382840 src_info,
28392841 fields_len,
28402842 &field_type_refs,
2843 &field_default_refs,
28412844 &field_name_indexes,
28422845 extra_index,
28432846 small.is_tuple,
......@@ -2851,7 +2854,8 @@ fn walkInstruction(
28512854 .src = self_ast_node_index,
28522855 .privDecls = priv_decl_indexes.items,
28532856 .pubDecls = decl_indexes.items,
2854 .fields = field_type_refs.items,
2857 .field_types = field_type_refs.items,
2858 .field_defaults = field_default_refs.items,
28552859 .is_tuple = small.is_tuple,
28562860 .line_number = self.ast_nodes.items[self_ast_node_index].line,
28572861 .outer_decl = type_slot_index - 1,
......@@ -4309,6 +4313,7 @@ fn collectStructFieldInfo(
43094313 parent_src: SrcLocInfo,
43104314 fields_len: usize,
43114315 field_type_refs: *std.ArrayListUnmanaged(DocData.Expr),
4316 field_default_refs: *std.ArrayListUnmanaged(?DocData.Expr),
43124317 field_name_indexes: *std.ArrayListUnmanaged(usize),
43134318 ei: usize,
43144319 is_tuple: bool,
......@@ -4406,9 +4411,23 @@ fn collectStructFieldInfo(
44064411 };
44074412
44084413 extra_index += field.align_body_len;
4409 extra_index += field.init_body_len;
4414
4415 const default_expr: ?DocData.Expr = def: {
4416 if (field.init_body_len == 0) {
4417 break :def null;
4418 }
4419
4420 const body = file.zir.extra[extra_index..][0..field.init_body_len];
4421 extra_index += body.len;
4422
4423 const break_inst = body[body.len - 1];
4424 const operand = data[break_inst].@"break".operand;
4425 const walk_result = try self.walkRef(file, scope, parent_src, operand, false);
4426 break :def walk_result.expr;
4427 };
44104428
44114429 try field_type_refs.append(self.arena, type_expr);
4430 try field_default_refs.append(self.arena, default_expr);
44124431
44134432 // ast node
44144433 {