authorgravatar for der.teufel.mail@gmail.comKrzysztof Wolicki <der.teufel.mail@gmail.com> 2023-05-05 01:46:19+02:00
committergravatar for der.teufel.mail@gmail.comKrzysztof Wolicki <der.teufel.mail@gmail.com> 2023-05-05 01:46:19+02:00
loge363ffad903b0f66283fe25de98f3e181d371fc7
tree47db71f68a18060d82dc265d3d242e99bacc671f
parent012f9a97eb74c63921ce7f3a036c71816fb59a24

autodoc: Better comptimeExpr code for blocks


2 files changed, 70 insertions(+), 48 deletions(-)

lib/docs/main.js+18-11
...@@ -649,16 +649,16 @@ const NAV_MODES = {...@@ -649,16 +649,16 @@ const NAV_MODES = {
649 let lines = code.split("\n");649 let lines = code.split("\n");
650 let result = "";650 let result = "";
651 let indent_level = 0;651 let indent_level = 0;
652 for(let i = 0; i < lines.length; i += 1) {652 for (let i = 0; i < lines.length; i += 1) {
653 let line = lines[i].trim();653 let line = lines[i].trim();
654 if(line[0] == "}") indent_level -= 1;654 if (line[0] == "}") indent_level -= 1;
655 for(let j = 0; j < indent_level; j += 1) {655 for (let j = 0; j < indent_level; j += 1) {
656 result += " ";656 result += " ";
657 }657 }
658 if (line.startsWith("\\\\")) result += " "658 if (line.startsWith("\\\\")) result += " "
659 result += line;659 result += line;
660 result += "\n";660 if (i != lines.length - 1) result += "\n";
661 if(line[line.length - 1] == "{") indent_level += 1;661 if (line[line.length - 1] == "{") indent_level += 1;
662 }662 }
663 return result;663 return result;
664 }664 }
...@@ -1730,7 +1730,7 @@ const NAV_MODES = {...@@ -1730,7 +1730,7 @@ const NAV_MODES = {
1730 return payloadHtml + "}";1730 return payloadHtml + "}";
1731 }1731 }
1732 case "comptimeExpr": {1732 case "comptimeExpr": {
1733 return zigAnalysis.comptimeExprs[expr.comptimeExpr].code;1733 return renderZigSource(zigAnalysis.comptimeExprs[expr.comptimeExpr].code);
1734 }1734 }
1735 case "call": {1735 case "call": {
1736 let call = zigAnalysis.calls[expr.call];1736 let call = zigAnalysis.calls[expr.call];
...@@ -2571,13 +2571,13 @@ const NAV_MODES = {...@@ -2571,13 +2571,13 @@ const NAV_MODES = {
2571 } else if (2571 } else if (
2572 resolvedValue.expr.string !== undefined ||2572 resolvedValue.expr.string !== undefined ||
2573 resolvedValue.expr.call !== undefined ||2573 resolvedValue.expr.call !== undefined ||
2574 resolvedValue.expr.comptimeExpr2574 (resolvedValue.expr.comptimeExpr !== undefined && resolvedValue.typeRef !== null)
2575 ) {2575 ) {
2576 domFnProtoCode.innerHTML =2576 domFnProtoCode.innerHTML =
2577 '<span class="tok-kw">const</span> ' +2577 '<span class="tok-kw">const</span> ' +
2578 escapeHtml(decl.name) +2578 escapeHtml(decl.name) +
2579 ": " +2579 ": " +
2580 exprName(resolvedValue.expr, { wantHtml: true, wantLink: true }) +2580 exprName(resolvedValue.typeRef !== null ? resolvedValue.typeRef : resolvedValue.expr, { wantHtml: true, wantLink: true }) +
2581 " = " +2581 " = " +
2582 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +2582 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2583 ";";2583 ";";
...@@ -2628,13 +2628,13 @@ const NAV_MODES = {...@@ -2628,13 +2628,13 @@ const NAV_MODES = {
2628 } else if (2628 } else if (
2629 resolvedVar.expr.string !== undefined ||2629 resolvedVar.expr.string !== undefined ||
2630 resolvedVar.expr.call !== undefined ||2630 resolvedVar.expr.call !== undefined ||
2631 resolvedVar.expr.comptimeExpr2631 resolvedVar.expr.comptimeExpr !== undefined
2632 ) {2632 ) {
2633 domFnProtoCode.innerHTML =2633 domFnProtoCode.innerHTML =
2634 '<span class="tok-kw">var</span> ' +2634 '<span class="tok-kw">var</span> ' +
2635 escapeHtml(decl.name) +2635 escapeHtml(decl.name) +
2636 ": " +2636 ": " +
2637 exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) +2637 exprName(resolvedVar.typeRef !== null ? resolvedVar.typeRef : resolvedVar.expr, { wantHtml: true, wantLink: true }) +
2638 " = " +2638 " = " +
2639 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +2639 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2640 ";";2640 ";";
...@@ -4850,4 +4850,11 @@ function RadixTree() {...@@ -4850,4 +4850,11 @@ function RadixTree() {
48504850
4851// BUT!4851// BUT!
48524852
4853// We want to be able to search "Hash", for example!
\ No newline at end of file
4853// We want to be able to search "Hash", for example!
4854
4855function findDeclByName(name) {
4856 for (let i = 0; i < zigAnalysis.decls.length; i += 1) {
4857 let decl = zigAnalysis.decls[i];
4858 if(decl[0] == name) return decl;
4859 }
4860}
\ No newline at end of file
src/Autodoc.zig+52-37
...@@ -2153,11 +2153,13 @@ fn walkInstruction(...@@ -2153,11 +2153,13 @@ fn walkInstruction(
2153 };2153 };
2154 },2154 },
2155 .block => {2155 .block => {
2156 const res = DocData.WalkResult{ .expr = .{2156 const res = DocData.WalkResult{
2157 .comptimeExpr = self.comptime_exprs.items.len,2157 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
2158 } };2158 .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
2159 };
2160 const block_expr = try self.getBlockSource(file, parent_src, inst_index);
2159 try self.comptime_exprs.append(self.arena, .{2161 try self.comptime_exprs.append(self.arena, .{
2160 .code = "if (...) { ... }",2162 .code = block_expr,
2161 });2163 });
2162 return res;2164 return res;
2163 },2165 },
...@@ -2167,11 +2169,13 @@ fn walkInstruction(...@@ -2167,11 +2169,13 @@ fn walkInstruction(
2167 parent_scope,2169 parent_scope,
2168 parent_src,2170 parent_src,
2169 getBlockInlineBreak(file.zir, inst_index) orelse {2171 getBlockInlineBreak(file.zir, inst_index) orelse {
2170 const res = DocData.WalkResult{ .expr = .{2172 const res = DocData.WalkResult{
2171 .comptimeExpr = self.comptime_exprs.items.len,2173 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
2172 } };2174 .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
2175 };
2176 const block_inline_expr = try self.getBlockSource(file, parent_src, inst_index);
2173 try self.comptime_exprs.append(self.arena, .{2177 try self.comptime_exprs.append(self.arena, .{
2174 .code = "if (...) { ... }",2178 .code = block_inline_expr,
2175 });2179 });
2176 return res;2180 return res;
2177 },2181 },
...@@ -3201,29 +3205,7 @@ fn analyzeDecl(...@@ -3201,29 +3205,7 @@ fn analyzeDecl(
3201 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);3205 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
32023206
3203 const name: []const u8 = switch (decl_name_index) {3207 const name: []const u8 = switch (decl_name_index) {
3204 0, 1 => unreachable, // comptime or usingnamespace decl3208 0, 1, 2 => unreachable, // comptime or usingnamespace decl, decltest
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 },
3227 else => blk: {3209 else => blk: {
3228 if (file.zir.string_bytes[decl_name_index] == 0) {3210 if (file.zir.string_bytes[decl_name_index] == 0) {
3229 // test decl3211 // test decl
...@@ -3360,15 +3342,11 @@ fn analyzeDecltest(...@@ -3360,15 +3342,11 @@ fn analyzeDecltest(
3360 const decl_name_index = file.zir.extra[d.sub_index + 7];3342 const decl_name_index = file.zir.extra[d.sub_index + 7];
33613343
3362 // This is known to work because decl values are always block_inlines3344 // This is known to work because decl values are always block_inlines
3345 const test_source_code = try self.getBlockSource(file, parent_src, value_index);
3346
3363 const value_pl_node = data[value_index].pl_node;3347 const value_pl_node = data[value_index].pl_node;
3364 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);3348 const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
33653349
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);
3371
3372 const decl_name: ?[]const u8 = if (decl_name_index != 0)3350 const decl_name: ?[]const u8 = if (decl_name_index != 0)
3373 file.zir.nullTerminatedString(decl_name_index)3351 file.zir.nullTerminatedString(decl_name_index)
3374 else3352 else
...@@ -4814,6 +4792,43 @@ fn declIsVar(...@@ -4814,6 +4792,43 @@ fn declIsVar(
4814 return (tags[tok_idx] == .keyword_var);4792 return (tags[tok_idx] == .keyword_var);
4815}4793}
48164794
4795fn getBlockSource(
4796 self: Autodoc,
4797 file: *File,
4798 parent_src: SrcLocInfo,
4799 value_index: usize,
4800) AutodocErrors![]const u8 {
4801 const data = file.zir.instructions.items(.data);
4802 const tags = file.zir.instructions.items(.tag);
4803 const tree = try file.getTree(self.comp_module.gpa);
4804
4805 // This is known to work because decl values are always block_inlines
4806 const block_pl_node = data[value_index].pl_node;
4807 const block_src = try self.srcLocInfo(file, block_pl_node.src_node, parent_src);
4808
4809 const blk_index = idx: {
4810 const pl_node = data[value_index].pl_node;
4811 const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index);
4812 const end_index = file.zir.extra[extra.end..][extra.data.body_len - 1];
4813
4814 if (tags[end_index] == .break_inline) {
4815 break :idx @as(usize, Zir.refToIndex(data[end_index].@"break".operand).?);
4816 } else {
4817 break :idx null;
4818 }
4819 };
4820
4821 const blk_source = src: {
4822 if (blk_index) |idx| {
4823 const pl_node = data[idx].pl_node;
4824 break :src try self.srcLocInfo(file, pl_node.src_node, block_src);
4825 } else {
4826 break :src block_src;
4827 }
4828 };
4829 return tree.getNodeSource(blk_source.src_node);
4830}
4831
4817fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {4832fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {
4818 const source = (try file.getSource(self.comp_module.gpa)).bytes;4833 const source = (try file.getSource(self.comp_module.gpa)).bytes;
4819 var tokenizer = Tokenizer.init(source);4834 var tokenizer = Tokenizer.init(source);