Skip to content

Commit 1878bdf

Browse files
committed
autodoc: fix bodyless fn type analysis and rendering
1 parent c6ea551 commit 1878bdf

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

lib/docs/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ <h2><span>Zig Version</span></h2>
640640
<div id="sectNav" class="hidden"><ul id="listNav"></ul></div>
641641
<div id="fnProto" class="hidden">
642642
<div class="mobile-scroll-container"><pre id="fnProtoCode" class="scroll-item"></pre></div>
643+
<div id="fnSourceLink" style="display:flex;flex-direction:row;justify-content:flex-end;"></div>
643644
</div>
644645
<h1 id="hdrName" class="hidden"></h1>
645646
<div id="fnNoExamples" class="hidden">

lib/docs/main.js

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ var zigAnalysis;
2929
const domListValues = document.getElementById("listValues");
3030
const domFnProto = document.getElementById("fnProto");
3131
const domFnProtoCode = document.getElementById("fnProtoCode");
32+
const domFnSourceLink = document.getElementById("fnSourceLink");
3233
const domSectParams = document.getElementById("sectParams");
3334
const domListParams = document.getElementById("listParams");
3435
const domTldDocs = document.getElementById("tldDocs");
@@ -548,6 +549,8 @@ var zigAnalysis;
548549
wantLink: true,
549550
fnDecl,
550551
});
552+
553+
domFnSourceLink.innerHTML = "[<a target=\"_blank\" href=\"" + sourceFileLink(fnDecl) + "\">src</a>]";
551554

552555
let docsSource = null;
553556
let srcNode = getAstNode(fnDecl.src);
@@ -1839,29 +1842,31 @@ var zigAnalysis;
18391842
}
18401843
case typeKinds.Fn: {
18411844
let fnObj = typeObj;
1845+
let fnDecl = opts.fnDecl;
1846+
let linkFnNameDecl = opts.linkFnNameDecl;
1847+
opts.fnDecl = null;
1848+
opts.linkFnNameDecl = null;
18421849
let payloadHtml = "";
1850+
if (opts.addParensIfFnSignature && fnObj.src == 0){
1851+
payloadHtml += "(";
1852+
}
18431853
if (opts.wantHtml) {
18441854
if (fnObj.is_extern) {
18451855
payloadHtml += "pub extern ";
18461856
}
18471857
if (fnObj.has_lib_name) {
18481858
payloadHtml += '"' + fnObj.lib_name + '" ';
18491859
}
1850-
payloadHtml += '<span class="tok-kw">fn</span>';
1851-
if (opts.fnDecl) {
1852-
payloadHtml += ' <span class="tok-fn">';
1853-
if (opts.linkFnNameDecl) {
1860+
payloadHtml += '<span class="tok-kw">fn </span>';
1861+
if (fnDecl) {
1862+
payloadHtml += '<span class="tok-fn">';
1863+
if (linkFnNameDecl) {
18541864
payloadHtml +=
1855-
'<a href="' +
1856-
opts.linkFnNameDecl +
1857-
'">' +
1858-
escapeHtml(opts.fnDecl.name) +
1865+
'<a href="' + linkFnNameDecl + '">' +
1866+
escapeHtml(fnDecl.name) +
18591867
"</a>";
18601868
} else {
1861-
payloadHtml += escapeHtml(opts.fnDecl.name);
1862-
payloadHtml = "<a target=\"_blank\" href=\"" +
1863-
sourceFileLink(opts.fnDecl) + "\">" +
1864-
escapeHtml(opts.fnDecl.name) + "</a>";
1869+
payloadHtml += escapeHtml(fnDecl.name);
18651870
}
18661871
payloadHtml += "</span>";
18671872
}
@@ -1872,10 +1877,12 @@ var zigAnalysis;
18721877
if (fnObj.params) {
18731878
let fields = null;
18741879
let isVarArgs = false;
1875-
let fnNode = getAstNode(fnObj.src);
1876-
fields = fnNode.fields;
1877-
isVarArgs = fnNode.varArgs;
1878-
1880+
if (fnObj.src != 0) {
1881+
let fnNode = getAstNode(fnObj.src);
1882+
fields = fnNode.fields;
1883+
isVarArgs = fnNode.varArgs;
1884+
}
1885+
18791886
for (let i = 0; i < fnObj.params.length; i += 1) {
18801887
if (i != 0) {
18811888
payloadHtml += ", ";
@@ -1989,10 +1996,9 @@ var zigAnalysis;
19891996
}
19901997
} else if ("type" in value) {
19911998
let name = exprName(value, {
1999+
...opts,
19922000
wantHtml: false,
19932001
wantLink: false,
1994-
fnDecl: opts.fnDecl,
1995-
linkFnNameDecl: opts.linkFnNameDecl,
19962002
});
19972003
payloadHtml += '<span class="tok-kw">' + name + "</span>";
19982004
} else if ("binOpIndex" in value) {
@@ -2032,12 +2038,19 @@ var zigAnalysis;
20322038
payloadHtml += "!";
20332039
}
20342040
if (fnObj.ret != null) {
2035-
payloadHtml += exprName(fnObj.ret, opts);
2041+
payloadHtml += exprName(fnObj.ret, {
2042+
...opts,
2043+
addParensIfFnSignature: true,
2044+
});
20362045
} else if (opts.wantHtml) {
20372046
payloadHtml += '<span class="tok-kw">anytype</span>';
20382047
} else {
20392048
payloadHtml += "anytype";
20402049
}
2050+
2051+
if (opts.addParensIfFnSignature && fnObj.src == 0){
2052+
payloadHtml += ")";
2053+
}
20412054
return payloadHtml;
20422055
}
20432056
// if (wantHtml) {

src/Autodoc.zig

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3807,10 +3807,15 @@ fn analyzeFancyFunction(
38073807
else => null,
38083808
};
38093809

3810+
// if we're analyzing a funcion signature (ie without body), we
3811+
// actually don't have an ast_node reserved for us, but since
3812+
// we don't have a name, we don't need it.
3813+
const src = if (fn_info.body.len == 0) 0 else self_ast_node_index;
3814+
38103815
self.types.items[type_slot_index] = .{
38113816
.Fn = .{
38123817
.name = "todo_name func",
3813-
.src = self_ast_node_index,
3818+
.src = src,
38143819
.params = param_type_refs.items,
38153820
.ret = ret_type_ref,
38163821
.generic_ret = generic_ret,
@@ -3955,11 +3960,16 @@ fn analyzeFunction(
39553960
} else break :blk ret_type_ref;
39563961
};
39573962

3963+
// if we're analyzing a funcion signature (ie without body), we
3964+
// actually don't have an ast_node reserved for us, but since
3965+
// we don't have a name, we don't need it.
3966+
const src = if (fn_info.body.len == 0) 0 else self_ast_node_index;
3967+
39583968
self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;
39593969
self.types.items[type_slot_index] = .{
39603970
.Fn = .{
39613971
.name = "todo_name func",
3962-
.src = self_ast_node_index,
3972+
.src = src,
39633973
.params = param_type_refs.items,
39643974
.ret = ret_type,
39653975
.generic_ret = generic_ret,

0 commit comments

Comments
 (0)