zig

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

commit 253e7e112e06d899e7b51194a637f4fddc6c1d65 (tree)
parent fbf0d0bee9c37c24b0b54962eaf05a535e814bc9
Author: Loris Cro <kappaloris@gmail.com>
Date:   Tue, 22 Feb 2022 20:18:45 +0100

autodoc: add frontend support for optionals & generic cleanup

Diffstat:
Mlib/docs/main.js | 254+++++++++++++++++++++++++++++++++++++++++++------------------------------------
1 file changed, 137 insertions(+), 117 deletions(-)

diff --git a/lib/docs/main.js b/lib/docs/main.js @@ -149,8 +149,9 @@ while(i < 1000) { i += 1; - if ("declRef" in value) { - value = zigAnalysis.decls[value.declRef].value; + if ("declPath" in value) { + console.assert(value.declPath.length == 1); // only support declRefs for now + value = zigAnalysis.decls[value.declPath[0]].value; continue; } @@ -169,8 +170,9 @@ return typeTypeId; } - if ("declRef" in decl.value) { - decl = zigAnalysis.decls[decl.value.declRef]; + if ("declPath" in decl.value) { + console.assert(decl.value.declPath.length == 1); // only support declRefs for now + decl = zigAnalysis.decls[decl.value.declPath[0]]; continue; } @@ -193,6 +195,7 @@ console.log("TODO: handle in `typeOfDecl` more cases: ", decl); console.assert(false); + throw {}; } console.assert(false); } @@ -637,6 +640,25 @@ } function typeIndexName(typeIndex, wantHtml, wantLink, fnDecl, linkFnNameDecl) { + return typeValueName({ type: typeIndex }, wantHtml, wantLink, fnDecl, linkFnNameDecl); + } + + function typeValueName(typeValue, wantHtml, wantLink, fnDecl, linkFnNameDecl) { + if ("declPath" in typeValue) { + console.assert(typeValue.declPath.length == 1); + var declIndex = typeValue.declPath[0]; + var name = zigAnalysis.decls[declIndex].name; + var declPath = getCanonDeclPath(declIndex); + if (wantLink) { + var nl = navLink(declPath.pkgNames, declPath.declNames); + return '<a href="' + nl + '">' + name + '</a>'; + } else { + return name; + } + } + + console.assert("type" in typeValue) + var typeIndex = typeValue.type; var typeObj = zigAnalysis.types[typeIndex]; var declNameOk = declCanRepresentTypeKind(typeObj.kind); if (wantLink) { @@ -714,10 +736,11 @@ name += typeObj.len; } name += "]"; - name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null); + name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null); return name; case typeKinds.Optional: - return "?" + typeIndexName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl); + + return "?" + typeValueName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl); case typeKinds.Pointer: var name = ""; switch (typeObj.len) { @@ -776,7 +799,7 @@ } name += ") "; } - name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null); + name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null); return name; case typeKinds.Float: if (wantHtml) { @@ -949,13 +972,9 @@ } } - var retValue = resolveValue(typeObj.ret); - console.assert("type" in retValue); - var retTypeIndex = retValue.type; - - payloadHtml += ') '; - if (retTypeIndex != null) { - payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl); + payloadHtml += ') '; + if (typeObj.ret != null) { + payloadHtml += typeValueName(typeObj.ret, wantHtml, wantSubLink, fnDecl); } else if (wantHtml) { payloadHtml += '<span class="tok-kw">anytype</span>'; } else { @@ -1188,10 +1207,10 @@ var kind = value.kind; if (kind === typeKinds.Fn) { //if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) { - // typesList.push(decl); - //} else { - fnsList.push(decl); - // } + // typesList.push(decl); + //} else { + fnsList.push(decl); + // } } else if (typeIsErrSet(declValue.type)) { errSetsList.push(decl); @@ -1295,8 +1314,9 @@ if (typeof(field) === 'object') { if (field.failure === true) { html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>'; - } else if ("declRef" in field) { - var decl = zigAnalysis.decls[field.declRef]; + } else if ("declPath" in field) { + console.assert(field.declPath.lenght == 1); + var decl = zigAnalysis.decls[field.declPath[0]]; var val = resolveValue(decl.value); console.assert("type" in val); var valType = zigAnalysis.types[val.type]; @@ -2002,117 +2022,117 @@ } } - function showHelpModal() { - domHelpModal.classList.remove("hidden"); - domHelpModal.style.left = (window.innerWidth / 2 - domHelpModal.clientWidth / 2) + "px"; - domHelpModal.style.top = (window.innerHeight / 2 - domHelpModal.clientHeight / 2) + "px"; - domHelpModal.focus(); - } - - function clearAsyncSearch() { - if (searchTimer != null) { - clearTimeout(searchTimer); - searchTimer = null; - } - } +function showHelpModal() { + domHelpModal.classList.remove("hidden"); + domHelpModal.style.left = (window.innerWidth / 2 - domHelpModal.clientWidth / 2) + "px"; + domHelpModal.style.top = (window.innerHeight / 2 - domHelpModal.clientHeight / 2) + "px"; + domHelpModal.focus(); +} - function startAsyncSearch() { - clearAsyncSearch(); - searchTimer = setTimeout(startSearch, 100); +function clearAsyncSearch() { + if (searchTimer != null) { + clearTimeout(searchTimer); + searchTimer = null; } - function startSearch() { - clearAsyncSearch(); - var oldHash = location.hash; - var parts = oldHash.split("?"); - var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value); - location.hash = (parts.length === 1) ? (oldHash + newPart2) : (parts[0] + newPart2); - } - function getSearchTerms() { - var list = curNavSearch.trim().split(/[ \r\n\t]+/); - list.sort(); - return list; - } - function renderSearch() { - var matchedItems = []; - var ignoreCase = (curNavSearch.toLowerCase() === curNavSearch); - var terms = getSearchTerms(); - - decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) { - var canonPath = getCanonDeclPath(declIndex); - if (canonPath == null) continue; +} - var decl = zigAnalysis.decls[declIndex]; - var lastPkgName = canonPath.pkgNames[canonPath.pkgNames.length - 1]; - var fullPathSearchText = lastPkgName + "." + canonPath.declNames.join('.'); - var astNode = zigAnalysis.astNodes[decl.src]; - var fileAndDocs = zigAnalysis.files[astNode.file]; - if (astNode.docs != null) { - fileAndDocs += "\n" + astNode.docs; +function startAsyncSearch() { + clearAsyncSearch(); + searchTimer = setTimeout(startSearch, 100); +} +function startSearch() { + clearAsyncSearch(); + var oldHash = location.hash; + var parts = oldHash.split("?"); + var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value); + location.hash = (parts.length === 1) ? (oldHash + newPart2) : (parts[0] + newPart2); +} +function getSearchTerms() { + var list = curNavSearch.trim().split(/[ \r\n\t]+/); + list.sort(); + return list; +} +function renderSearch() { + var matchedItems = []; + var ignoreCase = (curNavSearch.toLowerCase() === curNavSearch); + var terms = getSearchTerms(); + + decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) { + var canonPath = getCanonDeclPath(declIndex); + if (canonPath == null) continue; + + var decl = zigAnalysis.decls[declIndex]; + var lastPkgName = canonPath.pkgNames[canonPath.pkgNames.length - 1]; + var fullPathSearchText = lastPkgName + "." + canonPath.declNames.join('.'); + var astNode = zigAnalysis.astNodes[decl.src]; + var fileAndDocs = zigAnalysis.files[astNode.file]; + if (astNode.docs != null) { + fileAndDocs += "\n" + astNode.docs; + } + var fullPathSearchTextLower = fullPathSearchText; + if (ignoreCase) { + fullPathSearchTextLower = fullPathSearchTextLower.toLowerCase(); + fileAndDocs = fileAndDocs.toLowerCase(); + } + + var points = 0; + for (var termIndex = 0; termIndex < terms.length; termIndex += 1) { + var term = terms[termIndex]; + + // exact, case sensitive match of full decl path + if (fullPathSearchText === term) { + points += 4; + continue; } - var fullPathSearchTextLower = fullPathSearchText; - if (ignoreCase) { - fullPathSearchTextLower = fullPathSearchTextLower.toLowerCase(); - fileAndDocs = fileAndDocs.toLowerCase(); + // exact, case sensitive match of just decl name + if (decl.name == term) { + points += 3; + continue; } - - var points = 0; - for (var termIndex = 0; termIndex < terms.length; termIndex += 1) { - var term = terms[termIndex]; - - // exact, case sensitive match of full decl path - if (fullPathSearchText === term) { - points += 4; - continue; - } - // exact, case sensitive match of just decl name - if (decl.name == term) { - points += 3; - continue; - } - // substring, case insensitive match of full decl path - if (fullPathSearchTextLower.indexOf(term) >= 0) { - points += 2; - continue; - } - if (fileAndDocs.indexOf(term) >= 0) { - points += 1; - continue; - } - - continue decl_loop; + // substring, case insensitive match of full decl path + if (fullPathSearchTextLower.indexOf(term) >= 0) { + points += 2; + continue; + } + if (fileAndDocs.indexOf(term) >= 0) { + points += 1; + continue; } - matchedItems.push({ - decl: decl, - path: canonPath, - points: points, - }); + continue decl_loop; } - if (matchedItems.length !== 0) { - resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>'); + matchedItems.push({ + decl: decl, + path: canonPath, + points: points, + }); + } - matchedItems.sort(function(a, b) { - var cmp = operatorCompare(b.points, a.points); - if (cmp != 0) return cmp; - return operatorCompare(a.decl.name, b.decl.name); - }); + if (matchedItems.length !== 0) { + resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>'); - for (var i = 0; i < matchedItems.length; i += 1) { - var liDom = domListSearchResults.children[i]; - var aDom = liDom.children[0]; - var match = matchedItems[i]; - var lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; - aDom.textContent = lastPkgName + "." + match.path.declNames.join('.'); - aDom.setAttribute('href', navLink(match.path.pkgNames, match.path.declNames)); - } - renderSearchCursor(); + matchedItems.sort(function(a, b) { + var cmp = operatorCompare(b.points, a.points); + if (cmp != 0) return cmp; + return operatorCompare(a.decl.name, b.decl.name); + }); - domSectSearchResults.classList.remove("hidden"); - } else { - domSectSearchNoResults.classList.remove("hidden"); + for (var i = 0; i < matchedItems.length; i += 1) { + var liDom = domListSearchResults.children[i]; + var aDom = liDom.children[0]; + var match = matchedItems[i]; + var lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; + aDom.textContent = lastPkgName + "." + match.path.declNames.join('.'); + aDom.setAttribute('href', navLink(match.path.pkgNames, match.path.declNames)); } + renderSearchCursor(); + + domSectSearchResults.classList.remove("hidden"); + } else { + domSectSearchNoResults.classList.remove("hidden"); } +} function renderSearchCursor() { for (var i = 0; i < domListSearchResults.children.length; i += 1) {