authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-01-05 17:12:43+01:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-01-05 17:12:43+01:00
log1878bdfbb127321d327ce3cfd8ec148959302b95
tree4953a0bd70913cab3710348771bda0883ee325e5
parentc6ea551c7d79195d0b385efdf34f30edf84733d1

autodoc: fix bodyless fn type analysis and rendering


3 files changed, 45 insertions(+), 21 deletions(-)

lib/docs/index.html+1
......@@ -640,6 +640,7 @@
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+32-19
......@@ -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,7 +1842,14 @@ 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 ";
......@@ -1847,21 +1857,16 @@ var zigAnalysis;
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+12-2
......@@ -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,