Commit e363ffad90

Krzysztof Wolicki <der.teufel.mail@gmail.com>
2023-05-05 01:46:19
autodoc: Better comptimeExpr code for blocks
1 parent 012f9a9
Changed files (2)
lib
docs
src
lib/docs/main.js
@@ -649,16 +649,16 @@ const NAV_MODES = {
     let lines = code.split("\n");
     let result = "";
     let indent_level = 0;
-    for(let i = 0; i < lines.length; i += 1) {
+    for (let i = 0; i < lines.length; i += 1) {
       let line = lines[i].trim();
-      if(line[0] == "}") indent_level -= 1;
-      for(let j = 0; j < indent_level; j += 1) {
+      if (line[0] == "}") indent_level -= 1;
+      for (let j = 0; j < indent_level; j += 1) {
         result += "    ";
       }
       if (line.startsWith("\\\\")) result += "    "
       result += line;
-      result += "\n";
-      if(line[line.length - 1] == "{") indent_level += 1;
+      if (i != lines.length - 1) result += "\n";
+      if (line[line.length - 1] == "{") indent_level += 1;
     }
     return result;
   }
@@ -1730,7 +1730,7 @@ const NAV_MODES = {
         return payloadHtml + "}";
       }
       case "comptimeExpr": {
-        return zigAnalysis.comptimeExprs[expr.comptimeExpr].code;
+        return renderZigSource(zigAnalysis.comptimeExprs[expr.comptimeExpr].code);
       }
       case "call": {
         let call = zigAnalysis.calls[expr.call];
@@ -2571,13 +2571,13 @@ const NAV_MODES = {
     } else if (
       resolvedValue.expr.string !== undefined ||
       resolvedValue.expr.call !== undefined ||
-      resolvedValue.expr.comptimeExpr
+      (resolvedValue.expr.comptimeExpr !== undefined && resolvedValue.typeRef !== null)
     ) {
       domFnProtoCode.innerHTML =
         '<span class="tok-kw">const</span> ' +
         escapeHtml(decl.name) +
         ": " +
-        exprName(resolvedValue.expr, { wantHtml: true, wantLink: true }) +
+        exprName(resolvedValue.typeRef !== null ? resolvedValue.typeRef : resolvedValue.expr, { wantHtml: true, wantLink: true }) +
         " = " +
         exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
         ";";
@@ -2628,13 +2628,13 @@ const NAV_MODES = {
     } else if (
       resolvedVar.expr.string !== undefined ||
       resolvedVar.expr.call !== undefined ||
-      resolvedVar.expr.comptimeExpr
+      resolvedVar.expr.comptimeExpr !== undefined
     ) {
       domFnProtoCode.innerHTML =
         '<span class="tok-kw">var</span> ' +
         escapeHtml(decl.name) +
         ": " +
-        exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) +
+        exprName(resolvedVar.typeRef !== null ? resolvedVar.typeRef : resolvedVar.expr, { wantHtml: true, wantLink: true }) +
         " = " +
         exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
         ";";
@@ -4850,4 +4850,11 @@ function RadixTree() {
 
 // BUT!
 
-// We want to be able to search "Hash", for example!
\ No newline at end of file
+// We want to be able to search "Hash", for example!
+
+function findDeclByName(name) {
+  for (let i = 0; i < zigAnalysis.decls.length; i += 1) {
+    let decl = zigAnalysis.decls[i];
+    if(decl[0] == name) return decl;
+  }
+}
\ No newline at end of file
src/Autodoc.zig
@@ -2153,11 +2153,13 @@ fn walkInstruction(
             };
         },
         .block => {
-            const res = DocData.WalkResult{ .expr = .{
-                .comptimeExpr = self.comptime_exprs.items.len,
-            } };
+            const res = DocData.WalkResult{
+                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
+            };
+            const block_expr = try self.getBlockSource(file, parent_src, inst_index);
             try self.comptime_exprs.append(self.arena, .{
-                .code = "if (...) { ... }",
+                .code = block_expr,
             });
             return res;
         },
@@ -2167,11 +2169,13 @@ fn walkInstruction(
                 parent_scope,
                 parent_src,
                 getBlockInlineBreak(file.zir, inst_index) orelse {
-                    const res = DocData.WalkResult{ .expr = .{
-                        .comptimeExpr = self.comptime_exprs.items.len,
-                    } };
+                    const res = DocData.WalkResult{
+                        .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                        .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
+                    };
+                    const block_inline_expr = try self.getBlockSource(file, parent_src, inst_index);
                     try self.comptime_exprs.append(self.arena, .{
-                        .code = "if (...) { ... }",
+                        .code = block_inline_expr,
                     });
                     return res;
                 },
@@ -3201,29 +3205,7 @@ fn analyzeDecl(
     const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
 
     const name: []const u8 = switch (decl_name_index) {
-        0, 1 => unreachable, // comptime or usingnamespace decl
-        2 => {
-            unreachable;
-            // decl test
-            // const decl_status = scope.resolveDeclName(doc_comment_index);
-            // const decl_being_tested = decl_status.Analyzed;
-            // const func_index = getBlockInlineBreak(file.zir, value_index).?;
-
-            // const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
-            // const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
-            // const tree = try file.getTree(self.comp_module.gpa);
-            // const test_source_code = tree.getNodeSource(fn_src.src_node);
-
-            // const ast_node_index = self.ast_nodes.items.len;
-            // try self.ast_nodes.append(self.arena, .{
-            //     .file = 0,
-            //     .line = 0,
-            //     .col = 0,
-            //     .code = test_source_code,
-            // });
-            // self.decls.items[decl_being_tested].decltest = ast_node_index;
-            // continue;
-        },
+        0, 1, 2 => unreachable, // comptime or usingnamespace decl, decltest
         else => blk: {
             if (file.zir.string_bytes[decl_name_index] == 0) {
                 // test decl
@@ -3360,15 +3342,11 @@ fn analyzeDecltest(
     const decl_name_index = file.zir.extra[d.sub_index + 7];
 
     // This is known to work because decl values are always block_inlines
+    const test_source_code = try self.getBlockSource(file, parent_src, value_index);
+
     const value_pl_node = data[value_index].pl_node;
     const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
 
-    const func_index = getBlockInlineBreak(file.zir, value_index).?;
-    const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
-    const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
-    const tree = try file.getTree(self.comp_module.gpa);
-    const test_source_code = tree.getNodeSource(fn_src.src_node);
-
     const decl_name: ?[]const u8 = if (decl_name_index != 0)
         file.zir.nullTerminatedString(decl_name_index)
     else
@@ -4814,6 +4792,43 @@ fn declIsVar(
     return (tags[tok_idx] == .keyword_var);
 }
 
+fn getBlockSource(
+    self: Autodoc,
+    file: *File,
+    parent_src: SrcLocInfo,
+    value_index: usize,
+) AutodocErrors![]const u8 {
+    const data = file.zir.instructions.items(.data);
+    const tags = file.zir.instructions.items(.tag);
+    const tree = try file.getTree(self.comp_module.gpa);
+
+    // This is known to work because decl values are always block_inlines
+    const block_pl_node = data[value_index].pl_node;
+    const block_src = try self.srcLocInfo(file, block_pl_node.src_node, parent_src);
+
+    const blk_index = idx: {
+        const pl_node = data[value_index].pl_node;
+        const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index);
+        const end_index = file.zir.extra[extra.end..][extra.data.body_len - 1];
+
+        if (tags[end_index] == .break_inline) {
+            break :idx @as(usize, Zir.refToIndex(data[end_index].@"break".operand).?);
+        } else {
+            break :idx null;
+        }
+    };
+
+    const blk_source = src: {
+        if (blk_index) |idx| {
+            const pl_node = data[idx].pl_node;
+            break :src try self.srcLocInfo(file, pl_node.src_node, block_src);
+        } else {
+            break :src block_src;
+        }
+    };
+    return tree.getNodeSource(blk_source.src_node);
+}
+
 fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {
     const source = (try file.getSource(self.comp_module.gpa)).bytes;
     var tokenizer = Tokenizer.init(source);