mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-07 22:34:28 +00:00
autodoc: add frontend support for optionals & generic cleanup
This commit is contained in:
parent
fbf0d0bee9
commit
253e7e112e
1 changed files with 142 additions and 122 deletions
264
lib/docs/main.js
264
lib/docs/main.js
|
|
@ -149,8 +149,9 @@
|
||||||
while(i < 1000) {
|
while(i < 1000) {
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
||||||
if ("declRef" in value) {
|
if ("declPath" in value) {
|
||||||
value = zigAnalysis.decls[value.declRef].value;
|
console.assert(value.declPath.length == 1); // only support declRefs for now
|
||||||
|
value = zigAnalysis.decls[value.declPath[0]].value;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -169,8 +170,9 @@
|
||||||
return typeTypeId;
|
return typeTypeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("declRef" in decl.value) {
|
if ("declPath" in decl.value) {
|
||||||
decl = zigAnalysis.decls[decl.value.declRef];
|
console.assert(decl.value.declPath.length == 1); // only support declRefs for now
|
||||||
|
decl = zigAnalysis.decls[decl.value.declPath[0]];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -193,6 +195,7 @@
|
||||||
|
|
||||||
console.log("TODO: handle in `typeOfDecl` more cases: ", decl);
|
console.log("TODO: handle in `typeOfDecl` more cases: ", decl);
|
||||||
console.assert(false);
|
console.assert(false);
|
||||||
|
throw {};
|
||||||
}
|
}
|
||||||
console.assert(false);
|
console.assert(false);
|
||||||
}
|
}
|
||||||
|
|
@ -637,6 +640,25 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function typeIndexName(typeIndex, wantHtml, wantLink, fnDecl, linkFnNameDecl) {
|
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 typeObj = zigAnalysis.types[typeIndex];
|
||||||
var declNameOk = declCanRepresentTypeKind(typeObj.kind);
|
var declNameOk = declCanRepresentTypeKind(typeObj.kind);
|
||||||
if (wantLink) {
|
if (wantLink) {
|
||||||
|
|
@ -714,10 +736,11 @@
|
||||||
name += typeObj.len;
|
name += typeObj.len;
|
||||||
}
|
}
|
||||||
name += "]";
|
name += "]";
|
||||||
name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null);
|
name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null);
|
||||||
return name;
|
return name;
|
||||||
case typeKinds.Optional:
|
case typeKinds.Optional:
|
||||||
return "?" + typeIndexName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl);
|
|
||||||
|
return "?" + typeValueName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl);
|
||||||
case typeKinds.Pointer:
|
case typeKinds.Pointer:
|
||||||
var name = "";
|
var name = "";
|
||||||
switch (typeObj.len) {
|
switch (typeObj.len) {
|
||||||
|
|
@ -776,7 +799,7 @@
|
||||||
}
|
}
|
||||||
name += ") ";
|
name += ") ";
|
||||||
}
|
}
|
||||||
name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null);
|
name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null);
|
||||||
return name;
|
return name;
|
||||||
case typeKinds.Float:
|
case typeKinds.Float:
|
||||||
if (wantHtml) {
|
if (wantHtml) {
|
||||||
|
|
@ -949,13 +972,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var retValue = resolveValue(typeObj.ret);
|
payloadHtml += ') ';
|
||||||
console.assert("type" in retValue);
|
if (typeObj.ret != null) {
|
||||||
var retTypeIndex = retValue.type;
|
payloadHtml += typeValueName(typeObj.ret, wantHtml, wantSubLink, fnDecl);
|
||||||
|
|
||||||
payloadHtml += ') ';
|
|
||||||
if (retTypeIndex != null) {
|
|
||||||
payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl);
|
|
||||||
} else if (wantHtml) {
|
} else if (wantHtml) {
|
||||||
payloadHtml += '<span class="tok-kw">anytype</span>';
|
payloadHtml += '<span class="tok-kw">anytype</span>';
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1188,10 +1207,10 @@
|
||||||
var kind = value.kind;
|
var kind = value.kind;
|
||||||
if (kind === typeKinds.Fn) {
|
if (kind === typeKinds.Fn) {
|
||||||
//if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) {
|
//if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) {
|
||||||
// typesList.push(decl);
|
// typesList.push(decl);
|
||||||
//} else {
|
//} else {
|
||||||
fnsList.push(decl);
|
fnsList.push(decl);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
} else if (typeIsErrSet(declValue.type)) {
|
} else if (typeIsErrSet(declValue.type)) {
|
||||||
errSetsList.push(decl);
|
errSetsList.push(decl);
|
||||||
|
|
@ -1295,8 +1314,9 @@
|
||||||
if (typeof(field) === 'object') {
|
if (typeof(field) === 'object') {
|
||||||
if (field.failure === true) {
|
if (field.failure === true) {
|
||||||
html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>';
|
html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>';
|
||||||
} else if ("declRef" in field) {
|
} else if ("declPath" in field) {
|
||||||
var decl = zigAnalysis.decls[field.declRef];
|
console.assert(field.declPath.lenght == 1);
|
||||||
|
var decl = zigAnalysis.decls[field.declPath[0]];
|
||||||
var val = resolveValue(decl.value);
|
var val = resolveValue(decl.value);
|
||||||
console.assert("type" in val);
|
console.assert("type" in val);
|
||||||
var valType = zigAnalysis.types[val.type];
|
var valType = zigAnalysis.types[val.type];
|
||||||
|
|
@ -2002,118 +2022,118 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showHelpModal() {
|
function showHelpModal() {
|
||||||
domHelpModal.classList.remove("hidden");
|
domHelpModal.classList.remove("hidden");
|
||||||
domHelpModal.style.left = (window.innerWidth / 2 - domHelpModal.clientWidth / 2) + "px";
|
domHelpModal.style.left = (window.innerWidth / 2 - domHelpModal.clientWidth / 2) + "px";
|
||||||
domHelpModal.style.top = (window.innerHeight / 2 - domHelpModal.clientHeight / 2) + "px";
|
domHelpModal.style.top = (window.innerHeight / 2 - domHelpModal.clientHeight / 2) + "px";
|
||||||
domHelpModal.focus();
|
domHelpModal.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearAsyncSearch() {
|
function clearAsyncSearch() {
|
||||||
if (searchTimer != null) {
|
if (searchTimer != null) {
|
||||||
clearTimeout(searchTimer);
|
clearTimeout(searchTimer);
|
||||||
searchTimer = null;
|
searchTimer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
function startAsyncSearch() {
|
fullPathSearchTextLower = fullPathSearchTextLower.toLowerCase();
|
||||||
clearAsyncSearch();
|
fileAndDocs = fileAndDocs.toLowerCase();
|
||||||
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;
|
|
||||||
}
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
matchedItems.push({
|
|
||||||
decl: decl,
|
|
||||||
path: canonPath,
|
|
||||||
points: points,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matchedItems.length !== 0) {
|
var points = 0;
|
||||||
resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>');
|
for (var termIndex = 0; termIndex < terms.length; termIndex += 1) {
|
||||||
|
var term = terms[termIndex];
|
||||||
|
|
||||||
matchedItems.sort(function(a, b) {
|
// exact, case sensitive match of full decl path
|
||||||
var cmp = operatorCompare(b.points, a.points);
|
if (fullPathSearchText === term) {
|
||||||
if (cmp != 0) return cmp;
|
points += 4;
|
||||||
return operatorCompare(a.decl.name, b.decl.name);
|
continue;
|
||||||
});
|
}
|
||||||
|
// exact, case sensitive match of just decl name
|
||||||
for (var i = 0; i < matchedItems.length; i += 1) {
|
if (decl.name == term) {
|
||||||
var liDom = domListSearchResults.children[i];
|
points += 3;
|
||||||
var aDom = liDom.children[0];
|
continue;
|
||||||
var match = matchedItems[i];
|
}
|
||||||
var lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1];
|
// substring, case insensitive match of full decl path
|
||||||
aDom.textContent = lastPkgName + "." + match.path.declNames.join('.');
|
if (fullPathSearchTextLower.indexOf(term) >= 0) {
|
||||||
aDom.setAttribute('href', navLink(match.path.pkgNames, match.path.declNames));
|
points += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (fileAndDocs.indexOf(term) >= 0) {
|
||||||
|
points += 1;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
renderSearchCursor();
|
|
||||||
|
|
||||||
domSectSearchResults.classList.remove("hidden");
|
continue decl_loop;
|
||||||
} else {
|
|
||||||
domSectSearchNoResults.classList.remove("hidden");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
matchedItems.push({
|
||||||
|
decl: decl,
|
||||||
|
path: canonPath,
|
||||||
|
points: points,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (matchedItems.length !== 0) {
|
||||||
|
resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>');
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
|
||||||
|
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() {
|
function renderSearchCursor() {
|
||||||
for (var i = 0; i < domListSearchResults.children.length; i += 1) {
|
for (var i = 0; i < domListSearchResults.children.length; i += 1) {
|
||||||
var liDom = domListSearchResults.children[i];
|
var liDom = domListSearchResults.children[i];
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue