authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-05-05 18:24:55+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-05-05 18:24:55+02:00
log9f3f9fb40f605de2f2bdcd0ce7a396e06b8b8c0d
tree0713d46e4ac8164884580413b0bb8075feeda07a
parent012f9a97eb74c63921ce7f3a036c71816fb59a24
parent538c8258c724d31efd631b670d4a7d781009a1e1
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #15578 from der-teufel-programming/autodoc-if-switch

Autodoc: Save and render source code for `if` and `switch`

2 files changed, 55 insertions(+), 57 deletions(-)

lib/docs/main.js+10-10
......@@ -649,16 +649,16 @@ const NAV_MODES = {
649649 let lines = code.split("\n");
650650 let result = "";
651651 let indent_level = 0;
652 for(let i = 0; i < lines.length; i += 1) {
652 for (let i = 0; i < lines.length; i += 1) {
653653 let line = lines[i].trim();
654 if(line[0] == "}") indent_level -= 1;
655 for(let j = 0; j < indent_level; j += 1) {
654 if (line[0] == "}") indent_level -= 1;
655 for (let j = 0; j < indent_level; j += 1) {
656656 result += " ";
657657 }
658658 if (line.startsWith("\\\\")) result += " "
659659 result += line;
660 result += "\n";
661 if(line[line.length - 1] == "{") indent_level += 1;
660 if (i != lines.length - 1) result += "\n";
661 if (line[line.length - 1] == "{") indent_level += 1;
662662 }
663663 return result;
664664 }
......@@ -1730,7 +1730,7 @@ const NAV_MODES = {
17301730 return payloadHtml + "}";
17311731 }
17321732 case "comptimeExpr": {
1733 return zigAnalysis.comptimeExprs[expr.comptimeExpr].code;
1733 return renderZigSource(zigAnalysis.comptimeExprs[expr.comptimeExpr].code);
17341734 }
17351735 case "call": {
17361736 let call = zigAnalysis.calls[expr.call];
......@@ -2571,13 +2571,13 @@ const NAV_MODES = {
25712571 } else if (
25722572 resolvedValue.expr.string !== undefined ||
25732573 resolvedValue.expr.call !== undefined ||
2574 resolvedValue.expr.comptimeExpr
2574 resolvedValue.expr.comptimeExpr !== undefined
25752575 ) {
25762576 domFnProtoCode.innerHTML =
25772577 '<span class="tok-kw">const</span> ' +
25782578 escapeHtml(decl.name) +
25792579 ": " +
2580 exprName(resolvedValue.expr, { wantHtml: true, wantLink: true }) +
2580 exprName(resolvedValue.typeRef !== null ? resolvedValue.typeRef : resolvedValue.expr, { wantHtml: true, wantLink: true }) +
25812581 " = " +
25822582 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
25832583 ";";
......@@ -2628,13 +2628,13 @@ const NAV_MODES = {
26282628 } else if (
26292629 resolvedVar.expr.string !== undefined ||
26302630 resolvedVar.expr.call !== undefined ||
2631 resolvedVar.expr.comptimeExpr
2631 resolvedVar.expr.comptimeExpr !== undefined
26322632 ) {
26332633 domFnProtoCode.innerHTML =
26342634 '<span class="tok-kw">var</span> ' +
26352635 escapeHtml(decl.name) +
26362636 ": " +
2637 exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) +
2637 exprName(resolvedVar.typeRef !== null ? resolvedVar.typeRef : resolvedVar.expr, { wantHtml: true, wantLink: true }) +
26382638 " = " +
26392639 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
26402640 ";";
src/Autodoc.zig+45-47
......@@ -1876,12 +1876,14 @@ fn walkInstruction(
18761876 // WIP
18771877 const pl_node = data[inst_index].pl_node;
18781878 const extra = file.zir.extraData(Zir.Inst.SwitchBlock, pl_node.payload_index);
1879 const cond_index = self.exprs.items.len;
18801879
1881 _ = try self.walkRef(file, parent_scope, parent_src, extra.data.operand, false);
1880 const switch_cond = try self.walkRef(file, parent_scope, parent_src, extra.data.operand, false);
1881 const cond_index = self.exprs.items.len;
1882 try self.exprs.append(self.arena, switch_cond.expr);
1883 _ = cond_index;
18821884
1883 const ast_index = self.ast_nodes.items.len;
1884 const type_index = self.types.items.len - 1;
1885 // const ast_index = self.ast_nodes.items.len;
1886 // const type_index = self.types.items.len - 1;
18851887
18861888 // const ast_line = self.ast_nodes.items[ast_index - 1];
18871889
......@@ -1894,12 +1896,18 @@ fn walkInstruction(
18941896 // log.debug("{s}", .{sep});
18951897
18961898 const switch_index = self.exprs.items.len;
1897 try self.exprs.append(self.arena, .{ .switchOp = .{
1898 .cond_index = cond_index,
1899 .file_name = file.sub_file_path,
1900 .src = ast_index,
1901 .outer_decl = type_index,
1902 } });
1899
1900 // const src_loc = try self.srcLocInfo(file, pl_node.src_node, parent_src);
1901
1902 const switch_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
1903 try self.exprs.append(self.arena, .{ .comptimeExpr = self.comptime_exprs.items.len });
1904 try self.comptime_exprs.append(self.arena, .{ .code = switch_expr });
1905 // try self.exprs.append(self.arena, .{ .switchOp = .{
1906 // .cond_index = cond_index,
1907 // .file_name = file.sub_file_path,
1908 // .src = ast_index,
1909 // .outer_decl = type_index,
1910 // } });
19031911
19041912 return DocData.WalkResult{
19051913 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
......@@ -2153,11 +2161,14 @@ fn walkInstruction(
21532161 };
21542162 },
21552163 .block => {
2156 const res = DocData.WalkResult{ .expr = .{
2157 .comptimeExpr = self.comptime_exprs.items.len,
2158 } };
2164 const res = DocData.WalkResult{
2165 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
2166 .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
2167 };
2168 const pl_node = data[inst_index].pl_node;
2169 const block_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
21592170 try self.comptime_exprs.append(self.arena, .{
2160 .code = "if (...) { ... }",
2171 .code = block_expr,
21612172 });
21622173 return res;
21632174 },
......@@ -2167,11 +2178,14 @@ fn walkInstruction(
21672178 parent_scope,
21682179 parent_src,
21692180 getBlockInlineBreak(file.zir, inst_index) orelse {
2170 const res = DocData.WalkResult{ .expr = .{
2171 .comptimeExpr = self.comptime_exprs.items.len,
2172 } };
2181 const res = DocData.WalkResult{
2182 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
2183 .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
2184 };
2185 const pl_node = data[inst_index].pl_node;
2186 const block_inline_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
21732187 try self.comptime_exprs.append(self.arena, .{
2174 .code = "if (...) { ... }",
2188 .code = block_inline_expr,
21752189 });
21762190 return res;
21772191 },
......@@ -3201,29 +3215,7 @@ fn analyzeDecl(
32013215 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
32023216
32033217 const name: []const u8 = switch (decl_name_index) {
3204 0, 1 => unreachable, // comptime or usingnamespace decl
3205 2 => {
3206 unreachable;
3207 // decl test
3208 // const decl_status = scope.resolveDeclName(doc_comment_index);
3209 // const decl_being_tested = decl_status.Analyzed;
3210 // const func_index = getBlockInlineBreak(file.zir, value_index).?;
3211
3212 // const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
3213 // const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
3214 // const tree = try file.getTree(self.comp_module.gpa);
3215 // const test_source_code = tree.getNodeSource(fn_src.src_node);
3216
3217 // const ast_node_index = self.ast_nodes.items.len;
3218 // try self.ast_nodes.append(self.arena, .{
3219 // .file = 0,
3220 // .line = 0,
3221 // .col = 0,
3222 // .code = test_source_code,
3223 // });
3224 // self.decls.items[decl_being_tested].decltest = ast_node_index;
3225 // continue;
3226 },
3218 0, 1, 2 => unreachable, // comptime or usingnamespace decl, decltest
32273219 else => blk: {
32283220 if (file.zir.string_bytes[decl_name_index] == 0) {
32293221 // test decl
......@@ -3359,15 +3351,10 @@ fn analyzeDecltest(
33593351 const value_index = file.zir.extra[d.sub_index + 6];
33603352 const decl_name_index = file.zir.extra[d.sub_index + 7];
33613353
3362 // This is known to work because decl values are always block_inlines
33633354 const value_pl_node = data[value_index].pl_node;
33643355 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
33653356
3366 const func_index = getBlockInlineBreak(file.zir, value_index).?;
3367 const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
3368 const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
3369 const tree = try file.getTree(self.comp_module.gpa);
3370 const test_source_code = tree.getNodeSource(fn_src.src_node);
3357 const test_source_code = try self.getBlockSource(file, parent_src, value_pl_node.src_node);
33713358
33723359 const decl_name: ?[]const u8 = if (decl_name_index != 0)
33733360 file.zir.nullTerminatedString(decl_name_index)
......@@ -4814,6 +4801,17 @@ fn declIsVar(
48144801 return (tags[tok_idx] == .keyword_var);
48154802}
48164803
4804fn getBlockSource(
4805 self: Autodoc,
4806 file: *File,
4807 parent_src: SrcLocInfo,
4808 block_src_node: i32,
4809) AutodocErrors![]const u8 {
4810 const tree = try file.getTree(self.comp_module.gpa);
4811 const block_src = try self.srcLocInfo(file, block_src_node, parent_src);
4812 return tree.getNodeSource(block_src.src_node);
4813}
4814
48174815fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {
48184816 const source = (try file.getSource(self.comp_module.gpa)).bytes;
48194817 var tokenizer = Tokenizer.init(source);