authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-04-13 17:53:13+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-04-13 17:53:13+02:00
logfbcf1c0006dc6656deb3f04e2f52d1da4a599952
tree92543a4474cf2ef150c2941f52e932fad16e618e
parent83d1f6b15a84864232eceafb24b95b8d16282a3f
parentaea886e2f3df6dd7bd89e16d42a953d379b0550a
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #15261 from der-teufel-programming/autodoc-defaults

Autodoc: default values for fields in structs, explicit values for tags in enums

2 files changed, 50 insertions(+), 15 deletions(-)

lib/docs/main.js+21-9
......@@ -623,7 +623,7 @@ const NAV_MODES = {
623623 function typeIsStructWithNoFields(typeIndex) {
624624 let typeObj = getType(typeIndex);
625625 if (typeObj.kind !== typeKinds.Struct) return false;
626 return typeObj.fields.length == 0;
626 return typeObj.field_types.length == 0;
627627 }
628628
629629 function typeIsGenericFn(typeIndex) {
......@@ -2705,6 +2705,7 @@ const NAV_MODES = {
27052705 let declValue = resolveValue(uns.value);
27062706 if (!("type" in declValue.expr)) continue;
27072707 let uns_container = getType(declValue.expr.type);
2708 if (!isContainerType(uns_container)) continue;
27082709 categorizeDecls(
27092710 uns_container.pubDecls,
27102711 typesList,
......@@ -2858,9 +2859,12 @@ const NAV_MODES = {
28582859 escapeHtml(fieldName);
28592860
28602861 if (container.kind === typeKinds.Enum) {
2861 html += ' = <span class="tok-number">' + fieldName + "</span>";
2862 let value = container.values[i];
2863 if (value !== null) {
2864 html += " = " + exprName(value, { wantHtml: true, wantLink: true });
2865 }
28622866 } else {
2863 let fieldTypeExpr = container.fields[i];
2867 let fieldTypeExpr = container.field_types[i];
28642868 if (container.kind !== typeKinds.Struct || !container.is_tuple) {
28652869 html += ": ";
28662870 }
......@@ -2869,6 +2873,12 @@ const NAV_MODES = {
28692873 if (tsn) {
28702874 html += "<span> (" + tsn + ")</span>";
28712875 }
2876 if (container.kind === typeKinds.Struct && !container.is_tuple) {
2877 let defaultInitExpr = container.field_defaults[i];
2878 if (defaultInitExpr !== null) {
2879 html += " = " + exprName(defaultInitExpr, { wantHtml: true, wantLink: true });
2880 }
2881 }
28722882 }
28732883
28742884 html += ",</pre></div>";
......@@ -4057,10 +4067,11 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {
40574067 src: ty[2],
40584068 privDecls: ty[3],
40594069 pubDecls: ty[4],
4060 fields: ty[5],
4061 is_tuple: ty[6],
4062 line_number: ty[7],
4063 outer_decl: ty[8],
4070 field_types: ty[5],
4071 field_defaults: ty[6],
4072 is_tuple: ty[7],
4073 line_number: ty[8],
4074 outer_decl: ty[9],
40644075 };
40654076 case 10: // ComptimeExpr
40664077 case 11: // ComptimeFloat
......@@ -4099,7 +4110,8 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {
40994110 privDecls: ty[3],
41004111 pubDecls: ty[4],
41014112 tag: ty[5],
4102 nonexhaustive: ty[6],
4113 values: ty[6],
4114 nonexhaustive: ty[7],
41034115 };
41044116 case 20: // Union
41054117 return {
......@@ -4108,7 +4120,7 @@ function addDeclToSearchResults(decl, declIndex, pkgNames, item, list, stack) {
41084120 src: ty[2],
41094121 privDecls: ty[3],
41104122 pubDecls: ty[4],
4111 fields: ty[5],
4123 field_types: ty[5],
41124124 tag: ty[6],
41134125 auto_tag: ty[7],
41144126 };
src/Autodoc.zig+29-6
......@@ -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 = &.{}, // (use src->fields to find names)
590 field_defaults: []?Expr = &.{}, // default values is specified
590591 is_tuple: bool,
591592 line_number: usize,
592593 outer_decl: usize,
......@@ -614,6 +615,7 @@ const DocData = struct {
614615 pubDecls: []usize = &.{}, // index into decls
615616 // (use src->fields to find field names)
616617 tag: ?Expr = null, // tag type if specified
618 values: []?Expr = &.{}, // tag values if specified
617619 nonexhaustive: bool,
618620 },
619621 Union: struct {
......@@ -2705,6 +2707,7 @@ fn walkInstruction(
27052707 extra_index += body_len;
27062708
27072709 var field_name_indexes: std.ArrayListUnmanaged(usize) = .{};
2710 var field_values: std.ArrayListUnmanaged(?DocData.Expr) = .{};
27082711 {
27092712 var bit_bag_idx = extra_index;
27102713 var cur_bit_bag: u32 = undefined;
......@@ -2726,12 +2729,13 @@ fn walkInstruction(
27262729 const doc_comment_index = file.zir.extra[extra_index];
27272730 extra_index += 1;
27282731
2729 const value_ref: ?Ref = if (has_value) blk: {
2732 const value_expr: ?DocData.Expr = if (has_value) blk: {
27302733 const value_ref = file.zir.extra[extra_index];
27312734 extra_index += 1;
2732 break :blk @intToEnum(Ref, value_ref);
2735 const value = try self.walkRef(file, &scope, src_info, @intToEnum(Ref, value_ref), false);
2736 break :blk value.expr;
27332737 } else null;
2734 _ = value_ref;
2738 try field_values.append(self.arena, value_expr);
27352739
27362740 const field_name = file.zir.nullTerminatedString(field_name_index);
27372741
......@@ -2756,6 +2760,7 @@ fn walkInstruction(
27562760 .privDecls = priv_decl_indexes.items,
27572761 .pubDecls = decl_indexes.items,
27582762 .tag = tag_type,
2763 .values = field_values.items,
27592764 .nonexhaustive = small.nonexhaustive,
27602765 },
27612766 };
......@@ -2831,6 +2836,7 @@ fn walkInstruction(
28312836 );
28322837
28332838 var field_type_refs: std.ArrayListUnmanaged(DocData.Expr) = .{};
2839 var field_default_refs: std.ArrayListUnmanaged(?DocData.Expr) = .{};
28342840 var field_name_indexes: std.ArrayListUnmanaged(usize) = .{};
28352841 try self.collectStructFieldInfo(
28362842 file,
......@@ -2838,6 +2844,7 @@ fn walkInstruction(
28382844 src_info,
28392845 fields_len,
28402846 &field_type_refs,
2847 &field_default_refs,
28412848 &field_name_indexes,
28422849 extra_index,
28432850 small.is_tuple,
......@@ -2851,7 +2858,8 @@ fn walkInstruction(
28512858 .src = self_ast_node_index,
28522859 .privDecls = priv_decl_indexes.items,
28532860 .pubDecls = decl_indexes.items,
2854 .fields = field_type_refs.items,
2861 .field_types = field_type_refs.items,
2862 .field_defaults = field_default_refs.items,
28552863 .is_tuple = small.is_tuple,
28562864 .line_number = self.ast_nodes.items[self_ast_node_index].line,
28572865 .outer_decl = type_slot_index - 1,
......@@ -4309,6 +4317,7 @@ fn collectStructFieldInfo(
43094317 parent_src: SrcLocInfo,
43104318 fields_len: usize,
43114319 field_type_refs: *std.ArrayListUnmanaged(DocData.Expr),
4320 field_default_refs: *std.ArrayListUnmanaged(?DocData.Expr),
43124321 field_name_indexes: *std.ArrayListUnmanaged(usize),
43134322 ei: usize,
43144323 is_tuple: bool,
......@@ -4406,9 +4415,23 @@ fn collectStructFieldInfo(
44064415 };
44074416
44084417 extra_index += field.align_body_len;
4409 extra_index += field.init_body_len;
4418
4419 const default_expr: ?DocData.Expr = def: {
4420 if (field.init_body_len == 0) {
4421 break :def null;
4422 }
4423
4424 const body = file.zir.extra[extra_index..][0..field.init_body_len];
4425 extra_index += body.len;
4426
4427 const break_inst = body[body.len - 1];
4428 const operand = data[break_inst].@"break".operand;
4429 const walk_result = try self.walkRef(file, scope, parent_src, operand, false);
4430 break :def walk_result.expr;
4431 };
44104432
44114433 try field_type_refs.append(self.arena, type_expr);
4434 try field_default_refs.append(self.arena, default_expr);
44124435
44134436 // ast node
44144437 {