Commit 1878bdfbb1

Loris Cro <kappaloris@gmail.com>
2023-01-05 17:12:43
autodoc: fix bodyless fn type analysis and rendering
1 parent c6ea551
Changed files (3)
lib/docs/index.html
@@ -640,6 +640,7 @@
             <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>
             <div id="fnProto" class="hidden">
               <div class="mobile-scroll-container"><pre id="fnProtoCode" class="scroll-item"></pre></div>
+              <div id="fnSourceLink" style="display:flex;flex-direction:row;justify-content:flex-end;"></div>
             </div>
             <h1 id="hdrName" class="hidden"></h1>
             <div id="fnNoExamples" class="hidden">
lib/docs/main.js
@@ -29,6 +29,7 @@ var zigAnalysis;
   const domListValues = document.getElementById("listValues");
   const domFnProto = document.getElementById("fnProto");
   const domFnProtoCode = document.getElementById("fnProtoCode");
+  const domFnSourceLink = document.getElementById("fnSourceLink");
   const domSectParams = document.getElementById("sectParams");
   const domListParams = document.getElementById("listParams");
   const domTldDocs = document.getElementById("tldDocs");
@@ -548,6 +549,8 @@ var zigAnalysis;
       wantLink: true,
       fnDecl,
     });
+    
+    domFnSourceLink.innerHTML = "[<a target=\"_blank\" href=\"" + sourceFileLink(fnDecl) + "\">src</a>]";
 
     let docsSource = null;
     let srcNode = getAstNode(fnDecl.src);
@@ -1839,7 +1842,14 @@ var zigAnalysis;
           }
           case typeKinds.Fn: {
             let fnObj = typeObj;
+            let fnDecl = opts.fnDecl;
+            let linkFnNameDecl = opts.linkFnNameDecl;
+            opts.fnDecl = null;
+            opts.linkFnNameDecl = null;
             let payloadHtml = "";
+            if (opts.addParensIfFnSignature && fnObj.src == 0){
+              payloadHtml += "(";
+            }
             if (opts.wantHtml) {
               if (fnObj.is_extern) {
                 payloadHtml += "pub extern ";
@@ -1847,21 +1857,16 @@ var zigAnalysis;
               if (fnObj.has_lib_name) {
                 payloadHtml += '"' + fnObj.lib_name + '" ';
               }
-              payloadHtml += '<span class="tok-kw">fn</span>';
-              if (opts.fnDecl) {
-                payloadHtml += ' <span class="tok-fn">';
-                if (opts.linkFnNameDecl) {
+              payloadHtml += '<span class="tok-kw">fn </span>';
+              if (fnDecl) {
+                payloadHtml += '<span class="tok-fn">';
+                if (linkFnNameDecl) {
                   payloadHtml +=
-                    '<a href="' +
-                    opts.linkFnNameDecl +
-                    '">' +
-                    escapeHtml(opts.fnDecl.name) +
+                    '<a href="' + linkFnNameDecl + '">' +
+                      escapeHtml(fnDecl.name) +
                     "</a>";
                 } else {
-                  payloadHtml += escapeHtml(opts.fnDecl.name);
-                  payloadHtml = "<a target=\"_blank\" href=\"" +
-                    sourceFileLink(opts.fnDecl) + "\">" +
-                    escapeHtml(opts.fnDecl.name) + "</a>";
+                  payloadHtml += escapeHtml(fnDecl.name);
                 }
                 payloadHtml += "</span>";
               }
@@ -1872,10 +1877,12 @@ var zigAnalysis;
             if (fnObj.params) {
               let fields = null;
               let isVarArgs = false;
-              let fnNode = getAstNode(fnObj.src);
-              fields = fnNode.fields;
-              isVarArgs = fnNode.varArgs;
-
+              if (fnObj.src != 0) {
+                let fnNode = getAstNode(fnObj.src);
+                fields = fnNode.fields;
+                isVarArgs = fnNode.varArgs;
+              }
+          
               for (let i = 0; i < fnObj.params.length; i += 1) {
                 if (i != 0) {
                   payloadHtml += ", ";
@@ -1989,10 +1996,9 @@ var zigAnalysis;
                   }
                 } else if ("type" in value) {
                   let name = exprName(value, {
+                    ...opts,
                     wantHtml: false,
                     wantLink: false,
-                    fnDecl: opts.fnDecl,
-                    linkFnNameDecl: opts.linkFnNameDecl,
                   });
                   payloadHtml += '<span class="tok-kw">' + name + "</span>";
                 } else if ("binOpIndex" in value) {
@@ -2032,12 +2038,19 @@ var zigAnalysis;
               payloadHtml += "!";
             }
             if (fnObj.ret != null) {
-              payloadHtml += exprName(fnObj.ret, opts);
+              payloadHtml += exprName(fnObj.ret, {
+                ...opts, 
+                addParensIfFnSignature: true,
+              });
             } else if (opts.wantHtml) {
               payloadHtml += '<span class="tok-kw">anytype</span>';
             } else {
               payloadHtml += "anytype";
             }
+
+            if (opts.addParensIfFnSignature && fnObj.src == 0){
+              payloadHtml += ")";
+            }
             return payloadHtml;
           }
           // if (wantHtml) {
src/Autodoc.zig
@@ -3807,10 +3807,15 @@ fn analyzeFancyFunction(
         else => null,
     };
 
+    // if we're analyzing a funcion signature (ie without body), we
+    // actually don't have an ast_node reserved for us, but since
+    // we don't have a name, we don't need it.
+    const src = if (fn_info.body.len == 0) 0 else self_ast_node_index;
+
     self.types.items[type_slot_index] = .{
         .Fn = .{
             .name = "todo_name func",
-            .src = self_ast_node_index,
+            .src = src,
             .params = param_type_refs.items,
             .ret = ret_type_ref,
             .generic_ret = generic_ret,
@@ -3955,11 +3960,16 @@ fn analyzeFunction(
         } else break :blk ret_type_ref;
     };
 
+    // if we're analyzing a funcion signature (ie without body), we
+    // actually don't have an ast_node reserved for us, but since
+    // we don't have a name, we don't need it.
+    const src = if (fn_info.body.len == 0) 0 else self_ast_node_index;
+
     self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;
     self.types.items[type_slot_index] = .{
         .Fn = .{
             .name = "todo_name func",
-            .src = self_ast_node_index,
+            .src = src,
             .params = param_type_refs.items,
             .ret = ret_type,
             .generic_ret = generic_ret,