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 @@...@@ -640,6 +640,7 @@
640 <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>640 <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>
641 <div id="fnProto" class="hidden">641 <div id="fnProto" class="hidden">
642 <div class="mobile-scroll-container"><pre id="fnProtoCode" class="scroll-item"></pre></div>642 <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>
643 </div>644 </div>
644 <h1 id="hdrName" class="hidden"></h1>645 <h1 id="hdrName" class="hidden"></h1>
645 <div id="fnNoExamples" class="hidden">646 <div id="fnNoExamples" class="hidden">
lib/docs/main.js+32-19
...@@ -29,6 +29,7 @@ var zigAnalysis;...@@ -29,6 +29,7 @@ var zigAnalysis;
29 const domListValues = document.getElementById("listValues");29 const domListValues = document.getElementById("listValues");
30 const domFnProto = document.getElementById("fnProto");30 const domFnProto = document.getElementById("fnProto");
31 const domFnProtoCode = document.getElementById("fnProtoCode");31 const domFnProtoCode = document.getElementById("fnProtoCode");
32 const domFnSourceLink = document.getElementById("fnSourceLink");
32 const domSectParams = document.getElementById("sectParams");33 const domSectParams = document.getElementById("sectParams");
33 const domListParams = document.getElementById("listParams");34 const domListParams = document.getElementById("listParams");
34 const domTldDocs = document.getElementById("tldDocs");35 const domTldDocs = document.getElementById("tldDocs");
...@@ -548,6 +549,8 @@ var zigAnalysis;...@@ -548,6 +549,8 @@ var zigAnalysis;
548 wantLink: true,549 wantLink: true,
549 fnDecl,550 fnDecl,
550 });551 });
552
553 domFnSourceLink.innerHTML = "[<a target=\"_blank\" href=\"" + sourceFileLink(fnDecl) + "\">src</a>]";
551554
552 let docsSource = null;555 let docsSource = null;
553 let srcNode = getAstNode(fnDecl.src);556 let srcNode = getAstNode(fnDecl.src);
...@@ -1839,7 +1842,14 @@ var zigAnalysis;...@@ -1839,7 +1842,14 @@ var zigAnalysis;
1839 }1842 }
1840 case typeKinds.Fn: {1843 case typeKinds.Fn: {
1841 let fnObj = typeObj;1844 let fnObj = typeObj;
1845 let fnDecl = opts.fnDecl;
1846 let linkFnNameDecl = opts.linkFnNameDecl;
1847 opts.fnDecl = null;
1848 opts.linkFnNameDecl = null;
1842 let payloadHtml = "";1849 let payloadHtml = "";
1850 if (opts.addParensIfFnSignature && fnObj.src == 0){
1851 payloadHtml += "(";
1852 }
1843 if (opts.wantHtml) {1853 if (opts.wantHtml) {
1844 if (fnObj.is_extern) {1854 if (fnObj.is_extern) {
1845 payloadHtml += "pub extern ";1855 payloadHtml += "pub extern ";
...@@ -1847,21 +1857,16 @@ var zigAnalysis;...@@ -1847,21 +1857,16 @@ var zigAnalysis;
1847 if (fnObj.has_lib_name) {1857 if (fnObj.has_lib_name) {
1848 payloadHtml += '"' + fnObj.lib_name + '" ';1858 payloadHtml += '"' + fnObj.lib_name + '" ';
1849 }1859 }
1850 payloadHtml += '<span class="tok-kw">fn</span>';1860 payloadHtml += '<span class="tok-kw">fn </span>';
1851 if (opts.fnDecl) {1861 if (fnDecl) {
1852 payloadHtml += ' <span class="tok-fn">';1862 payloadHtml += '<span class="tok-fn">';
1853 if (opts.linkFnNameDecl) {1863 if (linkFnNameDecl) {
1854 payloadHtml +=1864 payloadHtml +=
1855 '<a href="' +1865 '<a href="' + linkFnNameDecl + '">' +
1856 opts.linkFnNameDecl +1866 escapeHtml(fnDecl.name) +
1857 '">' +
1858 escapeHtml(opts.fnDecl.name) +
1859 "</a>";1867 "</a>";
1860 } else {1868 } else {
1861 payloadHtml += escapeHtml(opts.fnDecl.name);1869 payloadHtml += escapeHtml(fnDecl.name);
1862 payloadHtml = "<a target=\"_blank\" href=\"" +
1863 sourceFileLink(opts.fnDecl) + "\">" +
1864 escapeHtml(opts.fnDecl.name) + "</a>";
1865 }1870 }
1866 payloadHtml += "</span>";1871 payloadHtml += "</span>";
1867 }1872 }
...@@ -1872,10 +1877,12 @@ var zigAnalysis;...@@ -1872,10 +1877,12 @@ var zigAnalysis;
1872 if (fnObj.params) {1877 if (fnObj.params) {
1873 let fields = null;1878 let fields = null;
1874 let isVarArgs = false;1879 let isVarArgs = false;
1875 let fnNode = getAstNode(fnObj.src);1880 if (fnObj.src != 0) {
1876 fields = fnNode.fields;1881 let fnNode = getAstNode(fnObj.src);
1877 isVarArgs = fnNode.varArgs;1882 fields = fnNode.fields;
18781883 isVarArgs = fnNode.varArgs;
1884 }
1885
1879 for (let i = 0; i < fnObj.params.length; i += 1) {1886 for (let i = 0; i < fnObj.params.length; i += 1) {
1880 if (i != 0) {1887 if (i != 0) {
1881 payloadHtml += ", ";1888 payloadHtml += ", ";
...@@ -1989,10 +1996,9 @@ var zigAnalysis;...@@ -1989,10 +1996,9 @@ var zigAnalysis;
1989 }1996 }
1990 } else if ("type" in value) {1997 } else if ("type" in value) {
1991 let name = exprName(value, {1998 let name = exprName(value, {
1999 ...opts,
1992 wantHtml: false,2000 wantHtml: false,
1993 wantLink: false,2001 wantLink: false,
1994 fnDecl: opts.fnDecl,
1995 linkFnNameDecl: opts.linkFnNameDecl,
1996 });2002 });
1997 payloadHtml += '<span class="tok-kw">' + name + "</span>";2003 payloadHtml += '<span class="tok-kw">' + name + "</span>";
1998 } else if ("binOpIndex" in value) {2004 } else if ("binOpIndex" in value) {
...@@ -2032,12 +2038,19 @@ var zigAnalysis;...@@ -2032,12 +2038,19 @@ var zigAnalysis;
2032 payloadHtml += "!";2038 payloadHtml += "!";
2033 }2039 }
2034 if (fnObj.ret != null) {2040 if (fnObj.ret != null) {
2035 payloadHtml += exprName(fnObj.ret, opts);2041 payloadHtml += exprName(fnObj.ret, {
2042 ...opts,
2043 addParensIfFnSignature: true,
2044 });
2036 } else if (opts.wantHtml) {2045 } else if (opts.wantHtml) {
2037 payloadHtml += '<span class="tok-kw">anytype</span>';2046 payloadHtml += '<span class="tok-kw">anytype</span>';
2038 } else {2047 } else {
2039 payloadHtml += "anytype";2048 payloadHtml += "anytype";
2040 }2049 }
2050
2051 if (opts.addParensIfFnSignature && fnObj.src == 0){
2052 payloadHtml += ")";
2053 }
2041 return payloadHtml;2054 return payloadHtml;
2042 }2055 }
2043 // if (wantHtml) {2056 // if (wantHtml) {
src/Autodoc.zig+12-2
...@@ -3807,10 +3807,15 @@ fn analyzeFancyFunction(...@@ -3807,10 +3807,15 @@ fn analyzeFancyFunction(
3807 else => null,3807 else => null,
3808 };3808 };
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
3810 self.types.items[type_slot_index] = .{3815 self.types.items[type_slot_index] = .{
3811 .Fn = .{3816 .Fn = .{
3812 .name = "todo_name func",3817 .name = "todo_name func",
3813 .src = self_ast_node_index,3818 .src = src,
3814 .params = param_type_refs.items,3819 .params = param_type_refs.items,
3815 .ret = ret_type_ref,3820 .ret = ret_type_ref,
3816 .generic_ret = generic_ret,3821 .generic_ret = generic_ret,
...@@ -3955,11 +3960,16 @@ fn analyzeFunction(...@@ -3955,11 +3960,16 @@ fn analyzeFunction(
3955 } else break :blk ret_type_ref;3960 } else break :blk ret_type_ref;
3956 };3961 };
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
3958 self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;3968 self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;
3959 self.types.items[type_slot_index] = .{3969 self.types.items[type_slot_index] = .{
3960 .Fn = .{3970 .Fn = .{
3961 .name = "todo_name func",3971 .name = "todo_name func",
3962 .src = self_ast_node_index,3972 .src = src,
3963 .params = param_type_refs.items,3973 .params = param_type_refs.items,
3964 .ret = ret_type,3974 .ret = ret_type,
3965 .generic_ret = generic_ret,3975 .generic_ret = generic_ret,