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 = {...@@ -2860,7 +2860,7 @@ const NAV_MODES = {
2860 if (container.kind === typeKinds.Enum) {2860 if (container.kind === typeKinds.Enum) {
2861 html += ' = <span class="tok-number">' + fieldName + "</span>";2861 html += ' = <span class="tok-number">' + fieldName + "</span>";
2862 } else {2862 } else {
2863 let fieldTypeExpr = container.fields[i];2863 let fieldTypeExpr = container.field_types[i];
2864 if (container.kind !== typeKinds.Struct || !container.is_tuple) {2864 if (container.kind !== typeKinds.Struct || !container.is_tuple) {
2865 html += ": ";2865 html += ": ";
2866 }2866 }
...@@ -2869,6 +2869,12 @@ const NAV_MODES = {...@@ -2869,6 +2869,12 @@ const NAV_MODES = {
2869 if (tsn) {2869 if (tsn) {
2870 html += "<span> (" + tsn + ")</span>";2870 html += "<span> (" + tsn + ")</span>";
2871 }2871 }
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 }
2872 }2878 }
28732879
2874 html += ",</pre></div>";2880 html += ",</pre></div>";
...@@ -4057,10 +4063,11 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {...@@ -4057,10 +4063,11 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {
4057 src: ty[2],4063 src: ty[2],
4058 privDecls: ty[3],4064 privDecls: ty[3],
4059 pubDecls: ty[4],4065 pubDecls: ty[4],
4060 fields: ty[5],4066 field_types: ty[5],
4061 is_tuple: ty[6],4067 field_defaults: ty[6],
4062 line_number: ty[7],4068 is_tuple: ty[7],
4063 outer_decl: ty[8],4069 line_number: ty[8],
4070 outer_decl: ty[9],
4064 };4071 };
4065 case 10: // ComptimeExpr4072 case 10: // ComptimeExpr
4066 case 11: // ComptimeFloat4073 case 11: // ComptimeFloat
src/Autodoc.zig+22-3
...@@ -586,7 +586,8 @@ const DocData = struct {...@@ -586,7 +586,8 @@ const DocData = struct {
586 src: usize, // index into astNodes586 src: usize, // index into astNodes
587 privDecls: []usize = &.{}, // index into decls587 privDecls: []usize = &.{}, // index into decls
588 pubDecls: []usize = &.{}, // index into decls588 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,
590 is_tuple: bool,591 is_tuple: bool,
591 line_number: usize,592 line_number: usize,
592 outer_decl: usize,593 outer_decl: usize,
...@@ -2831,6 +2832,7 @@ fn walkInstruction(...@@ -2831,6 +2832,7 @@ fn walkInstruction(
2831 );2832 );
28322833
2833 var field_type_refs: std.ArrayListUnmanaged(DocData.Expr) = .{};2834 var field_type_refs: std.ArrayListUnmanaged(DocData.Expr) = .{};
2835 var field_default_refs: std.ArrayListUnmanaged(?DocData.Expr) = .{};
2834 var field_name_indexes: std.ArrayListUnmanaged(usize) = .{};2836 var field_name_indexes: std.ArrayListUnmanaged(usize) = .{};
2835 try self.collectStructFieldInfo(2837 try self.collectStructFieldInfo(
2836 file,2838 file,
...@@ -2838,6 +2840,7 @@ fn walkInstruction(...@@ -2838,6 +2840,7 @@ fn walkInstruction(
2838 src_info,2840 src_info,
2839 fields_len,2841 fields_len,
2840 &field_type_refs,2842 &field_type_refs,
2843 &field_default_refs,
2841 &field_name_indexes,2844 &field_name_indexes,
2842 extra_index,2845 extra_index,
2843 small.is_tuple,2846 small.is_tuple,
...@@ -2851,7 +2854,8 @@ fn walkInstruction(...@@ -2851,7 +2854,8 @@ fn walkInstruction(
2851 .src = self_ast_node_index,2854 .src = self_ast_node_index,
2852 .privDecls = priv_decl_indexes.items,2855 .privDecls = priv_decl_indexes.items,
2853 .pubDecls = decl_indexes.items,2856 .pubDecls = decl_indexes.items,
2854 .fields = field_type_refs.items,2857 .field_types = field_type_refs.items,
2858 .field_defaults = field_default_refs.items,
2855 .is_tuple = small.is_tuple,2859 .is_tuple = small.is_tuple,
2856 .line_number = self.ast_nodes.items[self_ast_node_index].line,2860 .line_number = self.ast_nodes.items[self_ast_node_index].line,
2857 .outer_decl = type_slot_index - 1,2861 .outer_decl = type_slot_index - 1,
...@@ -4309,6 +4313,7 @@ fn collectStructFieldInfo(...@@ -4309,6 +4313,7 @@ fn collectStructFieldInfo(
4309 parent_src: SrcLocInfo,4313 parent_src: SrcLocInfo,
4310 fields_len: usize,4314 fields_len: usize,
4311 field_type_refs: *std.ArrayListUnmanaged(DocData.Expr),4315 field_type_refs: *std.ArrayListUnmanaged(DocData.Expr),
4316 field_default_refs: *std.ArrayListUnmanaged(?DocData.Expr),
4312 field_name_indexes: *std.ArrayListUnmanaged(usize),4317 field_name_indexes: *std.ArrayListUnmanaged(usize),
4313 ei: usize,4318 ei: usize,
4314 is_tuple: bool,4319 is_tuple: bool,
...@@ -4406,9 +4411,23 @@ fn collectStructFieldInfo(...@@ -4406,9 +4411,23 @@ fn collectStructFieldInfo(
4406 };4411 };
44074412
4408 extra_index += field.align_body_len;4413 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
4411 try field_type_refs.append(self.arena, type_expr);4429 try field_type_refs.append(self.arena, type_expr);
4430 try field_default_refs.append(self.arena, default_expr);
44124431
4413 // ast node4432 // ast node
4414 {4433 {