authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-01-08 16:25:14+01:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2023-01-08 16:25:14+01:00
log18f6ef613c7ae18433f1e7998b787f7a6b840215
tree8649ef1fd89c6c444a9e7a5a3692fedda91ca7b7
parent87b223428a8953b6af9bea61ff4cc905821c0557

autodoc: improve linking of decl references

there are still some bugs to solve when a decl is re-exported but straight-forward cases are handled correctly

1 files changed, 78 insertions(+), 91 deletions(-)

lib/docs/main.js+78-91
...@@ -93,8 +93,7 @@ var zigAnalysis;...@@ -93,8 +93,7 @@ var zigAnalysis;
93 // empty array means refers to the package itself93 // empty array means refers to the package itself
94 declNames: [],94 declNames: [],
95 // these will be all types, except the last one may be a type or a decl95 // these will be all types, except the last one may be a type or a decl
96 declObjs: [],96 declObjs: [],
97
98 // (a, b, c, d) comptime call; result is the value the docs refer to97 // (a, b, c, d) comptime call; result is the value the docs refer to
99 callName: null,98 callName: null,
100 };99 };
...@@ -451,6 +450,8 @@ var zigAnalysis;...@@ -451,6 +450,8 @@ var zigAnalysis;
451 curNav.declObjs.push(currentType);450 curNav.declObjs.push(currentType);
452 }451 }
453 452
453
454
454 window.x = currentType;455 window.x = currentType;
455456
456 renderNav();457 renderNav();
...@@ -819,6 +820,27 @@ var zigAnalysis;...@@ -819,6 +820,27 @@ var zigAnalysis;
819 return navLink(curNav.pkgNames, curNav.declNames.concat([childName]));820 return navLink(curNav.pkgNames, curNav.declNames.concat([childName]));
820 }821 }
821822
823 function findDeclNavLink(declName) {
824 if (curNav.declObjs.length == 0) return null;
825 const curFile = getAstNode(curNav.declObjs[curNav.declObjs.length-1].src).file;
826
827 for (let i = curNav.declObjs.length -1; i >= 0; i--) {
828 const curDecl = curNav.declObjs[i];
829 const curDeclName = curNav.declNames[i-1];
830 if (curDeclName == declName) {
831 const declPath = curNav.declNames.slice(0,i);
832 return navLink(curNav.pkgNames, declPath);
833 }
834
835 if (findSubDecl(curDecl, declName) != null) {
836 const declPath = curNav.declNames.slice(0,i).concat([declName]);
837 return navLink(curNav.pkgNames, declPath);
838 }
839 }
840
841 //throw("could not resolve links for '" + declName + "'");
842 }
843
822 //844 //
823 // function navLinkCall(callObj) {845 // function navLinkCall(callObj) {
824 // let declNamesCopy = curNav.declNames.concat([]);846 // let declNamesCopy = curNav.declNames.concat([]);
...@@ -879,7 +901,7 @@ var zigAnalysis;...@@ -879,7 +901,7 @@ var zigAnalysis;
879 return "false";901 return "false";
880 }902 }
881 case "&": {903 case "&": {
882 return "&" + exprName(zigAnalysis.exprs[expr["&"]]);904 return "&" + exprName(zigAnalysis.exprs[expr["&"]], opts);
883 }905 }
884 case "compileError": {906 case "compileError": {
885 let compileError = expr.compileError;907 let compileError = expr.compileError;
...@@ -896,18 +918,18 @@ var zigAnalysis;...@@ -896,18 +918,18 @@ var zigAnalysis;
896 let payloadHtml = "";918 let payloadHtml = "";
897 const lhsExpr = zigAnalysis.exprs[expr.slice.lhs];919 const lhsExpr = zigAnalysis.exprs[expr.slice.lhs];
898 const startExpr = zigAnalysis.exprs[expr.slice.start];920 const startExpr = zigAnalysis.exprs[expr.slice.start];
899 let decl = exprName(lhsExpr);921 let decl = exprName(lhsExpr, opts);
900 let start = exprName(startExpr);922 let start = exprName(startExpr, opts);
901 let end = "";923 let end = "";
902 let sentinel = "";924 let sentinel = "";
903 if (expr.slice["end"]) {925 if (expr.slice["end"]) {
904 const endExpr = zigAnalysis.exprs[expr.slice.end];926 const endExpr = zigAnalysis.exprs[expr.slice.end];
905 let end_ = exprName(endExpr);927 let end_ = exprName(endExpr, opts);
906 end += end_;928 end += end_;
907 }929 }
908 if (expr.slice["sentinel"]) {930 if (expr.slice["sentinel"]) {
909 const sentinelExpr = zigAnalysis.exprs[expr.slice.sentinel];931 const sentinelExpr = zigAnalysis.exprs[expr.slice.sentinel];
910 let sentinel_ = exprName(sentinelExpr);932 let sentinel_ = exprName(sentinelExpr, opts);
911 sentinel += " :" + sentinel_;933 sentinel += " :" + sentinel_;
912 }934 }
913 payloadHtml += decl + "[" + start + ".." + end + sentinel + "]";935 payloadHtml += decl + "[" + start + ".." + end + sentinel + "]";
...@@ -915,7 +937,7 @@ var zigAnalysis;...@@ -915,7 +937,7 @@ var zigAnalysis;
915 }937 }
916 case "sliceIndex": {938 case "sliceIndex": {
917 const sliceIndex = zigAnalysis.exprs[expr.sliceIndex];939 const sliceIndex = zigAnalysis.exprs[expr.sliceIndex];
918 return exprName(sliceIndex, opts);940 return exprName(sliceIndex, opts, opts);
919 }941 }
920 case "cmpxchg": {942 case "cmpxchg": {
921 const typeIndex = zigAnalysis.exprs[expr.cmpxchg.type];943 const typeIndex = zigAnalysis.exprs[expr.cmpxchg.type];
...@@ -1019,19 +1041,6 @@ var zigAnalysis;...@@ -1019,19 +1041,6 @@ var zigAnalysis;
1019 const switchIndex = zigAnalysis.exprs[expr.switchIndex];1041 const switchIndex = zigAnalysis.exprs[expr.switchIndex];
1020 return exprName(switchIndex, opts);1042 return exprName(switchIndex, opts);
1021 }1043 }
1022 case "refPath": {
1023 let name = exprName(expr.refPath[0]);
1024 for (let i = 1; i < expr.refPath.length; i++) {
1025 let component = undefined;
1026 if ("string" in expr.refPath[i]) {
1027 component = expr.refPath[i].string;
1028 } else {
1029 component = exprName(expr.refPath[i]);
1030 }
1031 name += "." + component;
1032 }
1033 return name;
1034 }
1035 case "fieldRef": {1044 case "fieldRef": {
1036 const enumObj = exprName({ type: expr.fieldRef.type }, opts);1045 const enumObj = exprName({ type: expr.fieldRef.type }, opts);
1037 const field =1046 const field =
...@@ -1581,10 +1590,46 @@ var zigAnalysis;...@@ -1581,10 +1590,46 @@ var zigAnalysis;
1581 return exprName(exprArg, opts);1590 return exprName(exprArg, opts);
1582 }1591 }
1583 case "declRef": {1592 case "declRef": {
1584 return getDecl(expr.declRef).name;1593 const name = getDecl(expr.declRef).name;
1594
1595 if (opts.wantHtml) {
1596 let payloadHtml = "";
1597 if (opts.wantLink) {
1598 payloadHtml += '<a href="'+ findDeclNavLink(name) +'">';
1599 }
1600 payloadHtml +=
1601 '<span class="tok-kw" style="color:lightblue;">' +
1602 name +
1603 "</span>";
1604 if (opts.wantLink) payloadHtml += "</a>";
1605 return payloadHtml;
1606 } else {
1607 return name;
1608 }
1585 }1609 }
1586 case "refPath": {1610 case "refPath": {
1587 return expr.refPath.map((x) => exprName(x, opts)).join(".");1611 let firstComponent = expr.refPath[0];
1612 let name = exprName(firstComponent, opts);
1613 let url = undefined;
1614 if (opts.wantLink && "declRef" in firstComponent) {
1615 url = findDeclNavLink(getDecl(firstComponent.declRef).name);
1616 }
1617 for (let i = 1; i < expr.refPath.length; i++) {
1618 let component = undefined;
1619 if ("string" in expr.refPath[i]) {
1620 component = expr.refPath[i].string;
1621 } else {
1622 component = exprName(expr.refPath[i], {...opts, wantLink: false});
1623 if (opts.wantLink && "declRef" in expr.refPath[i]) {
1624 url += "." + getDecl(expr.refPath[i].declRef).name;
1625 component = '<a href="'+ url +'">' +
1626 component +
1627 "</a>";
1628 }
1629 }
1630 name += "." + component;
1631 }
1632 return name;
1588 }1633 }
1589 case "int": {1634 case "int": {
1590 return "" + expr.int;1635 return "" + expr.int;
...@@ -1929,78 +1974,20 @@ var zigAnalysis;...@@ -1929,78 +1974,20 @@ var zigAnalysis;
1929 if (isVarArgs && i === fnObj.params.length - 1) {1974 if (isVarArgs && i === fnObj.params.length - 1) {
1930 payloadHtml += "...";1975 payloadHtml += "...";
1931 } else if ("alignOf" in value) {1976 } else if ("alignOf" in value) {
1932 if (opts.wantHtml) {1977 payloadHtml += exprName(value, opts);
1933 payloadHtml += '<a href="">';
1934 payloadHtml +=
1935 '<span class="tok-kw" style="color:lightblue;">' +
1936 exprName(value, opts) +
1937 "</span>";
1938 payloadHtml += "</a>";
1939 } else {
1940 payloadHtml += exprName(value, opts);
1941 }
1942 } else if ("typeOf" in value) {1978 } else if ("typeOf" in value) {
1943 if (opts.wantHtml) {1979 payloadHtml += exprName(value, opts);
1944 payloadHtml += '<a href="">';
1945 payloadHtml +=
1946 '<span class="tok-kw" style="color:lightblue;">' +
1947 exprName(value, opts) +
1948 "</span>";
1949 payloadHtml += "</a>";
1950 } else {
1951 payloadHtml += exprName(value, opts);
1952 }
1953 } else if ("typeOf_peer" in value) {1980 } else if ("typeOf_peer" in value) {
1954 if (opts.wantHtml) {
1955 payloadHtml += '<a href="">';
1956 payloadHtml +=
1957 '<span class="tok-kw" style="color:lightblue;">' +
1958 exprName(value, opts) +
1959 "</span>";
1960 payloadHtml += "</a>";
1961 } else {
1962 payloadHtml += exprName(value, opts);1981 payloadHtml += exprName(value, opts);
1963 }
1964 } else if ("declRef" in value) {1982 } else if ("declRef" in value) {
1965 if (opts.wantHtml) {
1966 payloadHtml += '<a href="">';
1967 payloadHtml +=
1968 '<span class="tok-kw" style="color:lightblue;">' +
1969 exprName(value, opts) +
1970 "</span>";
1971 payloadHtml += "</a>";
1972 } else {
1973 payloadHtml += exprName(value, opts);1983 payloadHtml += exprName(value, opts);
1974 }
1975 } else if ("call" in value) {1984 } else if ("call" in value) {
1976 if (opts.wantHtml) {
1977 payloadHtml += '<a href="">';
1978 payloadHtml +=
1979 '<span class="tok-kw" style="color:lightblue;">' +
1980 exprName(value, opts) +
1981 "</span>";
1982 payloadHtml += "</a>";
1983 } else {
1984 payloadHtml += exprName(value, opts);1985 payloadHtml += exprName(value, opts);
1985 }
1986 } else if ("refPath" in value) {1986 } else if ("refPath" in value) {
1987 if (opts.wantHtml) {
1988 payloadHtml += '<a href="">';
1989 payloadHtml +=
1990 '<span class="tok-kw" style="color:lightblue;">' +
1991 exprName(value, opts) +
1992 "</span>";
1993 payloadHtml += "</a>";
1994 } else {
1995 payloadHtml += exprName(value, opts);1987 payloadHtml += exprName(value, opts);
1996 }
1997 } else if ("type" in value) {1988 } else if ("type" in value) {
1998 let name = exprName(value, {1989 payloadHtml += exprName(value, opts);
1999 ...opts,1990 //payloadHtml += '<span class="tok-kw">' + name + "</span>";
2000 wantHtml: false,
2001 wantLink: false,
2002 });
2003 payloadHtml += '<span class="tok-kw">' + name + "</span>";
2004 } else if ("binOpIndex" in value) {1991 } else if ("binOpIndex" in value) {
2005 payloadHtml += exprName(value, opts);1992 payloadHtml += exprName(value, opts);
2006 } else if ("comptimeExpr" in value) {1993 } else if ("comptimeExpr" in value) {
...@@ -2405,11 +2392,10 @@ var zigAnalysis;...@@ -2405,11 +2392,10 @@ var zigAnalysis;
2405 }2392 }
24062393
2407 if (typesList.length !== 0) {2394 if (typesList.length !== 0) {
2408 window.x = typesList;
2409 resizeDomList(2395 resizeDomList(
2410 domListTypes,2396 domListTypes,
2411 typesList.length,2397 typesList.length,
2412 '<li><a href="#"></a></li>'2398 '<li><a href=""></a></li>'
2413 );2399 );
2414 for (let i = 0; i < typesList.length; i += 1) {2400 for (let i = 0; i < typesList.length; i += 1) {
2415 let liDom = domListTypes.children[i];2401 let liDom = domListTypes.children[i];
...@@ -2511,8 +2497,7 @@ var zigAnalysis;...@@ -2511,8 +2497,7 @@ var zigAnalysis;
2511 } else {2497 } else {
2512 let fieldTypeExpr = container.fields[i];2498 let fieldTypeExpr = container.fields[i];
2513 html += ": ";2499 html += ": ";
2514 let name = exprName(fieldTypeExpr, false, false);2500 html += exprName(fieldTypeExpr, {wantHtml:true, wantLink:true});
2515 html += '<span class="tok-kw">' + name + "</span>";
2516 let tsn = typeShorthandName(fieldTypeExpr);2501 let tsn = typeShorthandName(fieldTypeExpr);
2517 if (tsn) {2502 if (tsn) {
2518 html += "<span> (" + tsn + ")</span>";2503 html += "<span> (" + tsn + ")</span>";
...@@ -2746,13 +2731,15 @@ var zigAnalysis;...@@ -2746,13 +2731,15 @@ var zigAnalysis;
2746 }2731 }
2747 }2732 }
27482733
2749 function findSubDecl(parentType, childName) {2734 function findSubDecl(parentTypeOrDecl, childName) {
2735 let parentType = parentTypeOrDecl;
2750 {2736 {
2751 // Generic functions2737 // Generic functions / resorlving decls
2752 if ("value" in parentType) {2738 if ("value" in parentType) {
2753 const rv = resolveValue(parentType.value);2739 const rv = resolveValue(parentType.value);
2754 if ("type" in rv.expr) {2740 if ("type" in rv.expr) {
2755 const t = getType(rv.expr.type);2741 const t = getType(rv.expr.type);
2742 parentType = t;
2756 if (t.kind == typeKinds.Fn && t.generic_ret != null) {2743 if (t.kind == typeKinds.Fn && t.generic_ret != null) {
2757 let resolvedGenericRet = resolveValue({ expr: t.generic_ret });2744 let resolvedGenericRet = resolveValue({ expr: t.generic_ret });
27582745