zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1878bdfbb127321d327ce3cfd8ec148959302b95 (tree)
parent c6ea551c7d79195d0b385efdf34f30edf84733d1
Author: Loris Cro <kappaloris@gmail.com>
Date:   Thu,  5 Jan 2023 17:12:43 +0100

autodoc: fix bodyless fn type analysis and rendering

Diffstat:
Mlib/docs/index.html | 1+
Mlib/docs/main.js | 51++++++++++++++++++++++++++++++++-------------------
Msrc/Autodoc.zig | 14++++++++++++--
3 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/lib/docs/index.html b/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"> diff --git a/lib/docs/main.js b/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) { diff --git a/src/Autodoc.zig b/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,