aboutsummaryrefslogtreecommitdiff
path: root/lib/docs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docs')
-rw-r--r--lib/docs/index.html188
-rw-r--r--lib/docs/main.js3344
2 files changed, 2396 insertions, 1136 deletions
diff --git a/lib/docs/index.html b/lib/docs/index.html
index 61e3bb4ed2..03579d975e 100644
--- a/lib/docs/index.html
+++ b/lib/docs/index.html
@@ -26,25 +26,23 @@
--search-sh-color: rgba(0, 0, 0, 0.18);
--help-sh-color: rgba(0, 0, 0, 0.75);
}
-
+
html, body { margin: 0; padding:0; height: 100%; }
a {
text-decoration: none;
}
-
+
a:hover {
text-decoration: underline;
}
-
+
.hidden {
display: none;
}
/* layout */
.canvas {
- display: flex;
- flex-direction: column;
width: 100vw;
height: 100vh;
overflow: hidden;
@@ -55,21 +53,12 @@
background-color: var(--bg-color);
}
- .banner {
- background-color: darkred;
- text-align: center;
- color: white;
- padding: 15px 5px;
- }
-
- .banner a {
- color: bisque;
- text-decoration: underline;
- }
-
.flex-main {
display: flex;
- overflow-y: hidden;
+ width: 100%;
+ height: 100%;
+ justify-content: center;
+
z-index: 100;
}
@@ -87,7 +76,7 @@
overflow-wrap: break-word;
flex-shrink: 0;
flex-grow: 0;
-
+
z-index: 300;
}
@@ -97,7 +86,7 @@
-webkit-overflow-scrolling: touch;
flex-grow: 1;
flex-shrink: 1;
-
+
z-index: 200;
}
@@ -106,44 +95,44 @@
max-width: 85vw;
flex-shrink: 1;
}
-
+
.help-modal {
z-index: 400;
}
-
+
/* sidebar */
.sidebar {
font-size: 1rem;
background-color: var(--bg-color);
box-shadow: 0 0 1rem var(--sidebar-sh-color);
}
-
+
.sidebar .logo {
padding: 1rem 0.35rem 0.35rem 0.35rem;
}
-
+
.sidebar .logo > svg {
display: block;
overflow: visible;
}
-
+
.sidebar h2 {
margin: 0.5rem;
padding: 0;
font-size: 1.2rem;
}
-
+
.sidebar h2 > span {
border-bottom: 0.125rem dotted var(--tx-color);
}
-
+
.sidebar .packages {
list-style-type: none;
margin: 0;
padding: 0;
background-color: var(--sidebar-pkg-bg-color);
}
-
+
.sidebar .packages > li > a {
display: block;
padding: 0.5rem 1rem;
@@ -151,17 +140,17 @@
background-color: var(--sidebar-pkglnk-bg-color);
text-decoration: none;
}
-
+
.sidebar .packages > li > a:hover {
color: var(--sidebar-pkglnk-tx-color-hover);
background-color: var(--sidebar-pkglnk-bg-color-hover);
}
-
+
.sidebar .packages > li > a.active {
color: var(--sidebar-pkglnk-tx-color-active);
background-color: var(--sidebar-pkglnk-bg-color-active);
}
-
+
.sidebar p.str {
margin: 0.5rem;
font-family: var(--mono);
@@ -194,28 +183,28 @@
border-radius: 0;
-webkit-appearance: none;
}
-
+
.docs .search:focus {
background-color: var(--search-bg-color-focus);
border-bottom-color: #ffbb4d;
box-shadow: 0 0.3em 1em 0.125em var(--search-sh-color);
}
-
+
.docs .search::placeholder {
font-size: 1rem;
font-family: var(--ui);
color: var(--tx-color);
opacity: 0.5;
}
-
+
.docs a {
color: var(--link-color);
}
-
+
.docs p {
margin: 0.8rem 0;
}
-
+
.docs pre {
font-family: var(--mono);
font-size:1em;
@@ -223,19 +212,19 @@
padding:1em;
overflow-x: auto;
}
-
+
.docs code {
font-family: var(--mono);
font-size: 1em;
}
-
+
.docs h1 {
font-size: 1.4em;
margin: 0.8em 0;
padding: 0;
border-bottom: 0.0625rem dashed;
}
-
+
.docs h2 {
font-size: 1.3em;
margin: 0.5em 0;
@@ -275,7 +264,7 @@
#tableFnErrors dt {
font-weight: bold;
}
-
+
.examples {
list-style-type: none;
margin: 0;
@@ -286,7 +275,7 @@
white-space: nowrap;
overflow-x: auto;
}
-
+
.docs td {
margin: 0;
padding: 0.5em;
@@ -294,7 +283,7 @@
text-overflow: ellipsis;
overflow-x: hidden;
}
-
+
/* help dialog */
.help-modal {
display: flex;
@@ -319,23 +308,23 @@
border: 0.125rem solid #000;
box-shadow: 0 0.5rem 2.5rem 0.3rem var(--help-sh-color);
}
-
+
.help-modal h1 {
margin: 0.75em 2.5em 1em 2.5em;
font-size: 1.5em;
text-align: center;
}
-
+
.help-modal dt, .help-modal dd {
display: inline;
margin: 0 0.2em;
}
-
+
.help-modal dl {
margin-left: 0.5em;
margin-right: 0.5em;
}
-
+
.help-modal kbd {
display: inline-block;
padding: 0.3em 0.2em;
@@ -352,7 +341,14 @@
box-shadow: inset 0 -0.0625em 0 #c6cbd1;
cursor: default;
}
-
+
+ #listFns dt {
+ font-family: var(--mono);
+ }
+ .argBreaker {
+ display: none;
+ }
+
/* tokens */
.tok-kw {
color: #333;
@@ -382,10 +378,10 @@
color: #458;
font-weight: bold;
}
-
+
/* dark mode */
@media (prefers-color-scheme: dark) {
-
+
:root {
--tx-color: #bbb;
--bg-color: #111;
@@ -403,7 +399,7 @@
--search-sh-color: rgba(255, 255, 255, 0.28);
--help-sh-color: rgba(142, 142, 142, 0.5);
}
-
+
.docs pre {
background-color:#2A2A2A;
}
@@ -451,7 +447,7 @@
.tok-type {
color: #68f;
}
-
+
}
@media only screen and (max-width: 750px) {
@@ -523,34 +519,87 @@
min-width: calc(100% - 2.8rem);
}
}
+ .banner {
+ background-color: orange;
+ text-align: center;
+ color: black;
+ padding: 5px 5px;
+ }
+ .banner a {
+ color: black;
+ text-decoration: underline;
+ }
</style>
</head>
<body class="canvas">
- <div class="banner">These docs are experimental. <a href="https://kristoff.it/blog/zig-new-relationship-llvm/">Progress depends on the self-hosted compiler</a>, <a href="https://github.com/ziglang/zig/wiki/How-to-read-the-standard-library-source-code">consider reading the stdlib source in the meantime</a>.</div>
+ <div class="banner">
+ This is a beta autodoc build; expect bugs and missing information.
+ <a href="https://github.com/ziglang/zig/wiki/How-to-contribute-to-Autodoc">Report an Issue</a>,
+ <a href="https://github.com/ziglang/zig/wiki/How-to-contribute-to-Autodoc">Contribute</a>,
+ <a href="https://github.com/ziglang/zig/wiki/How-to-read-the-standard-library-source-code">Learn more about stdlib source code</a>.
+ </div>
<div class="flex-main">
<div class="flex-filler"></div>
<div class="flex-left sidebar">
<nav>
<div class="logo">
- <svg version="1.1" viewBox="0 0 150 80" xmlns="http://www.w3.org/2000/svg">
- <g fill="#f7a41d">
- <path d="m0,-0.08899l0,80l19,0l6,-10l12,-10l-17,0l0,-40l15,0l0,-20l-35,0zm40,0l0,20l62,0l0,-20l-62,0zm91,0l-6,10l-12,10l17,0l0,40l-15,0l0,20l35,0l0,-80l-19,0zm-83,60l0,20l62,0l0,-20l-62,0z" shape-rendering="crispEdges"></path>
- <path d="m37,59.91101l-18,20l0,-15l18,-5z"></path>
- <path d="m113,19.91101l18,-20l0,15l-18,5z"></path>
- <path d="m96.98,0.54101l36.28,-10.4l-80.29,89.17l-36.28,10.4l80.29,-89.17z"></path>
- </g>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 140">
+ <g fill="#F7A41D">
+ <g>
+ <polygon points="46,22 28,44 19,30"/>
+ <polygon points="46,22 33,33 28,44 22,44 22,95 31,95 20,100 12,117 0,117 0,22" shape-rendering="crispEdges"/>
+ <polygon points="31,95 12,117 4,106"/>
+ </g>
+ <g>
+ <polygon points="56,22 62,36 37,44"/>
+ <polygon points="56,22 111,22 111,44 37,44 56,32" shape-rendering="crispEdges"/>
+ <polygon points="116,95 97,117 90,104"/>
+ <polygon points="116,95 100,104 97,117 42,117 42,95" shape-rendering="crispEdges"/>
+ <polygon points="150,0 52,117 3,140 101,22"/>
+ </g>
+ <g>
+ <polygon points="141,22 140,40 122,45"/>
+ <polygon points="153,22 153,117 106,117 120,105 125,95 131,95 131,45 122,45 132,36 141,22" shape-rendering="crispEdges"/>
+ <polygon points="125,95 130,110 106,117"/>
+ </g>
+ </g>
+ <style>
+ #text { fill: #121212 }
+ @media (prefers-color-scheme: dark) { #text { fill: #f2f2f2 } }
+ </style>
+ <g id="text">
+ <g>
+ <polygon points="260,22 260,37 229,40 177,40 177,22" shape-rendering="crispEdges"/>
+ <polygon points="260,37 207,99 207,103 176,103 229,40 229,37"/>
+ <polygon points="261,99 261,117 176,117 176,103 206,99" shape-rendering="crispEdges"/>
+ </g>
+ <rect x="272" y="22" shape-rendering="crispEdges" width="22" height="95"/>
+ <g>
+ <polygon points="394,67 394,106 376,106 376,81 360,70 346,67" shape-rendering="crispEdges"/>
+ <polygon points="360,68 376,81 346,67"/>
+ <path d="M394,106c-10.2,7.3-24,12-37.7,12c-29,0-51.1-20.8-51.1-48.3c0-27.3,22.5-48.1,52-48.1 c14.3,0,29.2,5.5,38.9,14l-13,15c-7.1-6.3-16.8-10-25.9-10c-17,0-30.2,12.9-30.2,29.5c0,16.8,13.3,29.6,30.3,29.6 c5.7,0,12.8-2.3,19-5.5L394,106z"/>
+ </g>
+ </g>
</svg>
+ </div>
+ <div id="sectMainPkg" class="hidden">
+ <h2><span>Main Package</span></h2>
+ <ul class="packages">
+ <li><a id="mainPkg" class="" href=""></a></li>
+ </ul>
</div>
<div id="sectPkgs" class="hidden">
- <h2><span>Packages</span></h2>
+ <h2><span>Dependencies</span></h2>
<ul id="listPkgs" class="packages"></ul>
</div>
<div id="sectInfo" class="hidden">
<h2><span>Zig Version</span></h2>
<p class="str" id="tdZigVer"></p>
- <h2><span>Target</span></h2>
- <p class="str" id="tdTarget"></p>
</div>
+ <div>
+ <input id="privDeclsBox" type="checkbox"/>
+ <label for="privDeclsBox">Internal Doc Mode</label>
+ </div>
</nav>
</div>
<div class="flex-right">
@@ -588,7 +637,6 @@
<div id="sectSearchResults" class="hidden">
<h2>Search Results</h2>
<ul id="listSearchResults"></ul>
- <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p>
</div>
<div id="sectSearchNoResults" class="hidden">
<h2>No Results Found</h2>
@@ -617,9 +665,7 @@
<div id="sectFns" class="hidden">
<h2>Functions</h2>
<div class="table-container">
- <table>
- <tbody id="listFns"></tbody>
- </table>
+ <dl id="listFns"></dl>
</div>
</div>
<div id="sectValues" class="hidden">
@@ -638,7 +684,15 @@
<h2>Examples</h2>
<ul id="listFnExamples" class="examples"></ul>
</div>
- </section>
+ <div id="sectTests" class="hidden">
+ <h2>Tests</h2>
+ <div class="table-container">
+ <table>
+ <tbody id="listTests"></tbody>
+ </table>
+ </div>
+ </div>
+ </section>
</div>
<div class="flex-filler"></div>
</div>
diff --git a/lib/docs/main.js b/lib/docs/main.js
index fa209e51cf..8be263e57f 100644
--- a/lib/docs/main.js
+++ b/lib/docs/main.js
@@ -1,73 +1,83 @@
+'use strict';
+
+var zigAnalysis;
+
(function() {
- var domStatus = document.getElementById("status");
- var domSectNav = document.getElementById("sectNav");
- var domListNav = document.getElementById("listNav");
- var domSectPkgs = document.getElementById("sectPkgs");
- var domListPkgs = document.getElementById("listPkgs");
- var domSectTypes = document.getElementById("sectTypes");
- var domListTypes = document.getElementById("listTypes");
- var domSectNamespaces = document.getElementById("sectNamespaces");
- var domListNamespaces = document.getElementById("listNamespaces");
- var domSectErrSets = document.getElementById("sectErrSets");
- var domListErrSets = document.getElementById("listErrSets");
- var domSectFns = document.getElementById("sectFns");
- var domListFns = document.getElementById("listFns");
- var domSectFields = document.getElementById("sectFields");
- var domListFields = document.getElementById("listFields");
- var domSectGlobalVars = document.getElementById("sectGlobalVars");
- var domListGlobalVars = document.getElementById("listGlobalVars");
- var domSectValues = document.getElementById("sectValues");
- var domListValues = document.getElementById("listValues");
- var domFnProto = document.getElementById("fnProto");
- var domFnProtoCode = document.getElementById("fnProtoCode");
- var domSectParams = document.getElementById("sectParams");
- var domListParams = document.getElementById("listParams");
- var domTldDocs = document.getElementById("tldDocs");
- var domSectFnErrors = document.getElementById("sectFnErrors");
- var domListFnErrors = document.getElementById("listFnErrors");
- var domTableFnErrors = document.getElementById("tableFnErrors");
- var domFnErrorsAnyError = document.getElementById("fnErrorsAnyError");
- var domFnExamples = document.getElementById("fnExamples");
- var domListFnExamples = document.getElementById("listFnExamples");
- var domFnNoExamples = document.getElementById("fnNoExamples");
- var domDeclNoRef = document.getElementById("declNoRef");
- var domSearch = document.getElementById("search");
- var domSectSearchResults = document.getElementById("sectSearchResults");
- var domListSearchResults = document.getElementById("listSearchResults");
- var domSectSearchNoResults = document.getElementById("sectSearchNoResults");
- var domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink");
- var domSectInfo = document.getElementById("sectInfo");
- var domTdTarget = document.getElementById("tdTarget");
- var domTdZigVer = document.getElementById("tdZigVer");
- var domHdrName = document.getElementById("hdrName");
- var domHelpModal = document.getElementById("helpDialog");
-
- var searchTimer = null;
- var searchTrimResults = true;
- var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
-
- var typeKinds = indexTypeKinds();
- var typeTypeId = findTypeTypeId();
- var pointerSizeEnum = { One: 0, Many: 1, Slice: 2, C: 3 };
- var tokenKinds = {
- Keyword: 'tok-kw',
- String: 'tok-str',
- Builtin: 'tok-builtin',
- Comment: 'tok-comment',
- Function: 'tok-fn',
- Null: 'tok-null',
- Number: 'tok-number',
- Type: 'tok-type',
- };
+ let domStatus = (document.getElementById("status"));
+ let domSectNav = (document.getElementById("sectNav"));
+ let domListNav = (document.getElementById("listNav"));
+ let domSectMainPkg = (document.getElementById("sectMainPkg"));
+ let domSectPkgs = (document.getElementById("sectPkgs"));
+ let domListPkgs = (document.getElementById("listPkgs"));
+ let domSectTypes = (document.getElementById("sectTypes"));
+ let domListTypes = (document.getElementById("listTypes"));
+ let domSectTests = (document.getElementById("sectTests"));
+ let domListTests = (document.getElementById("listTests"));
+ let domSectNamespaces = (document.getElementById("sectNamespaces"));
+ let domListNamespaces = (document.getElementById("listNamespaces"));
+ let domSectErrSets = (document.getElementById("sectErrSets"));
+ let domListErrSets = (document.getElementById("listErrSets"));
+ let domSectFns = (document.getElementById("sectFns"));
+ let domListFns = (document.getElementById("listFns"));
+ let domSectFields = (document.getElementById("sectFields"));
+ let domListFields = (document.getElementById("listFields"));
+ let domSectGlobalVars = (document.getElementById("sectGlobalVars"));
+ let domListGlobalVars = (document.getElementById("listGlobalVars"));
+ let domSectValues = (document.getElementById("sectValues"));
+ let domListValues = (document.getElementById("listValues"));
+ let domFnProto = (document.getElementById("fnProto"));
+ let domFnProtoCode = (document.getElementById("fnProtoCode"));
+ let domSectParams = (document.getElementById("sectParams"));
+ let domListParams = (document.getElementById("listParams"));
+ let domTldDocs = (document.getElementById("tldDocs"));
+ let domSectFnErrors = (document.getElementById("sectFnErrors"));
+ let domListFnErrors = (document.getElementById("listFnErrors"));
+ let domTableFnErrors =(document.getElementById("tableFnErrors"));
+ let domFnErrorsAnyError = (document.getElementById("fnErrorsAnyError"));
+ let domFnExamples = (document.getElementById("fnExamples"));
+ // let domListFnExamples = (document.getElementById("listFnExamples"));
+ let domFnNoExamples = (document.getElementById("fnNoExamples"));
+ let domDeclNoRef = (document.getElementById("declNoRef"));
+ let domSearch = (document.getElementById("search"));
+ let domSectSearchResults = (document.getElementById("sectSearchResults"));
+
+ let domListSearchResults = (document.getElementById("listSearchResults"));
+ let domSectSearchNoResults = (document.getElementById("sectSearchNoResults"));
+ let domSectInfo = (document.getElementById("sectInfo"));
+ // let domTdTarget = (document.getElementById("tdTarget"));
+ let domPrivDeclsBox = (document.getElementById("privDeclsBox"));
+ let domTdZigVer = (document.getElementById("tdZigVer"));
+ let domHdrName = (document.getElementById("hdrName"));
+ let domHelpModal = (document.getElementById("helpDialog"));
+
+
+ let searchTimer = null;
+
+
+ let escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
+
+ let typeKinds = (indexTypeKinds());
+ let typeTypeId = (findTypeTypeId());
+ let pointerSizeEnum = { One: 0, Many: 1, Slice: 2, C: 3 };
// for each package, is an array with packages to get to this one
- var canonPkgPaths = computeCanonicalPackagePaths();
+ let canonPkgPaths = computeCanonicalPackagePaths();
+
+
+
// for each decl, is an array with {declNames, pkgNames} to get to this one
- var canonDeclPaths = null; // lazy; use getCanonDeclPath
+
+ let canonDeclPaths = null; // lazy; use getCanonDeclPath
+
// for each type, is an array with {declNames, pkgNames} to get to this one
- var canonTypeDecls = null; // lazy; use getCanonTypeDecl
+
+ let canonTypeDecls = null; // lazy; use getCanonTypeDecl
- var curNav = {
+
+
+
+ let curNav = {
+ showPrivDecls: false,
// each element is a package name, e.g. @import("a") then within there @import("b")
// starting implicitly from root package
pkgNames: [],
@@ -82,27 +92,43 @@
// (a, b, c, d) comptime call; result is the value the docs refer to
callName: null,
};
- var curNavSearch = "";
- var curSearchIndex = -1;
- var imFeelingLucky = false;
- var rootIsStd = detectRootIsStd();
+ let curNavSearch = "";
+ let curSearchIndex = -1;
+ let imFeelingLucky = false;
+
+ let rootIsStd = detectRootIsStd();
// map of decl index to list of non-generic fn indexes
- var nodesToFnsMap = indexNodesToFns();
+ // let nodesToFnsMap = indexNodesToFns();
// map of decl index to list of comptime fn calls
- var nodesToCallsMap = indexNodesToCalls();
+ // let nodesToCallsMap = indexNodesToCalls();
domSearch.addEventListener('keydown', onSearchKeyDown, false);
- domSectSearchAllResultsLink.addEventListener('click', onClickSearchShowAllResults, false);
-
+ domPrivDeclsBox.addEventListener('change', function() {
+ if (this.checked != curNav.showPrivDecls) {
+ if (this.checked && location.hash.length > 1 && location.hash[1] != '*'){
+ location.hash = "#*" + location.hash.substring(1);
+ return;
+ }
+ if (!this.checked && location.hash.length > 1 && location.hash[1] == '*') {
+ location.hash = "#" + location.hash.substring(2);
+ return;
+ }
+ }
+ }, false);
+
+ if (location.hash == "") {
+ location.hash = "#root";
+ }
+
window.addEventListener('hashchange', onHashChange, false);
window.addEventListener('keydown', onWindowKeyDown, false);
onHashChange();
function renderTitle() {
- var list = curNav.pkgNames.concat(curNav.declNames);
- var suffix = " - Zig";
+ let list = curNav.pkgNames.concat(curNav.declNames);
+ let suffix = " - Zig";
if (list.length === 0) {
if (rootIsStd) {
document.title = "std" + suffix;
@@ -114,20 +140,221 @@
}
}
+
+ function isDecl(x) {
+ return "value" in x;
+ }
+
+
+ function isType(x) {
+ return "kind" in x && !("value" in x);
+ }
+
+
+ function isContainerType(x) {
+ return isType(x) && typeKindIsContainer((x).kind) ;
+ }
+
+
+ function typeShorthandName(expr) {
+ let resolvedExpr = resolveValue({expr: expr});
+ if (!("type" in resolvedExpr)) {
+ return null;
+ }
+ let type = (zigAnalysis.types[resolvedExpr.type]);
+
+ outer: for (let i = 0; i < 10000; i += 1) {
+ switch (type.kind) {
+ case typeKinds.Optional:
+ case typeKinds.Pointer:
+ let child = (type).child;
+ let resolvedChild = resolveValue(child);
+ if ("type" in resolvedChild) {
+ type = zigAnalysis.types[resolvedChild.type];
+ continue;
+ } else {
+ return null;
+ }
+ default:
+ break outer;
+ }
+
+ if (i == 9999) throw "Exhausted typeShorthandName quota";
+ }
+
+
+
+ let name = undefined;
+ if (type.kind === typeKinds.Struct) {
+ name = "struct";
+ } else if (type.kind === typeKinds.Enum) {
+ name = "enum";
+ } else if (type.kind === typeKinds.Union) {
+ name = "union";
+ } else {
+ console.log("TODO: unhalndled case in typeShortName");
+ return null;
+ }
+
+ return escapeHtml(name);
+ }
+
+
+ function typeKindIsContainer(typeKind) {
+ return typeKind === typeKinds.Struct ||
+ typeKind === typeKinds.Union ||
+ typeKind === typeKinds.Enum;
+ }
+
+
+ function declCanRepresentTypeKind(typeKind) {
+ return typeKind === typeKinds.ErrorSet || typeKindIsContainer(typeKind);
+ }
+
+ //
+ // function findCteInRefPath(path) {
+ // for (let i = path.length - 1; i >= 0; i -= 1) {
+ // const ref = path[i];
+ // if ("string" in ref) continue;
+ // if ("comptimeExpr" in ref) return ref;
+ // if ("refPath" in ref) return findCteInRefPath(ref.refPath);
+ // return null;
+ // }
+
+ // return null;
+ // }
+
+
+ function resolveValue(value) {
+ let i = 0;
+ while(i < 1000) {
+ i += 1;
+
+ if ("refPath" in value.expr) {
+ value = {expr: value.expr.refPath[value.expr.refPath.length -1]};
+ continue;
+ }
+
+ if ("declRef" in value.expr) {
+ value = zigAnalysis.decls[value.expr.declRef].value;
+ continue;
+ }
+
+ if ("as" in value.expr) {
+ value = {
+ typeRef: zigAnalysis.exprs[value.expr.as.typeRefArg],
+ expr: zigAnalysis.exprs[value.expr.as.exprArg],
+ };
+ continue;
+ }
+
+ return value;
+
+ }
+ console.assert(false);
+ return ({});
+ }
+
+
+// function typeOfDecl(decl){
+// return decl.value.typeRef;
+//
+// let i = 0;
+// while(i < 1000) {
+// i += 1;
+// console.assert(isDecl(decl));
+// if ("type" in decl.value) {
+// return ({ type: typeTypeId });
+// }
+//
+//// if ("string" in decl.value) {
+//// return ({ type: {
+//// kind: typeKinds.Pointer,
+//// size: pointerSizeEnum.One,
+//// child: });
+//// }
+//
+// if ("refPath" in decl.value) {
+// decl = ({
+// value: decl.value.refPath[decl.value.refPath.length -1]
+// });
+// continue;
+// }
+//
+// if ("declRef" in decl.value) {
+// decl = zigAnalysis.decls[decl.value.declRef];
+// continue;
+// }
+//
+// if ("int" in decl.value) {
+// return decl.value.int.typeRef;
+// }
+//
+// if ("float" in decl.value) {
+// return decl.value.float.typeRef;
+// }
+//
+// if ("array" in decl.value) {
+// return decl.value.array.typeRef;
+// }
+//
+// if ("struct" in decl.value) {
+// return decl.value.struct.typeRef;
+// }
+//
+// if ("comptimeExpr" in decl.value) {
+// const cte = zigAnalysis.comptimeExprs[decl.value.comptimeExpr];
+// return cte.typeRef;
+// }
+//
+// if ("call" in decl.value) {
+// const fn_call = zigAnalysis.calls[decl.value.call];
+// let fn_decl = undefined;
+// if ("declRef" in fn_call.func) {
+// fn_decl = zigAnalysis.decls[fn_call.func.declRef];
+// } else if ("refPath" in fn_call.func) {
+// console.assert("declRef" in fn_call.func.refPath[fn_call.func.refPath.length -1]);
+// fn_decl = zigAnalysis.decls[fn_call.func.refPath[fn_call.func.refPath.length -1].declRef];
+// } else throw {};
+//
+// const fn_decl_value = resolveValue(fn_decl.value);
+// console.assert("type" in fn_decl_value); //TODO handle comptimeExpr
+// const fn_type = (zigAnalysis.types[fn_decl_value.type]);
+// console.assert(fn_type.kind === typeKinds.Fn);
+// return fn_type.ret;
+// }
+//
+// if ("void" in decl.value) {
+// return ({ type: typeTypeId });
+// }
+//
+// if ("bool" in decl.value) {
+// return ({ type: typeKinds.Bool });
+// }
+//
+// console.log("TODO: handle in `typeOfDecl` more cases: ", decl);
+// console.assert(false);
+// throw {};
+// }
+// console.assert(false);
+// return ({});
+// }
+
function render() {
domStatus.classList.add("hidden");
domFnProto.classList.add("hidden");
domSectParams.classList.add("hidden");
domTldDocs.classList.add("hidden");
+ domSectMainPkg.classList.add("hidden");
domSectPkgs.classList.add("hidden");
domSectTypes.classList.add("hidden");
+ domSectTests.classList.add("hidden");
domSectNamespaces.classList.add("hidden");
domSectErrSets.classList.add("hidden");
domSectFns.classList.add("hidden");
domSectFields.classList.add("hidden");
domSectSearchResults.classList.add("hidden");
domSectSearchNoResults.classList.add("hidden");
- domSectSearchAllResultsLink.classList.add("hidden");
domSectInfo.classList.add("hidden");
domHdrName.classList.add("hidden");
domSectNav.classList.add("hidden");
@@ -144,15 +371,17 @@
renderInfo();
renderPkgList();
+ domPrivDeclsBox.checked = curNav.showPrivDecls;
+
if (curNavSearch !== "") {
return renderSearch();
}
- var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
- var pkg = rootPkg;
+ let rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
+ let pkg = rootPkg;
curNav.pkgObjs = [pkg];
- for (var i = 0; i < curNav.pkgNames.length; i += 1) {
- var childPkg = zigAnalysis.packages[pkg.table[curNav.pkgNames[i]]];
+ for (let i = 0; i < curNav.pkgNames.length; i += 1) {
+ let childPkg = zigAnalysis.packages[pkg.table[curNav.pkgNames[i]]];
if (childPkg == null) {
return render404();
}
@@ -160,52 +389,68 @@
curNav.pkgObjs.push(pkg);
}
- var decl = zigAnalysis.types[pkg.main];
- curNav.declObjs = [decl];
- for (var i = 0; i < curNav.declNames.length; i += 1) {
- var childDecl = findSubDecl(decl, curNav.declNames[i]);
+
+ let currentType = zigAnalysis.types[pkg.main];
+ curNav.declObjs = [currentType];
+ for (let i = 0; i < curNav.declNames.length; i += 1) {
+
+
+ let childDecl = findSubDecl((currentType), curNav.declNames[i]);
if (childDecl == null) {
return render404();
}
- var container = getDeclContainerType(childDecl);
- if (container == null) {
- if (i + 1 === curNav.declNames.length) {
- curNav.declObjs.push(childDecl);
- break;
- } else {
- return render404();
+
+ let childDeclValue = resolveValue((childDecl).value).expr;
+ if ("type" in childDeclValue) {
+
+ const t = zigAnalysis.types[childDeclValue.type];
+ if (t.kind != typeKinds.Fn) {
+ childDecl = t;
}
}
- decl = container;
- curNav.declObjs.push(decl);
+
+ currentType = (childDecl);
+ curNav.declObjs.push(currentType);
}
renderNav();
- var lastDecl = curNav.declObjs[curNav.declObjs.length - 1];
- if (lastDecl.pubDecls != null) {
- renderContainer(lastDecl);
- }
- if (lastDecl.kind == null) {
- return renderUnknownDecl(lastDecl);
- } else if (lastDecl.kind === 'var') {
- return renderVar(lastDecl);
- } else if (lastDecl.kind === 'const' && lastDecl.type != null) {
- var typeObj = zigAnalysis.types[lastDecl.type];
- if (typeObj.kind === typeKinds.Fn) {
- return renderFn(lastDecl);
- } else {
- return renderValue(lastDecl);
+ let last = curNav.declObjs[curNav.declObjs.length - 1];
+ let lastIsDecl = isDecl(last);
+ let lastIsType = isType(last);
+ let lastIsContainerType = isContainerType(last);
+
+ if (lastIsContainerType) {
+ return renderContainer((last));
+ }
+
+ if (!lastIsDecl && !lastIsType) {
+ return renderUnknownDecl((last));
+ }
+
+ if (lastIsType) {
+ return renderType((last));
+ }
+
+ if (lastIsDecl && last.kind === 'var') {
+ return renderVar((last));
+ }
+
+ if (lastIsDecl && last.kind === 'const') {
+ let typeObj = zigAnalysis.types[resolveValue((last).value).expr.type];
+ if (typeObj && typeObj.kind === typeKinds.Fn) {
+ return renderFn((last));
}
- } else {
- renderType(lastDecl);
+
+ return renderValue((last));
}
}
+
function renderUnknownDecl(decl) {
domDeclNoRef.classList.remove("hidden");
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
domTldDocs.innerHTML = markdown(docs);
} else {
@@ -214,85 +459,130 @@
domTldDocs.classList.remove("hidden");
}
+
function typeIsErrSet(typeIndex) {
- var typeObj = zigAnalysis.types[typeIndex];
+ let typeObj = zigAnalysis.types[typeIndex];
return typeObj.kind === typeKinds.ErrorSet;
}
+
function typeIsStructWithNoFields(typeIndex) {
- var typeObj = zigAnalysis.types[typeIndex];
+ let typeObj = zigAnalysis.types[typeIndex];
if (typeObj.kind !== typeKinds.Struct)
return false;
- return typeObj.fields == null || typeObj.fields.length === 0;
+ return (typeObj).fields.length == 0;
}
+
function typeIsGenericFn(typeIndex) {
- var typeObj = zigAnalysis.types[typeIndex];
+ let typeObj = zigAnalysis.types[typeIndex];
if (typeObj.kind !== typeKinds.Fn) {
return false;
}
- return typeObj.generic;
+ return (typeObj).generic_ret != null;
}
+
function renderFn(fnDecl) {
- domFnProtoCode.innerHTML = typeIndexName(fnDecl.type, true, true, fnDecl);
+ if ("refPath" in fnDecl.value.expr) {
+ let last = fnDecl.value.expr.refPath.length - 1;
+ let lastExpr = fnDecl.value.expr.refPath[last];
+ console.assert("declRef" in lastExpr);
+ fnDecl = zigAnalysis.decls[lastExpr.declRef];
+ }
- var docsSource = null;
- var srcNode = zigAnalysis.astNodes[fnDecl.src];
+ let value = resolveValue(fnDecl.value);
+ console.assert("type" in value.expr);
+ let typeObj = (zigAnalysis.types[value.expr.type]);
+
+ domFnProtoCode.innerHTML = exprName(value.expr, {
+ wantHtml: true,
+ wantLink: true,
+ fnDecl,
+ });
+
+ let docsSource = null;
+ let srcNode = zigAnalysis.astNodes[fnDecl.src];
if (srcNode.docs != null) {
docsSource = srcNode.docs;
}
- var typeObj = zigAnalysis.types[fnDecl.type];
renderFnParamDocs(fnDecl, typeObj);
- var errSetTypeIndex = null;
- if (typeObj.ret != null) {
- var retType = zigAnalysis.types[typeObj.ret];
+ let retExpr = resolveValue({expr:typeObj.ret}).expr;
+ if ("type" in retExpr) {
+ let retIndex = retExpr.type;
+ let errSetTypeIndex = (null);
+ let retType = zigAnalysis.types[retIndex];
if (retType.kind === typeKinds.ErrorSet) {
- errSetTypeIndex = typeObj.ret;
+ errSetTypeIndex = retIndex;
} else if (retType.kind === typeKinds.ErrorUnion) {
- errSetTypeIndex = retType.err;
+ errSetTypeIndex = (retType).err.type;
+ }
+ if (errSetTypeIndex != null) {
+ let errSetType = (zigAnalysis.types[errSetTypeIndex]);
+ renderErrorSet(errSetType);
}
}
- if (errSetTypeIndex != null) {
- var errSetType = zigAnalysis.types[errSetTypeIndex];
- renderErrorSet(errSetType);
- }
-
- var fnObj = zigAnalysis.fns[fnDecl.value];
- var protoSrcIndex = fnObj.src;
- if (typeIsGenericFn(fnDecl.type)) {
- var instantiations = nodesToFnsMap[protoSrcIndex];
- var calls = nodesToCallsMap[protoSrcIndex];
- if (instantiations == null && calls == null) {
- domFnNoExamples.classList.remove("hidden");
- } else if (calls != null) {
- if (fnObj.combined === undefined) fnObj.combined = allCompTimeFnCallsResult(calls);
- if (fnObj.combined != null) {
- renderContainer(fnObj.combined, calls.map(function (call) { return zigAnalysis.calls[call].result.value }));
- }
- var domListFnExamplesFragment = createDomListFragment(calls.length, '<li></li>');
+ let protoSrcIndex = fnDecl.src;
+ if (typeIsGenericFn(value.expr.type)) {
+ // does the generic_ret contain a container?
+ var resolvedGenericRet = resolveValue({expr: typeObj.generic_ret});
+
+ if ("call" in resolvedGenericRet.expr){
+ let call = zigAnalysis.calls[resolvedGenericRet.expr.call];
+ let resolvedFunc = resolveValue({expr: call.func});
+ if (!("type" in resolvedFunc.expr)) return;
+ let callee = zigAnalysis.types[resolvedFunc.expr.type];
+ if (!callee.generic_ret) return;
+ resolvedGenericRet = resolveValue({expr: callee.generic_ret});
+ }
- for (var callI = 0; callI < calls.length; callI += 1) {
- var liDom = domListFnExamplesFragment.children[callI];
- liDom.innerHTML = getCallHtml(fnDecl, calls[callI]);
- }
+ // TODO: see if unwrapping the `as` here is a good idea or not.
+ if ("as" in resolvedGenericRet.expr) {
+ resolvedGenericRet = {
+ expr: zigAnalysis.exprs[resolvedGenericRet.expr.as.exprArg]
+ };
+ }
- domListFnExamples.innerHTML = "";
- domListFnExamples.appendChild(domListFnExamplesFragment);
- domFnExamples.classList.remove("hidden");
- } else if (instantiations != null) {
- // TODO
+ if (!("type" in resolvedGenericRet.expr)) return;
+ const genericType = zigAnalysis.types[resolvedGenericRet.expr.type];
+ if (isContainerType(genericType)) {
+ renderContainer(genericType)
}
+
+
+
+
+
+ // old code
+ // let instantiations = nodesToFnsMap[protoSrcIndex];
+ // let calls = nodesToCallsMap[protoSrcIndex];
+ // if (instantiations == null && calls == null) {
+ // domFnNoExamples.classList.remove("hidden");
+ // } else if (calls != null) {
+ // // if (fnObj.combined === undefined) fnObj.combined = allCompTimeFnCallsResult(calls);
+ // if (fnObj.combined != null) renderContainer(fnObj.combined);
+
+ // resizeDomList(domListFnExamples, calls.length, '<li></li>');
+
+ // for (let callI = 0; callI < calls.length; callI += 1) {
+ // let liDom = domListFnExamples.children[callI];
+ // liDom.innerHTML = getCallHtml(fnDecl, calls[callI]);
+ // }
+
+ // domFnExamples.classList.remove("hidden");
+ // } else if (instantiations != null) {
+ // // TODO
+ // }
} else {
domFnExamples.classList.add("hidden");
domFnNoExamples.classList.add("hidden");
}
- var protoSrcNode = zigAnalysis.astNodes[protoSrcIndex];
+ let protoSrcNode = zigAnalysis.astNodes[protoSrcIndex];
if (docsSource == null && protoSrcNode != null && protoSrcNode.docs != null) {
docsSource = protoSrcNode.docs;
}
@@ -303,17 +593,17 @@
domFnProto.classList.remove("hidden");
}
+
function renderFnParamDocs(fnDecl, typeObj) {
- var docCount = 0;
+ let docCount = 0;
- var fnObj = zigAnalysis.fns[fnDecl.value];
- var fnNode = zigAnalysis.astNodes[fnObj.src];
- var fields = fnNode.fields;
- var isVarArgs = fnNode.varArgs;
+ let fnNode = zigAnalysis.astNodes[fnDecl.src];
+ let fields = (fnNode.fields);
+ let isVarArgs = fnNode.varArgs;
- for (var i = 0; i < fields.length; i += 1) {
- var field = fields[i];
- var fieldNode = zigAnalysis.astNodes[field];
+ for (let i = 0; i < fields.length; i += 1) {
+ let field = fields[i];
+ let fieldNode = zigAnalysis.astNodes[field];
if (fieldNode.docs != null) {
docCount += 1;
}
@@ -322,56 +612,55 @@
return;
}
- var domListParamsFragment = createDomListFragment(docCount, '<div></div>');
- var domIndex = 0;
+ resizeDomList(domListParams, docCount, '<div></div>');
+ let domIndex = 0;
- for (var i = 0; i < fields.length; i += 1) {
- var field = fields[i];
- var fieldNode = zigAnalysis.astNodes[field];
+ for (let i = 0; i < fields.length; i += 1) {
+ let field = fields[i];
+ let fieldNode = zigAnalysis.astNodes[field];
if (fieldNode.docs == null) {
continue;
}
- var divDom = domListParamsFragment.children[domIndex];
+ let divDom = domListParams.children[domIndex];
domIndex += 1;
- var argTypeIndex = typeObj.args[i];
- var html = '<pre>' + escapeHtml(fieldNode.name) + ": ";
- if (isVarArgs && i === typeObj.args.length - 1) {
+
+ let value = typeObj.params[i];
+ let html = '<pre>' + escapeHtml((fieldNode.name)) + ": ";
+ if (isVarArgs && i === typeObj.params.length - 1) {
html += '...';
- } else if (argTypeIndex != null) {
- html += typeIndexName(argTypeIndex, true, true);
} else {
- html += '<span class="tok-kw">var</span>';
+ let name = exprName(value, {wantHtml: false, wantLink: false});
+ html += '<span class="tok-kw">' + name + '</span>';
}
html += ',</pre>';
- var docs = fieldNode.docs;
+ let docs = fieldNode.docs;
if (docs != null) {
html += markdown(docs);
}
divDom.innerHTML = html;
}
-
- domListParams.innerHTML = "";
- domListParams.appendChild(domListParamsFragment);
domSectParams.classList.remove("hidden");
}
function renderNav() {
- var len = curNav.pkgNames.length + curNav.declNames.length;
- var domListNavFragment = createDomListFragment(len, '<li><a href="#"></a></li>');
- var list = [];
- var hrefPkgNames = [];
- var hrefDeclNames = [];
- for (var i = 0; i < curNav.pkgNames.length; i += 1) {
+ let len = curNav.pkgNames.length + curNav.declNames.length;
+ resizeDomList(domListNav, len, '<li><a href="#"></a></li>');
+ let list = [];
+ let hrefPkgNames = [];
+ let hrefDeclNames = ([]);
+ for (let i = 0; i < curNav.pkgNames.length; i += 1) {
hrefPkgNames.push(curNav.pkgNames[i]);
+ let name = curNav.pkgNames[i];
+ if (name == "root") name = zigAnalysis.rootPkgName;
list.push({
- name: curNav.pkgNames[i],
+ name: name,
link: navLink(hrefPkgNames, hrefDeclNames),
});
}
- for (var i = 0; i < curNav.declNames.length; i += 1) {
+ for (let i = 0; i < curNav.declNames.length; i += 1) {
hrefDeclNames.push(curNav.declNames[i]);
list.push({
name: curNav.declNames[i],
@@ -379,9 +668,9 @@
});
}
- for (var i = 0; i < list.length; i += 1) {
- var liDom = domListNavFragment.children[i];
- var aDom = liDom.children[0];
+ for (let i = 0; i < list.length; i += 1) {
+ let liDom = domListNav.children[i];
+ let aDom = liDom.children[0];
aDom.textContent = list[i].name;
aDom.setAttribute('href', list[i].link);
if (i + 1 == list.length) {
@@ -391,14 +680,12 @@
}
}
- domListNav.innerHTML = "";
- domListNav.appendChild(domListNavFragment);
domSectNav.classList.remove("hidden");
}
function renderInfo() {
domTdZigVer.textContent = zigAnalysis.params.zigVersion;
- domTdTarget.textContent = zigAnalysis.params.builds[0].target;
+ //domTdTarget.textContent = zigAnalysis.params.builds[0].target;
domSectInfo.classList.remove("hidden");
}
@@ -409,26 +696,39 @@
}
function renderPkgList() {
- var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
- var list = [];
- for (var key in rootPkg.table) {
- if (key === "root" && rootIsStd) continue;
- var pkgIndex = rootPkg.table[key];
+ let rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
+ let list = [];
+ for (let key in rootPkg.table) {
+ let pkgIndex = rootPkg.table[key];
if (zigAnalysis.packages[pkgIndex] == null) continue;
+ if (key == zigAnalysis.params.rootName) continue;
list.push({
name: key,
pkg: pkgIndex,
});
}
+
+ {
+ let aDom = domSectMainPkg.children[1].children[0].children[0];
+ aDom.textContent = zigAnalysis.rootPkgName;
+ aDom.setAttribute('href', navLinkPkg(zigAnalysis.rootPkg));
+ if (zigAnalysis.params.rootName === curNav.pkgNames[0]) {
+ aDom.classList.add("active");
+ } else {
+ aDom.classList.remove("active");
+ }
+ domSectMainPkg.classList.remove("hidden");
+ }
+
list.sort(function(a, b) {
return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
});
if (list.length !== 0) {
- var domListPkgsFragment = createDomListFragment(list.length, '<li><a href="#"></a></li>');
- for (var i = 0; i < list.length; i += 1) {
- var liDom = domListPkgsFragment.children[i];
- var aDom = liDom.children[0];
+ resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>');
+ for (let i = 0; i < list.length; i += 1) {
+ let liDom = domListPkgs.children[i];
+ let aDom = liDom.children[0];
aDom.textContent = list[i].name;
aDom.setAttribute('href', navLinkPkg(list[i].pkg));
if (list[i].name === curNav.pkgNames[0]) {
@@ -438,488 +738,1338 @@
}
}
- domListPkgs.innerHTML = "";
- domListPkgs.appendChild(domListPkgsFragment);
domSectPkgs.classList.remove("hidden");
}
}
+
+
function navLink(pkgNames, declNames, callName) {
+ let base = '#';
+ if (curNav.showPrivDecls) {
+ base += "*";
+ }
+
if (pkgNames.length === 0 && declNames.length === 0) {
- return '#';
+ return base;
} else if (declNames.length === 0 && callName == null) {
- return '#' + pkgNames.join('.');
+ return base + pkgNames.join('.');
} else if (callName == null) {
- return '#' + pkgNames.join('.') + ';' + declNames.join('.');
+ return base + pkgNames.join('.') + ';' + declNames.join('.');
} else {
- return '#' + pkgNames.join('.') + ';' + declNames.join('.') + ';' + callName;
+ return base + pkgNames.join('.') + ';' + declNames.join('.') + ';' + callName;
}
}
+
function navLinkPkg(pkgIndex) {
return navLink(canonPkgPaths[pkgIndex], []);
}
+
function navLinkDecl(childName) {
return navLink(curNav.pkgNames, curNav.declNames.concat([childName]));
}
- function navLinkCall(callObj) {
- var declNamesCopy = curNav.declNames.concat([]);
- var callName = declNamesCopy.pop();
-
- callName += '(';
- for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {
- if (arg_i !== 0) callName += ',';
- var argObj = callObj.args[arg_i];
- callName += getValueText(argObj.type, argObj.value, false, false);
- }
- callName += ')';
-
- declNamesCopy.push(callName);
- return navLink(curNav.pkgNames, declNamesCopy);
- }
-
- function createDomListFragment(desiredLen, templateHtml) {
- var domTemplate = document.createElement("template");
- domTemplate.innerHTML = templateHtml.repeat(desiredLen);
- return domTemplate.content;
- }
-
- function typeIndexName(typeIndex, wantHtml, wantLink, fnDecl, linkFnNameDecl, thisTypes) {
- if(thisTypes && thisTypes.includes(typeIndex)){
- return token('@This', tokenKinds.Builtin, wantHtml) + '()';
- }
- var typeObj = zigAnalysis.types[typeIndex];
- var declNameOk = declCanRepresentTypeKind(typeObj.kind);
- if (wantLink) {
- var declIndex = getCanonTypeDecl(typeIndex);
- var declPath = getCanonDeclPath(declIndex);
- if (declPath == null) {
- return typeName(typeObj, wantHtml, wantLink, fnDecl, linkFnNameDecl, thisTypes);
- }
- var name = (wantLink && declCanRepresentTypeKind(typeObj.kind)) ?
- declPath.declNames[declPath.declNames.length - 1] :
- typeName(typeObj, wantHtml, false, fnDecl, linkFnNameDecl, thisTypes);
- if (wantLink && wantHtml) {
- return '<a href="' + navLink(declPath.pkgNames, declPath.declNames) + '">' + name + '</a>';
+ //
+ // function navLinkCall(callObj) {
+ // let declNamesCopy = curNav.declNames.concat([]);
+ // let callName = (declNamesCopy.pop());
+
+ // callName += '(';
+ // for (let arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {
+ // if (arg_i !== 0) callName += ',';
+ // let argObj = callObj.args[arg_i];
+ // callName += getValueText(argObj, argObj, false, false);
+ // }
+ // callName += ')';
+
+ // declNamesCopy.push(callName);
+ // return navLink(curNav.pkgNames, declNamesCopy);
+ // }
+
+
+ function resizeDomListDl(dlDom, desiredLen) {
+ // add the missing dom entries
+ for (let i = dlDom.childElementCount / 2; i < desiredLen; i += 1) {
+ dlDom.insertAdjacentHTML('beforeend', '<dt></dt><dd></dd>');
+ }
+ // remove extra dom entries
+ while (desiredLen < dlDom.childElementCount / 2) {
+ dlDom.removeChild(dlDom.lastChild);
+ dlDom.removeChild(dlDom.lastChild);
+ }
+ }
+
+
+ function resizeDomList(listDom, desiredLen, templateHtml) {
+ // add the missing dom entries
+ for (let i = listDom.childElementCount; i < desiredLen; i += 1) {
+ listDom.insertAdjacentHTML('beforeend', templateHtml);
+ }
+ // remove extra dom entries
+ while (desiredLen < listDom.childElementCount) {
+ listDom.removeChild(listDom.lastChild);
+ }
+ }
+
+ function walkResultTypeRef(wr) {
+ if (wr.typeRef) return wr.typeRef;
+ let resolved = resolveValue(wr);
+ if (wr === resolved) {
+ return {type: 0};
+ }
+ return walkResultTypeRef(resolved);
+ }
+
+ function exprName(expr, opts) {
+ switch (Object.keys(expr)[0]) {
+ default: throw "oh no";
+ case "&": {
+ return "&" + exprName(zigAnalysis.exprs[expr["&"]]);
+ }
+ case "compileError": {
+ let compileError = expr.compileError;
+ return compileError;
+ }
+ case "enumLiteral": {
+ let literal = expr.enumLiteral;
+ return "." + literal;
+ }
+ case "void": {
+ return "void";
+ }
+ case "slice":{
+ let payloadHtml = "";
+ const lhsExpr = zigAnalysis.exprs[expr.slice.lhs];
+ const startExpr = zigAnalysis.exprs[expr.slice.start];
+ let decl = exprName(lhsExpr);
+ let start = exprName(startExpr);
+ let end = "";
+ let sentinel = "";
+ if (expr.slice['end']) {
+ const endExpr = zigAnalysis.exprs[expr.slice.end];
+ let end_ = exprName(endExpr);
+ end += end_;
+ }
+ if (expr.slice['sentinel']) {
+ const sentinelExpr = zigAnalysis.exprs[expr.slice.sentinel];
+ let sentinel_ = exprName(sentinelExpr);
+ sentinel += " :" + sentinel_;
+ }
+ payloadHtml += decl + "["+ start + ".." + end + sentinel + "]";
+ return payloadHtml;
+ }
+ case "sliceIndex": {
+ const sliceIndex = zigAnalysis.exprs[expr.sliceIndex];
+ return exprName(sliceIndex, opts);
+ }
+ case "cmpxchg":{
+ const typeIndex = zigAnalysis.exprs[expr.cmpxchg.type];
+ const ptrIndex = zigAnalysis.exprs[expr.cmpxchg.ptr];
+ const expectedValueIndex = zigAnalysis.exprs[expr.cmpxchg.expected_value];
+ const newValueIndex = zigAnalysis.exprs[expr.cmpxchg.new_value];
+ const successOrderIndex = zigAnalysis.exprs[expr.cmpxchg.success_order];
+ const failureOrderIndex = zigAnalysis.exprs[expr.cmpxchg.failure_order];
+
+ const type = exprName(typeIndex, opts);
+ const ptr = exprName(ptrIndex, opts);
+ const expectedValue = exprName(expectedValueIndex, opts);
+ const newValue = exprName(newValueIndex, opts);
+ const successOrder = exprName(successOrderIndex, opts);
+ const failureOrder = exprName(failureOrderIndex, opts);
+
+ let fnName = "@";
+
+ switch (expr.cmpxchg.name) {
+ case "cmpxchg_strong": {
+ fnName += "cmpxchgStrong"
+ break;
+ }
+ case "cmpxchg_weak": {
+ fnName += "cmpxchgWeak"
+ break;
+ }
+ default: {
+ console.log("There's only cmpxchg_strong and cmpxchg_weak");
+ }
+ }
+
+ return fnName + "(" + type + ", " + ptr + ", " + expectedValue + ", "+ newValue + ", "+"." +successOrder + ", "+ "." +failureOrder + ")";
+ }
+ case "cmpxchgIndex": {
+ const cmpxchgIndex = zigAnalysis.exprs[expr.cmpxchgIndex];
+ return exprName(cmpxchgIndex, opts);
+ }
+ case "switchOp":{
+ let condExpr = zigAnalysis.exprs[expr.switchOp.cond_index];
+ let ast = zigAnalysis.astNodes[expr.switchOp.ast];
+ let file_name = expr.switchOp.file_name;
+ let outer_decl_index = expr.switchOp.outer_decl;
+ let outer_decl = zigAnalysis.types[outer_decl_index];
+ let line = 0;
+ // console.log(expr.switchOp)
+ // console.log(outer_decl)
+ while (outer_decl_index !== 0 && outer_decl.line_number > 0) {
+ line += outer_decl.line_number;
+ outer_decl_index = outer_decl.outer_decl;
+ outer_decl = zigAnalysis.types[outer_decl_index];
+ // console.log(outer_decl)
+ }
+ line += ast.line + 1;
+ let payloadHtml = "";
+ let cond = exprName(condExpr, opts);
+
+ payloadHtml += "</br>" + "node_name: " + ast.name + "</br>" + "file: " + file_name + "</br>" + "line: " + line + "</br>";
+ payloadHtml += "switch(" + cond + ") {" + "<a href=\"https://github.com/ziglang/zig/tree/master/lib/std/" + file_name + "#L" + line + "\">" +"..." + "</a>}";
+ return payloadHtml;
+ }
+ case "switchIndex": {
+ const switchIndex = zigAnalysis.exprs[expr.switchIndex];
+ return exprName(switchIndex, opts);
+ }
+ case "refPath" : {
+ const declRef = expr.refPath[0].declRef;
+ let name = zigAnalysis.decls[declRef].name;
+ for (let i = 1; i < expr.refPath.length; i++) {
+ let component = undefined;
+ if ("string" in expr.refPath[i]) {
+ component = expr.refPath[i].string;
+ } else {
+ component = exprName(expr.refPath[i]);
+ }
+ name += "." + component;
+ }
+ return name;
+ }
+ case "fieldRef" : {
+ const enumObj = exprName({"type":expr.fieldRef.type} ,opts);
+ const field = zigAnalysis.astNodes[enumObj.ast].fields[expr.fieldRef.index];
+ const name = zigAnalysis.astNodes[field].name;
+ return name
+ }
+ case "enumToInt" : {
+ const enumToInt = zigAnalysis.exprs[expr.enumToInt];
+ return "@enumToInt(" + exprName(enumToInt, opts) + ")";
+ }
+ case "bitSizeOf" : {
+ const bitSizeOf = zigAnalysis.exprs[expr.bitSizeOf];
+ return "@bitSizeOf(" + exprName(bitSizeOf, opts) + ")";
+ }
+ case "sizeOf" : {
+ const sizeOf = zigAnalysis.exprs[expr.sizeOf];
+ return "@sizeOf(" + exprName(sizeOf, opts) + ")";
+ }
+ case "builtinIndex" : {
+ const builtinIndex = zigAnalysis.exprs[expr.builtinIndex];
+ return exprName(builtinIndex, opts);
+ }
+ case "builtin": {
+ const param_expr = zigAnalysis.exprs[expr.builtin.param];
+ let param = exprName(param_expr, opts);
+
+
+ let payloadHtml = "@";
+ switch (expr.builtin.name) {
+ case "align_of": {
+ payloadHtml += "alignOf";
+ break;
+ }
+ case "bool_to_int": {
+ payloadHtml += "boolToInt";
+ break;
+ }
+ case "embed_file": {
+ payloadHtml += "embedFile";
+ break;
+ }
+ case "error_name": {
+ payloadHtml += "errorName";
+ break;
+ }
+ case "panic": {
+ payloadHtml += "panic";
+ break;
+ }
+ case "set_cold": {
+ payloadHtml += "setCold";
+ break;
+ }
+ case "set_runtime_safety": {
+ payloadHtml += "setRuntimeSafety";
+ break;
+ }
+ case "sqrt": {
+ payloadHtml += "sqrt";
+ break;
+ }
+ case "sin": {
+ payloadHtml += "sin";
+ break;
+ }
+ case "cos": {
+ payloadHtml += "cos";
+ break;
+ }
+ case "tan": {
+ payloadHtml += "tan";
+ break;
+ }
+ case "exp": {
+ payloadHtml += "exp";
+ break;
+ }
+ case "exp2": {
+ payloadHtml += "exp2";
+ break;
+ }
+ case "log": {
+ payloadHtml += "log";
+ break;
+ }
+ case "log2": {
+ payloadHtml += "log2";
+ break;
+ }
+ case "log10": {
+ payloadHtml += "log10";
+ break;
+ }
+ case "fabs": {
+ payloadHtml += "fabs";
+ break;
+ }
+ case "floor": {
+ payloadHtml += "floor";
+ break;
+ }
+ case "ceil": {
+ payloadHtml += "ceil";
+ break;
+ }
+ case "trunc": {
+ payloadHtml += "trunc";
+ break;
+ }
+ case "round": {
+ payloadHtml += "round";
+ break;
+ }
+ case "tag_name": {
+ payloadHtml += "tagName";
+ break;
+ }
+ case "reify": {
+ payloadHtml += "Type";
+ break;
+ }
+ case "type_name": {
+ payloadHtml += "typeName";
+ break;
+ }
+ case "frame_type": {
+ payloadHtml += "Frame";
+ break;
+ }
+ case "frame_size": {
+ payloadHtml += "frameSize";
+ break;
+ }
+ case "ptr_to_int": {
+ payloadHtml += "ptrToInt";
+ break;
+ }
+ case "error_to_int": {
+ payloadHtml += "errorToInt";
+ break;
+ }
+ case "int_to_error": {
+ payloadHtml += "intToError";
+ break;
+ }
+ case "maximum": {
+ payloadHtml += "maximum";
+ break;
+ }
+ case "minimum": {
+ payloadHtml += "minimum";
+ break;
+ }
+ case "bit_not": {
+ return "~" + param;
+ }
+ case "clz": {
+ return "@clz(T" + ", " + param + ")";
+ }
+ case "ctz": {
+ return "@ctz(T" + ", " + param + ")";
+ }
+ case "pop_count": {
+ return "@popCount(T" + ", " + param + ")";
+ }
+ case "byte_swap": {
+ return "@byteSwap(T" + ", " + param + ")";
+ }
+ case "bit_reverse": {
+ return "@bitReverse(T" + ", " + param + ")";
+ }
+ default: console.log("builtin function not handled yet or doesn't exist!");
+ };
+ return payloadHtml + "(" + param + ")";
+
+ }
+ case "builtinBinIndex" : {
+ const builtinBinIndex = zigAnalysis.exprs[expr.builtinBinIndex];
+ return exprName(builtinBinIndex, opts);
+ }
+ case "builtinBin": {
+ const lhsOp = zigAnalysis.exprs[expr.builtinBin.lhs];
+ const rhsOp = zigAnalysis.exprs[expr.builtinBin.rhs];
+ let lhs = exprName(lhsOp, opts);
+ let rhs = exprName(rhsOp, opts);
+
+ let payloadHtml = "@";
+ switch (expr.builtinBin.name) {
+ case "float_to_int": {
+ payloadHtml += "floatToInt";
+ break;
+ }
+ case "int_to_float": {
+ payloadHtml += "intToFloat";
+ break;
+ }
+ case "int_to_ptr": {
+ payloadHtml += "intToPtr";
+ break;
+ }
+ case "int_to_enum": {
+ payloadHtml += "intToEnum";
+ break;
+ }
+ case "float_cast": {
+ payloadHtml += "floatCast";
+ break;
+ }
+ case "int_cast": {
+ payloadHtml += "intCast";
+ break;
+ }
+ case "ptr_cast": {
+ payloadHtml += "ptrCast";
+ break;
+ }
+ case "truncate": {
+ payloadHtml += "truncate";
+ break;
+ }
+ case "align_cast": {
+ payloadHtml += "alignCast";
+ break;
+ }
+ case "has_decl": {
+ payloadHtml += "hasDecl";
+ break;
+ }
+ case "has_field": {
+ payloadHtml += "hasField";
+ break;
+ }
+ case "bit_reverse": {
+ payloadHtml += "bitReverse";
+ break;
+ }
+ case "div_exact": {
+ payloadHtml += "divExact";
+ break;
+ }
+ case "div_floor": {
+ payloadHtml += "divFloor";
+ break;
+ }
+ case "div_trunc": {
+ payloadHtml += "divTrunc";
+ break;
+ }
+ case "mod": {
+ payloadHtml += "mod";
+ break;
+ }
+ case "rem": {
+ payloadHtml += "rem";
+ break;
+ }
+ case "mod_rem": {
+ payloadHtml += "rem";
+ break;
+ }
+ case "shl_exact": {
+ payloadHtml += "shlExact";
+ break;
+ }
+ case "shr_exact": {
+ payloadHtml += "shrExact";
+ break;
+ }
+ case "bitcast" : {
+ payloadHtml += "bitCast";
+ break;
+ }
+ case "align_cast" : {
+ payloadHtml += "alignCast";
+ break;
+ }
+ case "vector_type" : {
+ payloadHtml += "Vector";
+ break;
+ }
+ case "reduce": {
+ payloadHtml += "reduce";
+ break;
+ }
+ case "splat": {
+ payloadHtml += "splat";
+ break;
+ }
+ case "offset_of": {
+ payloadHtml += "offsetOf";
+ break;
+ }
+ case "bit_offset_of": {
+ payloadHtml += "bitOffsetOf";
+ break;
+ }
+ default: console.log("builtin function not handled yet or doesn't exist!");
+ };
+ return payloadHtml + "(" + lhs + ", " + rhs + ")";
+
+ }
+ case "binOpIndex" : {
+ const binOpIndex = zigAnalysis.exprs[expr.binOpIndex];
+ return exprName(binOpIndex, opts);
+ }
+ case "binOp": {
+ const lhsOp = zigAnalysis.exprs[expr.binOp.lhs];
+ const rhsOp = zigAnalysis.exprs[expr.binOp.rhs];
+ let lhs = exprName(lhsOp, opts);
+ let rhs = exprName(rhsOp, opts);
+
+ let print_lhs = "";
+ let print_rhs = "";
+
+ if (lhsOp['binOpIndex']) {
+ print_lhs = "(" + lhs + ")";
} else {
- return name;
+ print_lhs = lhs;
+ }
+ if (rhsOp['binOpIndex']) {
+ print_rhs = "(" + rhs + ")";
+ } else {
+ print_rhs = rhs;
}
- } else {
- return typeName(typeObj, wantHtml, false, fnDecl, linkFnNameDecl, thisTypes);
- }
- }
-
- function shouldSkipParamName(typeIndex, paramName) {
- var typeObj = zigAnalysis.types[typeIndex];
- if (typeObj.kind === typeKinds.Pointer && getPtrSize(typeObj) === pointerSizeEnum.One) {
- typeIndex = typeObj.elem;
- }
- return typeIndexName(typeIndex, false, true).toLowerCase() === paramName;
- }
-
- function getPtrSize(typeObj) {
- return (typeObj.len == null) ? pointerSizeEnum.One : typeObj.len;
- }
-
- function getCallHtml(fnDecl, callIndex) {
- var callObj = zigAnalysis.calls[callIndex];
-
- // TODO make these links work
- //var html = '<a href="' + navLinkCall(callObj) + '">' + escapeHtml(fnDecl.name) + '</a>(';
- var html = escapeHtml(fnDecl.name) + '(';
- for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {
- if (arg_i !== 0) html += ', ';
- var argObj = callObj.args[arg_i];
- html += getValueText(argObj.type, argObj.value, true, true);
- }
- html += ')';
- return html;
- }
- function getValueText(typeIndex, value, wantHtml, wantLink) {
- var typeObj = zigAnalysis.types[typeIndex];
- switch (typeObj.kind) {
- case typeKinds.Type:
- return typeIndexName(value, wantHtml, wantLink);
- case typeKinds.Fn:
- var fnObj = zigAnalysis.fns[value];
- var declPath = fnObj.decl && getCanonDeclPath(fnObj.decl);
- var fnName = declPath ? declPath.declNames.join('.') : '(unknown)';
-
- if (!wantHtml) {
- return fnName;
- }
+ let operator = "";
- var str = '<span class="tok-fn">';
- if (wantLink && declPath != null) {
- str += '<a href="' + navLink(declPath.pkgNames, declPath.declNames) + '">';
- str += escapeHtml(fnName);
- str += '</a>';
- } else {
- str += escapeHtml(fnName);
- }
- str += '</span>';
- return str;
- case typeKinds.Int:
- return token(value, tokenKinds.Number, wantHtml);
- case typeKinds.Optional:
- if(value === 'null'){
- return token(value, tokenKinds.Null, wantHtml);
- } else {
- console.trace("TODO non-null optional value printing");
- return "TODO";
- }
- case typeKinds.Bool:
- return token(value, tokenKinds.Null, wantHtml);
- default:
- console.trace("TODO implement getValueText for this type:", zigAnalysis.typeKinds[typeObj.kind]);
- return "TODO";
- }
- }
+ switch (expr.binOp.name) {
+ case "add": {
+ operator += "+";
+ break;
+ }
+ case "addwrap": {
+ operator += "+%";
+ break;
+ }
+ case "add_sat": {
+ operator += "+|";
+ break;
+ }
+ case "sub": {
+ operator += "-";
+ break;
+ }
+ case "subwrap": {
+ operator += "-%";
+ break;
+ }
+ case "sub_sat": {
+ operator += "-|";
+ break;
+ }
+ case "mul": {
+ operator += "*";
+ break;
+ }
+ case "mulwrap": {
+ operator += "*%";
+ break;
+ }
+ case "mul_sat": {
+ operator += "*|";
+ break;
+ }
+ case "div": {
+ operator += "/";
+ break;
+ }
+ case "shl": {
+ operator += "<<";
+ break;
+ }
+ case "shl_sat": {
+ operator += "<<|";
+ break;
+ }
+ case "shr": {
+ operator += ">>";
+ break;
+ }
+ case "bit_or" : {
+ operator += "|";
+ break;
+ }
+ case "bit_and" : {
+ operator += "&";
+ break;
+ }
+ case "array_cat" : {
+ operator += "++";
+ break;
+ }
+ case "array_mul" : {
+ operator += "**";
+ break;
+ }
+ default: console.log("operator not handled yet or doesn't exist!");
+ };
- function typeName(typeObj, wantHtml, wantSubLink, fnDecl, linkFnNameDecl, thisTypes) {
- switch (typeObj.kind) {
- case typeKinds.Array:
- var name = "[";
- name += token(typeObj.len, tokenKinds.Number, wantHtml);
- name += "]";
- name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null, null, thisTypes);
- return name;
- case typeKinds.Vector:
- var name = "Vector(";
- name += token(typeObj.len, tokenKinds.Number, wantHtml);
- name += ", ";
- name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null, null, thisTypes);
- name += ")";
- return name;
- case typeKinds.Optional:
- return "?" + typeIndexName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl, thisTypes);
- case typeKinds.Pointer:
- var name = "";
- switch (typeObj.len) {
- case pointerSizeEnum.One:
- default:
- name += "*";
- break;
- case pointerSizeEnum.Many:
- name += "[*]";
- break;
- case pointerSizeEnum.Slice:
- name += "[]";
- break;
- case pointerSizeEnum.C:
- name += "[*c]";
- break;
- }
- if (typeObj['const']) {
- name += token('const', tokenKinds.Keyword, wantHtml) + ' ';
- }
- if (typeObj['volatile']) {
- name += token('volatile', tokenKinds.Keyword, wantHtml) + ' ';
- }
- if (typeObj.align != null) {
- name += token('align', tokenKinds.Keyword, wantHtml) + '(';
- name += token(typeObj.align, tokenKinds.Number, wantHtml);
-
- if (typeObj.hostIntBytes != null) {
- name += ":";
- name += token(typeObj.bitOffsetInHost, tokenKinds.Number, wantHtml);
- name += ":";
- name += token(typeObj.hostIntBytes, tokenKinds.Number, wantHtml);
- }
- name += ") ";
+ return print_lhs + " " + operator + " " + print_rhs;
+
+ }
+ case "errorSets": {
+ const errUnionObj = zigAnalysis.types[expr.errorSets];
+ let lhs = exprName(errUnionObj.lhs, opts);
+ let rhs = exprName(errUnionObj.rhs, opts);
+ return lhs + " || " + rhs;
+
+ }
+ case "errorUnion": {
+ const errUnionObj = zigAnalysis.types[expr.errorUnion];
+ let lhs = exprName(errUnionObj.lhs, opts);
+ let rhs = exprName(errUnionObj.rhs, opts);
+ return lhs + "!" + rhs;
+
+ }
+ case "struct": {
+ const struct_name = zigAnalysis.decls[expr.struct[0].val.typeRef.refPath[0].declRef].name;
+ let struct_body = "";
+ struct_body += struct_name + "{ ";
+ for (let i = 0; i < expr.struct.length; i++) {
+ const val = expr.struct[i].name
+ const exprArg = zigAnalysis.exprs[expr.struct[i].val.expr.as.exprArg];
+ let value_field = exprArg[Object.keys(exprArg)[0]];
+ if (value_field instanceof Object) {
+ value_field = zigAnalysis.decls[value_field[0].val.typeRef.refPath[0].declRef].name;
+ };
+ struct_body += "." + val + " = " + value_field;
+ if (i !== expr.struct.length - 1) {
+ struct_body += ", ";
+ } else {
+ struct_body += " ";
+ }
+ }
+ struct_body += "}";
+ return struct_body;
+ }
+ case "typeOf_peer": {
+ let payloadHtml = "@TypeOf("
+ for (let i = 0; i < expr.typeOf_peer.length; i++) {
+ let elem = zigAnalysis.exprs[expr.typeOf_peer[i]];
+ payloadHtml += exprName(elem, {wantHtml: true, wantLink:true});
+ if (i !== expr.typeOf_peer.length - 1) {
+ payloadHtml += ", ";
+ }
+ }
+ payloadHtml += ")";
+ return payloadHtml;
+
+ }
+ case "alignOf": {
+ const alignRefArg = zigAnalysis.exprs[expr.alignOf];
+ let payloadHtml = "@alignOf(" + exprName(alignRefArg, {wantHtml: true, wantLink:true}) + ")";
+ return payloadHtml;
+ }
+ case "typeOf": {
+ const typeRefArg = zigAnalysis.exprs[expr.typeOf];
+ let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")";
+ return payloadHtml;
+ }
+ case "null": {
+ return "null";
+ }
+ case "array": {
+ let payloadHtml = ".{";
+ for (let i = 0; i < expr.array.length; i++) {
+ if (i != 0) payloadHtml += ", ";
+ let elem = zigAnalysis.exprs[expr.array[i]];
+ payloadHtml += exprName(elem, opts);
+ }
+ return payloadHtml + "}";
+ }
+ case "comptimeExpr": {
+ return zigAnalysis.comptimeExprs[expr.comptimeExpr].code;
+ }
+ case "call": {
+ let call = zigAnalysis.calls[expr.call];
+ let payloadHtml = "";
+
+
+ switch(Object.keys(call.func)[0]){
+ default: throw "TODO";
+ case "declRef":
+ case "refPath": {
+ payloadHtml += exprName(call.func, opts);
+ break;
}
- name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null, null, thisTypes);
- return name;
- case typeKinds.Float:
- return token('f' + typeObj.bits, tokenKinds.Type, wantHtml);
- case typeKinds.Int:
- var signed = (typeObj.i != null) ? 'i' : 'u';
- var bits = typeObj[signed];
- return token(signed + bits, tokenKinds.Type, wantHtml);
- case typeKinds.ComptimeInt:
- return token('comptime_int', tokenKinds.Type, wantHtml);
- case typeKinds.ComptimeFloat:
- return token('comptime_float', tokenKinds.Type, wantHtml);
- case typeKinds.Type:
- return token('type', tokenKinds.Type, wantHtml);
- case typeKinds.Bool:
- return token('bool', tokenKinds.Type, wantHtml);
- case typeKinds.Void:
- return token('void', tokenKinds.Type, wantHtml);
- case typeKinds.EnumLiteral:
- return token('(enum literal)', tokenKinds.Type, wantHtml);
- case typeKinds.NoReturn:
- return token('noreturn', tokenKinds.Type, wantHtml);
- case typeKinds.ErrorSet:
- if (typeObj.errors == null) {
- return token('anyerror', tokenKinds.Type, wantHtml);
- } else {
- if (wantHtml) {
- return escapeHtml(typeObj.name);
+ }
+ payloadHtml += "(";
+
+ for (let i = 0; i < call.args.length; i++) {
+ if (i != 0) payloadHtml += ", ";
+ payloadHtml += exprName(call.args[i], opts);
+ }
+
+ payloadHtml += ")";
+ return payloadHtml;
+ }
+ case "as": {
+ // @Check : this should be done in backend because there are legit @as() calls
+ // const typeRefArg = zigAnalysis.exprs[expr.as.typeRefArg];
+ const exprArg = zigAnalysis.exprs[expr.as.exprArg];
+ // return "@as(" + exprName(typeRefArg, opts) +
+ // ", " + exprName(exprArg, opts) + ")";
+ return exprName(exprArg, opts);
+ }
+ case "declRef": {
+ return zigAnalysis.decls[expr.declRef].name;
+ }
+ case "refPath": {
+ return expr.refPath.map(x => exprName(x, opts)).join(".");
+ }
+ case "int": {
+ return "" + expr.int;
+ }
+ case "float": {
+ return "" + expr.float.toFixed(2);
+ }
+ case "float128": {
+ return "" + expr.float128.toFixed(2);
+ }
+ case "undefined": {
+ return "undefined";
+ }
+ case "string": {
+ return "\"" + escapeHtml(expr.string) + "\"";
+ }
+
+ case "anytype": {
+ return "anytype";
+ }
+
+ case "this":{
+ return "@This()";
+ }
+
+ case "type": {
+ let name = "";
+
+ let typeObj = expr.type;
+ if (typeof typeObj === 'number') typeObj = zigAnalysis.types[typeObj];
+ switch (typeObj.kind) {
+ default: throw "TODO";
+ case typeKinds.Struct:
+ {
+ let structObj = (typeObj);
+ return structObj;
+ }
+ case typeKinds.Enum:
+ {
+ let enumObj = (typeObj);
+ return enumObj;
+ }
+ case typeKinds.Opaque:
+ {
+ let opaqueObj = (typeObj);
+
+ return opaqueObj.name;
+ }
+ case typeKinds.ComptimeExpr:
+ {
+ return "anyopaque";
+ }
+ case typeKinds.Array:
+ {
+ let arrayObj = typeObj;
+ let name = "[";
+ let lenName = exprName(arrayObj.len, opts);
+ let sentinel = arrayObj.sentinel ? ":"+exprName(arrayObj.sentinel, opts) : "";
+ // let is_mutable = arrayObj.is_multable ? "const " : "";
+
+ if (opts.wantHtml) {
+ name +=
+ '<span class="tok-number">' + lenName + sentinel + "</span>";
} else {
- return typeObj.name;
+ name += lenName + sentinel;
}
- }
- case typeKinds.ErrorUnion:
- var errSetTypeObj = zigAnalysis.types[typeObj.err];
- var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null, null, thisTypes);
- if (fnDecl != null && errSetTypeObj.fn === fnDecl.value) {
- // function index parameter supplied and this is the inferred error set of it
- return "!" + payloadHtml;
- } else {
- return typeIndexName(typeObj.err, wantHtml, wantSubLink, null, null, thisTypes) + "!" + payloadHtml;
- }
- case typeKinds.Fn:
- var payloadHtml = "";
- if (wantHtml) {
- payloadHtml += '<span class="tok-kw">fn</span>';
- if (fnDecl != null) {
- payloadHtml += ' <span class="tok-fn">';
- if (linkFnNameDecl != null) {
- payloadHtml += '<a href="' + linkFnNameDecl + '">' +
- escapeHtml(fnDecl.name) + '</a>';
- } else {
- payloadHtml += escapeHtml(fnDecl.name);
- }
- payloadHtml += '</span>';
- }
- } else {
- payloadHtml += 'fn'
- }
- payloadHtml += '(';
- if (typeObj.args != null) {
- var fields = null;
- var isVarArgs = false;
- if (fnDecl != null) {
- var fnObj = zigAnalysis.fns[fnDecl.value];
- var fnNode = zigAnalysis.astNodes[fnObj.src];
- fields = fnNode.fields;
- isVarArgs = fnNode.varArgs;
+ name += "]";
+ // name += is_mutable;
+ name += exprName(arrayObj.child, opts);
+ return name;
+ }
+ case typeKinds.Optional:
+ return "?" + exprName((typeObj).child, opts);
+ case typeKinds.Pointer:
+ {
+ let ptrObj = (typeObj);
+ let sentinel = ptrObj.sentinel ? ":"+exprName(ptrObj.sentinel, opts) : "";
+ let is_mutable = !ptrObj.is_mutable ? "const " : "";
+ let name = "";
+ switch (ptrObj.size) {
+ default:
+ console.log("TODO: implement unhandled pointer size case");
+ case pointerSizeEnum.One:
+ name += "*";
+ name += is_mutable;
+ break;
+ case pointerSizeEnum.Many:
+ name += "[*";
+ name += sentinel;
+ name += "]";
+ name += is_mutable;
+ break;
+ case pointerSizeEnum.Slice:
+ if (ptrObj.is_ref) {
+ name += "*";
+ }
+ name += "[";
+ name += sentinel;
+ name += "]";
+ name += is_mutable;
+ break;
+ case pointerSizeEnum.C:
+ name += "[*c";
+ name += sentinel;
+ name += "]";
+ name += is_mutable;
+ break;
+ }
+ // @check: after the major changes in arrays the consts are came from switch above
+ // if (!ptrObj.is_mutable) {
+ // if (opts.wantHtml) {
+ // name += '<span class="tok-kw">const</span> ';
+ // } else {
+ // name += "const ";
+ // }
+ // }
+ if (ptrObj.is_allowzero) {
+ name += "allowzero ";
+ }
+ if (ptrObj.is_volatile) {
+ name += "volatile ";
+ }
+ if (ptrObj.has_addrspace) {
+ name += "addrspace(";
+ name += "." + "";
+ name += ") ";
+ }
+ if (ptrObj.has_align) {
+ let align = exprName(ptrObj.align, opts);
+ if (opts.wantHtml) {
+ name += '<span class="tok-kw">align</span>(';
+ } else {
+ name += "align(";
+ }
+ if (opts.wantHtml) {
+ name += '<span class="tok-number">' + align + '</span>';
+ } else {
+ name += align;
+ }
+ if (ptrObj.hostIntBytes != null) {
+ name += ":";
+ if (opts.wantHtml) {
+ name += '<span class="tok-number">' + ptrObj.bitOffsetInHost + '</span>';
+ } else {
+ name += ptrObj.bitOffsetInHost;
+ }
+ name += ":";
+ if (opts.wantHtml) {
+ name += '<span class="tok-number">' + ptrObj.hostIntBytes + '</span>';
+ } else {
+ name += ptrObj.hostIntBytes;
+ }
+ }
+ name += ") ";
+ }
+ //name += typeValueName(ptrObj.child, wantHtml, wantSubLink, null);
+ name += exprName(ptrObj.child, opts);
+ return name;
+ }
+ case typeKinds.Float:
+ {
+ let floatObj = (typeObj);
+
+ if (opts.wantHtml) {
+ return '<span class="tok-type">' + floatObj.name + '</span>';
+ } else {
+ return floatObj.name;
+ }
+ }
+ case typeKinds.Int:
+ {
+ let intObj = (typeObj);
+ let name = intObj.name;
+ if (opts.wantHtml) {
+ return '<span class="tok-type">' + name + '</span>';
+ } else {
+ return name;
+ }
+ }
+ case typeKinds.ComptimeInt:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">comptime_int</span>';
+ } else {
+ return "comptime_int";
+ }
+ case typeKinds.ComptimeFloat:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">comptime_float</span>';
+ } else {
+ return "comptime_float";
+ }
+ case typeKinds.Type:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">type</span>';
+ } else {
+ return "type";
+ }
+ case typeKinds.Bool:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">bool</span>';
+ } else {
+ return "bool";
+ }
+ case typeKinds.Void:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">void</span>';
+ } else {
+ return "void";
+ }
+ case typeKinds.EnumLiteral:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">(enum literal)</span>';
+ } else {
+ return "(enum literal)";
+ }
+ case typeKinds.NoReturn:
+ if (opts.wantHtml) {
+ return '<span class="tok-type">noreturn</span>';
+ } else {
+ return "noreturn";
+ }
+ case typeKinds.ErrorSet:
+ {
+ let errSetObj = (typeObj);
+ if (errSetObj.fields == null) {
+ return '<span class="tok-type">anyerror</span>';
+ } else {
+ // throw "TODO";
+ let html = "error{" + errSetObj.fields[0].name + "}";
+ return html;
+ }
+ }
+
+ case typeKinds.ErrorUnion:
+ {
+ let errUnionObj = (typeObj);
+ let lhs = exprName(errUnionObj.lhs, opts);
+ let rhs = exprName(errUnionObj.rhs, opts);
+ return lhs + "!" + rhs;
+ }
+ case typeKinds.Fn:
+ {
+ let fnObj = (typeObj);
+ let payloadHtml = "";
+ if (opts.wantHtml) {
+ if (fnObj.is_extern) {
+ payloadHtml += "pub extern ";
+ }
+ if (fnObj.has_lib_name) {
+ payloadHtml += "\"" + fnObj.lib_name +"\" ";
+ }
+ payloadHtml += '<span class="tok-kw">fn</span>';
+ if (opts.fnDecl) {
+ payloadHtml += ' <span class="tok-fn">';
+ if (opts.linkFnNameDecl) {
+ payloadHtml += '<a href="' + opts.linkFnNameDecl + '">' +
+ escapeHtml(opts.fnDecl.name) + '</a>';
+ } else {
+ payloadHtml += escapeHtml(opts.fnDecl.name);
+ }
+ payloadHtml += '</span>';
+ }
+ } else {
+ payloadHtml += 'fn ';
+ }
+ payloadHtml += '(';
+ if (fnObj.params) {
+ let fields = null;
+ let isVarArgs = false;
+ let fnNode = zigAnalysis.astNodes[fnObj.src];
+ fields = fnNode.fields;
+ isVarArgs = fnNode.varArgs;
+
+ for (let i = 0; i < fnObj.params.length; i += 1) {
+ if (i != 0) {
+ payloadHtml += ', ';
+ }
+
+ payloadHtml += "<span class='argBreaker'><br>&nbsp;&nbsp;&nbsp;&nbsp;</span>"
+ let value = fnObj.params[i];
+ let paramValue = resolveValue({expr: value});
+
+ if (fields != null) {
+ let paramNode = zigAnalysis.astNodes[fields[i]];
+
+ if (paramNode.varArgs) {
+ payloadHtml += '...';
+ continue;
+ }
+
+ if (paramNode.noalias) {
+ if (opts.wantHtml) {
+ payloadHtml += '<span class="tok-kw">noalias</span> ';
+ } else {
+ payloadHtml += 'noalias ';
+ }
+ }
+
+ if (paramNode.comptime) {
+ if (opts.wantHtml) {
+ payloadHtml += '<span class="tok-kw">comptime</span> ';
+ } else {
+ payloadHtml += 'comptime ';
+ }
+ }
+
+ let paramName = paramNode.name;
+ if (paramName != null) {
+ // skip if it matches the type name
+ if (!shouldSkipParamName(paramValue, paramName)) {
+ payloadHtml += paramName + ': ';
+ }
+ }
+ }
+
+ if (isVarArgs && i === fnObj.params.length - 1) {
+ payloadHtml += '...';
+ }
+ else if ("alignOf" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+
+ }
+ else if ("typeOf" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+
+ }
+ else if ("typeOf_peer" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+
+ }
+ else if ("declRef" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+
+ }
+ else if ("call" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+ }
+ else if ("refPath" in value) {
+ if (opts.wantHtml) {
+ payloadHtml += '<a href="">';
+ payloadHtml +=
+ '<span class="tok-kw" style="color:lightblue;">'
+ + exprName(value, opts) + '</span>';
+ payloadHtml += '</a>';
+ } else {
+ payloadHtml += exprName(value, opts);
+ }
+ } else if ("type" in value) {
+ let name = exprName(value, {
+ wantHtml: false,
+ wantLink: false,
+ fnDecl: opts.fnDecl,
+ linkFnNameDecl: opts.linkFnNameDecl,
+ });
+ payloadHtml += '<span class="tok-kw">' + name + '</span>';
+ } else if ("binOpIndex" in value) {
+ payloadHtml += exprName(value, opts);
+ }else if ("comptimeExpr" in value) {
+ let comptimeExpr = zigAnalysis.comptimeExprs[value.comptimeExpr].code;
+ if (opts.wantHtml) {
+ payloadHtml += '<span class="tok-kw">' + comptimeExpr + '</span>';
+ } else {
+ payloadHtml += comptimeExpr;
+ }
+ } else if (opts.wantHtml) {
+ payloadHtml += '<span class="tok-kw">anytype</span>';
+ } else {
+ payloadHtml += 'anytype';
+ }
+ }
+ }
+
+ payloadHtml += "<span class='argBreaker'>,<br></span>"
+ payloadHtml += ') ';
+
+ if (fnObj.has_align) {
+ let align = zigAnalysis.exprs[fnObj.align]
+ payloadHtml += "align(" + exprName(align, opts) + ") ";
}
-
- for (var i = 0; i < typeObj.args.length; i += 1) {
- if (i != 0) {
- payloadHtml += ', ';
- }
-
- var argTypeIndex = typeObj.args[i];
-
- if (fields != null) {
- var paramNode = zigAnalysis.astNodes[fields[i]];
-
- if (paramNode.varArgs) {
- payloadHtml += '...';
- continue;
- }
-
- if (paramNode.noalias) {
- payloadHtml += token('noalias', tokenKinds.Keyword, wantHtml) + ' ';
- }
-
- if (paramNode.comptime) {
- payloadHtml += token('comptime', tokenKinds.Keyword, wantHtml) + ' ';
- }
-
- var paramName = paramNode.name;
- if (paramName != null) {
- // skip if it matches the type name
- if (argTypeIndex == null || !shouldSkipParamName(argTypeIndex, paramName)) {
- payloadHtml += paramName + ': ';
- }
- }
- }
-
- if (isVarArgs && i === typeObj.args.length - 1) {
- payloadHtml += '...';
- } else if (argTypeIndex != null) {
- payloadHtml += typeIndexName(argTypeIndex, wantHtml, wantSubLink, null, null, thisTypes);
- } else {
- payloadHtml += token('anytype', tokenKinds.Keyword, wantHtml);
- }
+ if (fnObj.has_cc) {
+ let cc = zigAnalysis.exprs[fnObj.cc]
+ if (cc) {
+ payloadHtml += "callconv(." + cc.enumLiteral + ") ";
+ }
}
- }
- payloadHtml += ') ';
- if (typeObj.ret != null) {
- payloadHtml += typeIndexName(typeObj.ret, wantHtml, wantSubLink, fnDecl, null, thisTypes);
- } else {
- payloadHtml += token('anytype', tokenKinds.Keyword, wantHtml);
- }
- return payloadHtml;
- case typeKinds.Frame:
- var fnObj = zigAnalysis.fns[typeObj.fn];
- return '@Frame(' + getValueText(fnObj.type, typeObj.fn, wantHtml, wantSubLink) + ')';
- case typeKinds.AnyFrame:
- var name = token('anyframe', tokenKinds.Keyword, wantHtml);
- if (typeObj.result) {
- name += "->";
- name += typeIndexName(typeObj.result, wantHtml, wantSubLink, null, null, thisTypes);
- }
- return name;
- default:
- if (wantHtml) {
- return escapeHtml(typeObj.name);
- } else {
- return typeObj.name;
+ if (fnObj.is_inferred_error) {
+ payloadHtml += "!";
+ }
+ if (fnObj.ret != null) {
+ payloadHtml += exprName(fnObj.ret, opts);
+ } else if (opts.wantHtml) {
+ payloadHtml += '<span class="tok-kw">anytype</span>';
+ } else {
+ payloadHtml += 'anytype';
+ }
+ return payloadHtml;
+ }
+ // if (wantHtml) {
+ // return escapeHtml(typeObj.name);
+ // } else {
+ // return typeObj.name;
+ // }
+ }
+ }
+
+ }
+ }
+
+
+
+ function shouldSkipParamName(typeRef, paramName) {
+ let resolvedTypeRef = resolveValue({expr: typeRef});
+ if ("type" in resolvedTypeRef) {
+ let typeObj = zigAnalysis.types[resolvedTypeRef.type];
+ if (typeObj.kind === typeKinds.Pointer){
+ let ptrObj = (typeObj);
+ if (getPtrSize(ptrObj) === pointerSizeEnum.One) {
+ const value = resolveValue(ptrObj.child);
+ return typeValueName(value, false, true).toLowerCase() === paramName;
}
+ }
}
+ return false;
+ }
+
+
+ function getPtrSize(typeObj) {
+ return (typeObj.size == null) ? pointerSizeEnum.One : typeObj.size;
}
+
function renderType(typeObj) {
- var name;
+ let name;
if (rootIsStd && typeObj === zigAnalysis.types[zigAnalysis.packages[zigAnalysis.rootPkg].main]) {
name = "std";
} else {
- name = typeName(typeObj, false, false);
+ name = exprName({type:typeObj}, false, false);
}
if (name != null && name != "") {
domHdrName.innerText = name + " (" + zigAnalysis.typeKinds[typeObj.kind] + ")";
domHdrName.classList.remove("hidden");
}
if (typeObj.kind == typeKinds.ErrorSet) {
- renderErrorSet(typeObj);
+ renderErrorSet((typeObj));
}
}
+
function renderErrorSet(errSetType) {
- if (errSetType.errors == null) {
+ if (errSetType.fields == null) {
domFnErrorsAnyError.classList.remove("hidden");
} else {
- var errorList = [];
- for (var i = 0; i < errSetType.errors.length; i += 1) {
- var errObj = zigAnalysis.errors[errSetType.errors[i]];
- var srcObj = zigAnalysis.astNodes[errObj.src];
- errorList.push({
- err: errObj,
- docs: srcObj.docs,
- });
+ let errorList = [];
+ for (let i = 0; i < errSetType.fields.length; i += 1) {
+ let errObj = errSetType.fields[i];
+ //let srcObj = zigAnalysis.astNodes[errObj.src];
+ errorList.push(errObj);
}
errorList.sort(function(a, b) {
- return operatorCompare(a.err.name.toLowerCase(), b.err.name.toLowerCase());
+ return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
});
- var domListFnErrorsFragment = createDomListFragment(errorList.length, "<dt></dt><dd></dd>");
- for (var i = 0; i < errorList.length; i += 1) {
- var nameTdDom = domListFnErrorsFragment.children[i * 2 + 0];
- var descTdDom = domListFnErrorsFragment.children[i * 2 + 1];
- nameTdDom.textContent = errorList[i].err.name;
- var docs = errorList[i].docs;
+ resizeDomListDl(domListFnErrors, errorList.length);
+ for (let i = 0; i < errorList.length; i += 1) {
+ let nameTdDom = domListFnErrors.children[i * 2 + 0];
+ let descTdDom = domListFnErrors.children[i * 2 + 1];
+ nameTdDom.textContent = errorList[i].name;
+ let docs = errorList[i].docs;
if (docs != null) {
descTdDom.innerHTML = markdown(docs);
} else {
descTdDom.textContent = "";
}
}
- domListFnErrors.innerHTML = "";
- domListFnErrors.appendChild(domListFnErrorsFragment);
domTableFnErrors.classList.remove("hidden");
}
domSectFnErrors.classList.remove("hidden");
}
- function allCompTimeFnCallsHaveTypeResult(typeIndex, value) {
- var srcIndex = zigAnalysis.fns[value].src;
- var calls = nodesToCallsMap[srcIndex];
- if (calls == null) return false;
- for (var i = 0; i < calls.length; i += 1) {
- var call = zigAnalysis.calls[calls[i]];
- if (call.result.type !== typeTypeId) return false;
- }
- return true;
- }
-
- function allCompTimeFnCallsResult(calls) {
- var firstTypeObj = null;
- var containerObj = {
- privDecls: [],
- };
- for (var callI = 0; callI < calls.length; callI += 1) {
- var call = zigAnalysis.calls[calls[callI]];
- if (call.result.type !== typeTypeId) return null;
- var typeObj = zigAnalysis.types[call.result.value];
- if (!typeKindIsContainer(typeObj.kind)) return null;
- if (firstTypeObj == null) {
- firstTypeObj = typeObj;
- containerObj.src = typeObj.src;
- } else if (firstTypeObj.src !== typeObj.src) {
- return null;
- }
-
- if (containerObj.fields == null) {
- containerObj.fields = (typeObj.fields || []).concat([]);
- } else for (var fieldI = 0; fieldI < typeObj.fields.length; fieldI += 1) {
- var prev = containerObj.fields[fieldI];
- var next = typeObj.fields[fieldI];
- if (prev === next) continue;
- if (typeof(prev) === 'object') {
- if (prev[next] == null) prev[next] = typeObj;
- } else {
- containerObj.fields[fieldI] = {};
- containerObj.fields[fieldI][prev] = firstTypeObj;
- containerObj.fields[fieldI][next] = typeObj;
- }
- }
-
- if (containerObj.pubDecls == null) {
- containerObj.pubDecls = (typeObj.pubDecls || []).concat([]);
- } else for (var declI = 0; declI < typeObj.pubDecls.length; declI += 1) {
- var prev = containerObj.pubDecls[declI];
- var next = typeObj.pubDecls[declI];
- if (prev === next) continue;
- // TODO instead of showing "examples" as the public declarations,
- // do logic like this:
- //if (typeof(prev) !== 'object') {
- // var newDeclId = zigAnalysis.decls.length;
- // prev = clone(zigAnalysis.decls[prev]);
- // prev.id = newDeclId;
- // zigAnalysis.decls.push(prev);
- // containerObj.pubDecls[declI] = prev;
- //}
- //mergeDecls(prev, next, firstTypeObj, typeObj);
- }
- }
- for (var declI = 0; declI < containerObj.pubDecls.length; declI += 1) {
- var decl = containerObj.pubDecls[declI];
- if (typeof(decl) === 'object') {
- containerObj.pubDecls[declI] = containerObj.pubDecls[declI].id;
- }
- }
- return containerObj;
- }
-
- function mergeDecls(declObj, nextDeclIndex, firstTypeObj, typeObj) {
- var nextDeclObj = zigAnalysis.decls[nextDeclIndex];
- if (declObj.type != null && nextDeclObj.type != null && declObj.type !== nextDeclObj.type) {
- if (typeof(declObj.type) !== 'object') {
- var prevType = declObj.type;
- declObj.type = {};
- declObj.type[prevType] = firstTypeObj;
- declObj.value = null;
- }
- declObj.type[nextDeclObj.type] = typeObj;
- } else if (declObj.type == null && nextDeclObj != null) {
- declObj.type = nextDeclObj.type;
- }
- if (declObj.value != null && nextDeclObj.value != null && declObj.value !== nextDeclObj.value) {
- if (typeof(declObj.value) !== 'object') {
- var prevValue = declObj.value;
- declObj.value = {};
- declObj.value[prevValue] = firstTypeObj;
- }
- declObj.value[nextDeclObj.value] = typeObj;
- } else if (declObj.value == null && nextDeclObj.value != null) {
- declObj.value = nextDeclObj.value;
- }
- }
-
+// function allCompTimeFnCallsHaveTypeResult(typeIndex, value) {
+// let srcIndex = zigAnalysis.fns[value].src;
+// let calls = nodesToCallsMap[srcIndex];
+// if (calls == null) return false;
+// for (let i = 0; i < calls.length; i += 1) {
+// let call = zigAnalysis.calls[calls[i]];
+// if (call.result.type !== typeTypeId) return false;
+// }
+// return true;
+// }
+//
+// function allCompTimeFnCallsResult(calls) {
+// let firstTypeObj = null;
+// let containerObj = {
+// privDecls: [],
+// };
+// for (let callI = 0; callI < calls.length; callI += 1) {
+// let call = zigAnalysis.calls[calls[callI]];
+// if (call.result.type !== typeTypeId) return null;
+// let typeObj = zigAnalysis.types[call.result.value];
+// if (!typeKindIsContainer(typeObj.kind)) return null;
+// if (firstTypeObj == null) {
+// firstTypeObj = typeObj;
+// containerObj.src = typeObj.src;
+// } else if (firstTypeObj.src !== typeObj.src) {
+// return null;
+// }
+//
+// if (containerObj.fields == null) {
+// containerObj.fields = (typeObj.fields || []).concat([]);
+// } else for (let fieldI = 0; fieldI < typeObj.fields.length; fieldI += 1) {
+// let prev = containerObj.fields[fieldI];
+// let next = typeObj.fields[fieldI];
+// if (prev === next) continue;
+// if (typeof(prev) === 'object') {
+// if (prev[next] == null) prev[next] = typeObj;
+// } else {
+// containerObj.fields[fieldI] = {};
+// containerObj.fields[fieldI][prev] = firstTypeObj;
+// containerObj.fields[fieldI][next] = typeObj;
+// }
+// }
+//
+// if (containerObj.pubDecls == null) {
+// containerObj.pubDecls = (typeObj.pubDecls || []).concat([]);
+// } else for (let declI = 0; declI < typeObj.pubDecls.length; declI += 1) {
+// let prev = containerObj.pubDecls[declI];
+// let next = typeObj.pubDecls[declI];
+// if (prev === next) continue;
+// // TODO instead of showing "examples" as the public declarations,
+// // do logic like this:
+// //if (typeof(prev) !== 'object') {
+// // let newDeclId = zigAnalysis.decls.length;
+// // prev = clone(zigAnalysis.decls[prev]);
+// // prev.id = newDeclId;
+// // zigAnalysis.decls.push(prev);
+// // containerObj.pubDecls[declI] = prev;
+// //}
+// //mergeDecls(prev, next, firstTypeObj, typeObj);
+// }
+// }
+// for (let declI = 0; declI < containerObj.pubDecls.length; declI += 1) {
+// let decl = containerObj.pubDecls[declI];
+// if (typeof(decl) === 'object') {
+// containerObj.pubDecls[declI] = containerObj.pubDecls[declI].id;
+// }
+// }
+// return containerObj;
+// }
+
+
+
+
function renderValue(decl) {
+ let resolvedValue = resolveValue(decl.value)
+
+ if (resolvedValue.expr.fieldRef) {
+ const declRef = decl.value.expr.refPath[0].declRef;
+ const type = zigAnalysis.decls[declRef];
+ domFnProtoCode.innerHTML = '<span class="tok-kw">const</span> ' +
+ escapeHtml(decl.name) + ': ' + type.name +
+ " = " + exprName(decl.value.expr, {wantHtml: true, wantLink:true}) + ";";
+ } else if (resolvedValue.expr.string !== undefined || resolvedValue.expr.call !== undefined || resolvedValue.expr.comptimeExpr) {
+ domFnProtoCode.innerHTML = '<span class="tok-kw">const</span> ' +
+ escapeHtml(decl.name) + ': ' + exprName(resolvedValue.expr, {wantHtml: true, wantLink:true}) +
+ " = " + exprName(decl.value.expr, {wantHtml: true, wantLink:true}) + ";";
+ } else if (resolvedValue.expr.compileError) {
+ domFnProtoCode.innerHTML = '<span class="tok-kw">const</span> ' +
+ escapeHtml(decl.name) + " = " + exprName(decl.value.expr, {wantHtml: true, wantLink:true}) + ";";
+ }
+ else {
domFnProtoCode.innerHTML = '<span class="tok-kw">const</span> ' +
- escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
+ escapeHtml(decl.name) + ': ' + exprName(resolvedValue.typeRef, {wantHtml: true, wantLink:true}) +
+ " = " + exprName(decl.value.expr, {wantHtml: true, wantLink:true}) + ";";
+ }
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
domTldDocs.innerHTML = markdown(docs);
domTldDocs.classList.remove("hidden");
@@ -928,11 +2078,13 @@
domFnProto.classList.remove("hidden");
}
+
function renderVar(decl) {
+ let declTypeRef = typeOfDecl(decl);
domFnProtoCode.innerHTML = '<span class="tok-kw">var</span> ' +
- escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
+ escapeHtml(decl.name) + ': ' + typeValueName(declTypeRef, true, true);
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
domTldDocs.innerHTML = markdown(docs);
domTldDocs.classList.remove("hidden");
@@ -941,52 +2093,103 @@
domFnProto.classList.remove("hidden");
}
- function renderContainer(container, thisTypes) {
- var typesList = [];
- var namespacesList = [];
- var errSetsList = [];
- var fnsList = [];
- var varsList = [];
- var valsList = [];
- for (var i = 0; i < container.pubDecls.length; i += 1) {
- var decl = zigAnalysis.decls[container.pubDecls[i]];
+
+ function categorizeDecls(decls,
+ typesList, namespacesList, errSetsList,
+ fnsList, varsList, valsList, testsList) {
+
+ for (let i = 0; i < decls.length; i += 1) {
+ let decl = zigAnalysis.decls[decls[i]];
+ let declValue = resolveValue(decl.value);
+
+ if (decl.isTest) {
+ testsList.push(decl);
+ continue;
+ }
if (decl.kind === 'var') {
varsList.push(decl);
continue;
- } else if (decl.kind === 'const' && decl.type != null) {
- if (decl.type === typeTypeId) {
- if (typeIsErrSet(decl.value)) {
- errSetsList.push(decl);
- } else if (typeIsStructWithNoFields(decl.value)) {
- namespacesList.push(decl);
- } else {
- typesList.push(decl);
- }
- } else {
- var typeKind = zigAnalysis.types[decl.type].kind;
- if (typeKind === typeKinds.Fn) {
- if (allCompTimeFnCallsHaveTypeResult(decl.type, decl.value)) {
- typesList.push(decl);
+ }
+
+ if (decl.kind === 'const') {
+ if ("type" in declValue.expr) {
+ // We have the actual type expression at hand.
+ const typeExpr = zigAnalysis.types[declValue.expr.type];
+ if (typeExpr.kind == typeKinds.Fn) {
+ const funcRetExpr = resolveValue({
+ expr: (typeExpr).ret
+ });
+ if ("type" in funcRetExpr.expr && funcRetExpr.expr.type == typeTypeId) {
+ if (typeIsErrSet(declValue.expr.type)) {
+ errSetsList.push(decl);
+ } else if (typeIsStructWithNoFields(declValue.expr.type)) {
+ namespacesList.push(decl);
+ } else {
+ typesList.push(decl);
+ }
} else {
fnsList.push(decl);
}
} else {
- valsList.push(decl);
+ if (typeIsErrSet(declValue.expr.type)) {
+ errSetsList.push(decl);
+ } else if (typeIsStructWithNoFields(declValue.expr.type)) {
+ namespacesList.push(decl);
+ } else {
+ typesList.push(decl);
+ }
}
+ } else if ("typeRef" in declValue) {
+ if ("type" in declValue.typeRef && declValue.typeRef == typeTypeId) {
+ // We don't know what the type expression is, but we know it's a type.
+ typesList.push(decl);
+ } else {
+ valsList.push(decl);
+ }
+ } else {
+ valsList.push(decl);
}
}
}
+ }
+
+
+ function renderContainer(container) {
+
+ let typesList = [];
+
+ let namespacesList = [];
+
+ let errSetsList = [];
+
+ let fnsList = [];
+
+ let varsList = [];
+
+ let valsList = [];
+
+ let testsList = [];
+
+ categorizeDecls(container.pubDecls,
+ typesList, namespacesList, errSetsList,
+ fnsList, varsList, valsList, testsList);
+ if (curNav.showPrivDecls) categorizeDecls(container.privDecls,
+ typesList, namespacesList, errSetsList,
+ fnsList, varsList, valsList, testsList);
+
+
typesList.sort(byNameProperty);
namespacesList.sort(byNameProperty);
errSetsList.sort(byNameProperty);
fnsList.sort(byNameProperty);
varsList.sort(byNameProperty);
valsList.sort(byNameProperty);
+ testsList.sort(byNameProperty);
if (container.src != null) {
- var docs = zigAnalysis.astNodes[container.src].docs;
+ let docs = zigAnalysis.astNodes[container.src].docs;
if (docs != null) {
domTldDocs.innerHTML = markdown(docs);
domTldDocs.classList.remove("hidden");
@@ -994,163 +2197,193 @@
}
if (typesList.length !== 0) {
- var domListTypesFragment = createDomListFragment(typesList.length, '<li><a href="#"></a></li>');
- for (var i = 0; i < typesList.length; i += 1) {
- var liDom = domListTypesFragment.children[i];
- var aDom = liDom.children[0];
- var decl = typesList[i];
+ resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
+ for (let i = 0; i < typesList.length; i += 1) {
+ let liDom = domListTypes.children[i];
+ let aDom = liDom.children[0];
+ let decl = typesList[i];
aDom.textContent = decl.name;
aDom.setAttribute('href', navLinkDecl(decl.name));
}
- domListTypes.innerHTML = "";
- domListTypes.appendChild(domListTypesFragment);
domSectTypes.classList.remove("hidden");
}
if (namespacesList.length !== 0) {
- var domListNamespacesFragment = createDomListFragment(namespacesList.length, '<li><a href="#"></a></li>');
- for (var i = 0; i < namespacesList.length; i += 1) {
- var liDom = domListNamespacesFragment.children[i];
- var aDom = liDom.children[0];
- var decl = namespacesList[i];
+ resizeDomList(domListNamespaces, namespacesList.length, '<li><a href="#"></a></li>');
+ for (let i = 0; i < namespacesList.length; i += 1) {
+ let liDom = domListNamespaces.children[i];
+ let aDom = liDom.children[0];
+ let decl = namespacesList[i];
aDom.textContent = decl.name;
aDom.setAttribute('href', navLinkDecl(decl.name));
}
- domListNamespaces.innerHTML = "";
- domListNamespaces.appendChild(domListNamespacesFragment);
domSectNamespaces.classList.remove("hidden");
}
if (errSetsList.length !== 0) {
- var domListErrSetsFragment = createDomListFragment(errSetsList.length, '<li><a href="#"></a></li>');
- for (var i = 0; i < errSetsList.length; i += 1) {
- var liDom = domListErrSetsFragment.children[i];
- var aDom = liDom.children[0];
- var decl = errSetsList[i];
+ resizeDomList(domListErrSets, errSetsList.length, '<li><a href="#"></a></li>');
+ for (let i = 0; i < errSetsList.length; i += 1) {
+ let liDom = domListErrSets.children[i];
+ let aDom = liDom.children[0];
+ let decl = errSetsList[i];
aDom.textContent = decl.name;
aDom.setAttribute('href', navLinkDecl(decl.name));
}
- domListErrSets.innerHTML = "";
- domListErrSets.appendChild(domListErrSetsFragment);
domSectErrSets.classList.remove("hidden");
}
if (fnsList.length !== 0) {
- var domListFnsFragment = createDomListFragment(fnsList.length, '<tr><td></td><td></td></tr>');
- for (var i = 0; i < fnsList.length; i += 1) {
- var decl = fnsList[i];
- var trDom = domListFnsFragment.children[i];
+ resizeDomList(domListFns, fnsList.length, '<div><dt></dt><dd></dd></div>');
+
+ window.x = domListFns;
+ for (let i = 0; i < fnsList.length; i += 1) {
+ let decl = fnsList[i];
+ let trDom = domListFns.children[i];
+
+ let tdFnCode = trDom.children[0];
+ let tdDesc = trDom.children[1];
- var tdFnCode = trDom.children[0];
- var tdDesc = trDom.children[1];
+ let declType = resolveValue(decl.value);
+ console.assert("type" in declType.expr);
- tdFnCode.innerHTML = typeIndexName(decl.type, true, true, decl, navLinkDecl(decl.name), thisTypes);
+ tdFnCode.innerHTML = exprName(declType.expr,{
+ wantHtml: true,
+ wantLink: true,
+ fnDecl: decl,
+ linkFnNameDecl: navLinkDecl(decl.name),
+ });
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
tdDesc.innerHTML = shortDescMarkdown(docs);
} else {
tdDesc.textContent = "";
}
}
- domListFns.innerHTML = "";
- domListFns.appendChild(domListFnsFragment);
domSectFns.classList.remove("hidden");
}
- if (container.fields != null && container.fields.length !== 0) {
- var domListFieldsFragment = createDomListFragment(container.fields.length, '<div></div>');
+ let containerNode = zigAnalysis.astNodes[container.src];
+ if (containerNode.fields && containerNode.fields.length > 0) {
+ resizeDomList(domListFields, containerNode.fields.length, '<div></div>');
- var containerNode = zigAnalysis.astNodes[container.src];
- for (var i = 0; i < container.fields.length; i += 1) {
- var field = container.fields[i];
- var fieldNode = zigAnalysis.astNodes[containerNode.fields[i]];
- var divDom = domListFieldsFragment.children[i];
+ for (let i = 0; i < containerNode.fields.length; i += 1) {
+ let fieldNode = zigAnalysis.astNodes[containerNode.fields[i]];
+ let divDom = domListFields.children[i];
+ let fieldName = (fieldNode.name);
- var html = '<div class="mobile-scroll-container"><pre class="scroll-item">' + escapeHtml(fieldNode.name);
+ let html = '<div class="mobile-scroll-container"><pre class="scroll-item">' + escapeHtml(fieldName);
if (container.kind === typeKinds.Enum) {
- html += ' = <span class="tok-number">' + field + '</span>';
+ html += ' = <span class="tok-number">' + fieldName + '</span>';
} else {
+ let fieldTypeExpr = container.fields[i];
html += ": ";
- if (typeof(field) === 'object') {
- html += '<span class="tok-kw">var</span>';
- } else {
- html += typeIndexName(field, true, true);
+ let name = exprName(fieldTypeExpr, false, false);
+ html += '<span class="tok-kw">'+ name +'</span>';
+ let tsn = typeShorthandName(fieldTypeExpr);
+ if (tsn) {
+ html += '<span> ('+ tsn +')</span>';
+
}
}
html += ',</pre></div>';
- var docs = fieldNode.docs;
+ let docs = fieldNode.docs;
if (docs != null) {
html += markdown(docs);
}
divDom.innerHTML = html;
}
- domListFields.innerHTML = "";
- domListFields.appendChild(domListFieldsFragment);
domSectFields.classList.remove("hidden");
}
if (varsList.length !== 0) {
- var domListGlobalVarsFragment = createDomListFragment(varsList.length,
+ resizeDomList(domListGlobalVars, varsList.length,
'<tr><td><a href="#"></a></td><td></td><td></td></tr>');
- for (var i = 0; i < varsList.length; i += 1) {
- var decl = varsList[i];
- var trDom = domListGlobalVarsFragment.children[i];
+ for (let i = 0; i < varsList.length; i += 1) {
+ let decl = varsList[i];
+ let trDom = domListGlobalVars.children[i];
- var tdName = trDom.children[0];
- var tdNameA = tdName.children[0];
- var tdType = trDom.children[1];
- var tdDesc = trDom.children[2];
+ let tdName = trDom.children[0];
+ let tdNameA = tdName.children[0];
+ let tdType = trDom.children[1];
+ let tdDesc = trDom.children[2];
tdNameA.setAttribute('href', navLinkDecl(decl.name));
tdNameA.textContent = decl.name;
- tdType.innerHTML = typeIndexName(decl.type, true, true);
+ tdType.innerHTML = typeValueName(typeOfDecl(decl), true, true);
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
tdDesc.innerHTML = shortDescMarkdown(docs);
} else {
tdDesc.textContent = "";
}
}
- domListGlobalVars.innerHTML = "";
- domListGlobalVars.appendChild(domListGlobalVarsFragment);
domSectGlobalVars.classList.remove("hidden");
}
if (valsList.length !== 0) {
- var domListValuesFragment = createDomListFragment(valsList.length,
+ resizeDomList(domListValues, valsList.length,
'<tr><td><a href="#"></a></td><td></td><td></td></tr>');
- for (var i = 0; i < valsList.length; i += 1) {
- var decl = valsList[i];
- var trDom = domListValuesFragment.children[i];
+ for (let i = 0; i < valsList.length; i += 1) {
+ let decl = valsList[i];
+ let trDom = domListValues.children[i];
- var tdName = trDom.children[0];
- var tdNameA = tdName.children[0];
- var tdType = trDom.children[1];
- var tdDesc = trDom.children[2];
+ let tdName = trDom.children[0];
+ let tdNameA = tdName.children[0];
+ let tdType = trDom.children[1];
+ let tdDesc = trDom.children[2];
tdNameA.setAttribute('href', navLinkDecl(decl.name));
tdNameA.textContent = decl.name;
- tdType.innerHTML = typeIndexName(decl.type, true, true);
+ tdType.innerHTML = exprName(walkResultTypeRef(decl.value),
+ {wantHtml:true, wantLink:true});
- var docs = zigAnalysis.astNodes[decl.src].docs;
+ let docs = zigAnalysis.astNodes[decl.src].docs;
if (docs != null) {
tdDesc.innerHTML = shortDescMarkdown(docs);
} else {
tdDesc.textContent = "";
}
}
- domListValues.innerHTML = "";
- domListValues.appendChild(domListValuesFragment);
domSectValues.classList.remove("hidden");
}
+
+ if (testsList.length !== 0) {
+ resizeDomList(domListTests, testsList.length,
+ '<tr><td><a href="#"></a></td><td></td><td></td></tr>');
+ for (let i = 0; i < testsList.length; i += 1) {
+ let decl = testsList[i];
+ let trDom = domListTests.children[i];
+
+ let tdName = trDom.children[0];
+ let tdNameA = tdName.children[0];
+ let tdType = trDom.children[1];
+ let tdDesc = trDom.children[2];
+
+ tdNameA.setAttribute('href', navLinkDecl(decl.name));
+ tdNameA.textContent = decl.name;
+
+ tdType.innerHTML = exprName(walkResultTypeRef(decl.value),
+ {wantHtml:true, wantLink:true});
+
+ let docs = zigAnalysis.astNodes[decl.src].docs;
+ if (docs != null) {
+ tdDesc.innerHTML = shortDescMarkdown(docs);
+ } else {
+ tdDesc.textContent = "";
+ }
+ }
+ domSectTests.classList.remove("hidden");
+ }
}
+
+
function operatorCompare(a, b) {
if (a === b) {
return 0;
@@ -1162,33 +2395,33 @@
}
function detectRootIsStd() {
- var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
+ let rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
if (rootPkg.table["std"] == null) {
// no std mapped into the root package
return false;
}
- var stdPkg = zigAnalysis.packages[rootPkg.table["std"]];
+ let stdPkg = zigAnalysis.packages[rootPkg.table["std"]];
if (stdPkg == null) return false;
return rootPkg.file === stdPkg.file;
}
function indexTypeKinds() {
- var map = {};
- for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) {
+ let map = ({});
+ for (let i = 0; i < zigAnalysis.typeKinds.length; i += 1) {
map[zigAnalysis.typeKinds[i]] = i;
}
// This is just for debugging purposes, not needed to function
- var assertList = ["Type","Void","Bool","NoReturn","Int","Float","Pointer","Array","Struct",
+ let assertList = ["Type","Void","Bool","NoReturn","Int","Float","Pointer","Array","Struct",
"ComptimeFloat","ComptimeInt","Undefined","Null","Optional","ErrorUnion","ErrorSet","Enum",
"Union","Fn","BoundFn","Opaque","Frame","AnyFrame","Vector","EnumLiteral"];
- for (var i = 0; i < assertList.length; i += 1) {
+ for (let i = 0; i < assertList.length; i += 1) {
if (map[assertList[i]] == null) throw new Error("No type kind '" + assertList[i] + "' found");
}
return map;
}
function findTypeTypeId() {
- for (var i = 0; i < zigAnalysis.types.length; i += 1) {
+ for (let i = 0; i < zigAnalysis.types.length; i += 1) {
if (zigAnalysis.types[i].kind == typeKinds.Type) {
return i;
}
@@ -1197,17 +2430,26 @@
}
function updateCurNav() {
+
curNav = {
+ showPrivDecls: false,
pkgNames: [],
pkgObjs: [],
declNames: [],
declObjs: [],
+ callName: null,
};
curNavSearch = "";
if (location.hash[0] === '#' && location.hash.length > 1) {
- var query = location.hash.substring(1);
- var qpos = query.indexOf("?");
+ let query = location.hash.substring(1);
+ if (query[0] === '*') {
+ curNav.showPrivDecls = true;
+ query = query.substring(1);
+ }
+
+ let qpos = query.indexOf("?");
+ let nonSearchPart;
if (qpos === -1) {
nonSearchPart = query;
} else {
@@ -1215,16 +2457,12 @@
curNavSearch = decodeURIComponent(query.substring(qpos + 1));
}
- var parts = nonSearchPart.split(";");
+ let parts = nonSearchPart.split(";");
curNav.pkgNames = decodeURIComponent(parts[0]).split(".");
if (parts[1] != null) {
curNav.declNames = decodeURIComponent(parts[1]).split(".");
}
}
-
- if (curNav.pkgNames.length === 0 && rootIsStd) {
- curNav.pkgNames = ["std"];
- }
}
function onHashChange() {
@@ -1239,43 +2477,65 @@
}
}
+
function findSubDecl(parentType, childName) {
- if (parentType.pubDecls == null) throw new Error("parent object has no public decls");
- for (var i = 0; i < parentType.pubDecls.length; i += 1) {
- var declIndex = parentType.pubDecls[i];
- var childDecl = zigAnalysis.decls[declIndex];
+ {
+ // Generic functions
+ if ("value" in parentType) {
+ const rv = resolveValue(parentType.value);
+ if ("type" in rv.expr) {
+ const t = zigAnalysis.types[rv.expr.type];
+ if (t.kind == typeKinds.Fn && t.generic_ret != null) {
+ const rgr = resolveValue({expr: t.generic_ret});
+ if ("type" in rgr.expr) {
+ parentType = zigAnalysis.types[rgr.expr.type];
+ }
+ }
+ }
+ }
+ }
+
+
+ if (!parentType.pubDecls) return null;
+ for (let i = 0; i < parentType.pubDecls.length; i += 1) {
+ let declIndex = parentType.pubDecls[i];
+ let childDecl = zigAnalysis.decls[declIndex];
if (childDecl.name === childName) {
return childDecl;
}
}
- return null;
- }
-
- function getDeclContainerType(decl) {
- if (decl.type === typeTypeId) {
- return zigAnalysis.types[decl.value];
+ if (!parentType.privDecls) return null;
+ for (let i = 0; i < parentType.privDecls.length; i += 1) {
+ let declIndex = parentType.privDecls[i];
+ let childDecl = zigAnalysis.decls[declIndex];
+ if (childDecl.name === childName) {
+ return childDecl;
+ }
}
return null;
}
+
+
+
function computeCanonicalPackagePaths() {
- var list = new Array(zigAnalysis.packages.length);
+ let list = new Array(zigAnalysis.packages.length);
// Now we try to find all the packages from root.
- var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
+ let rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
// Breadth-first to keep the path shortest possible.
- var stack = [{
- path: [],
+ let stack = [{
+ path: ([]),
pkg: rootPkg,
}];
while (stack.length !== 0) {
- var item = stack.shift();
- for (var key in item.pkg.table) {
- var childPkgIndex = item.pkg.table[key];
+ let item = (stack.shift());
+ for (let key in item.pkg.table) {
+ let childPkgIndex = item.pkg.table[key];
if (list[childPkgIndex] != null) continue;
- var childPkg = zigAnalysis.packages[childPkgIndex];
+ let childPkg = zigAnalysis.packages[childPkgIndex];
if (childPkg == null) continue;
- var newPath = item.path.concat([key])
+ let newPath = item.path.concat([key])
list[childPkgIndex] = newPath;
stack.push({
path: newPath,
@@ -1286,53 +2546,68 @@
return list;
}
- function typeKindIsContainer(typeKind) {
- return typeKind === typeKinds.Struct ||
- typeKind === typeKinds.Union ||
- typeKind === typeKinds.Enum;
- }
-
- function declCanRepresentTypeKind(typeKind) {
- return typeKind === typeKinds.ErrorSet || typeKindIsContainer(typeKind);
- }
+
function computeCanonDeclPaths() {
- var list = new Array(zigAnalysis.decls.length);
+ let list = new Array(zigAnalysis.decls.length);
canonTypeDecls = new Array(zigAnalysis.types.length);
- for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) {
+ for (let pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) {
if (pkgI === zigAnalysis.rootPkg && rootIsStd) continue;
- var pkg = zigAnalysis.packages[pkgI];
- var pkgNames = canonPkgPaths[pkgI];
- var stack = [{
- declNames: [],
+ let pkg = zigAnalysis.packages[pkgI];
+ let pkgNames = canonPkgPaths[pkgI];
+ if (pkgNames === undefined) continue;
+
+ let stack = [{
+ declNames: ([]),
type: zigAnalysis.types[pkg.main],
}];
while (stack.length !== 0) {
- var item = stack.shift();
+ let item = (stack.shift());
+
+ if (isContainerType(item.type)) {
+ let t = (item.type);
- if (item.type.pubDecls != null) {
- for (var declI = 0; declI < item.type.pubDecls.length; declI += 1) {
- var mainDeclIndex = item.type.pubDecls[declI];
+ let len = t.pubDecls ? t.pubDecls.length : 0;
+ for (let declI = 0; declI < len; declI += 1) {
+ let mainDeclIndex = t.pubDecls[declI];
if (list[mainDeclIndex] != null) continue;
- var decl = zigAnalysis.decls[mainDeclIndex];
- if (decl.type === typeTypeId &&
- declCanRepresentTypeKind(zigAnalysis.types[decl.value].kind))
- {
- canonTypeDecls[decl.value] = mainDeclIndex;
- }
- var declNames = item.declNames.concat([decl.name]);
+ let decl = zigAnalysis.decls[mainDeclIndex];
+ let declVal = decl.value; //resolveValue(decl.value);
+ let declNames = item.declNames.concat([decl.name]);
list[mainDeclIndex] = {
pkgNames: pkgNames,
declNames: declNames,
};
- var containerType = getDeclContainerType(decl);
- if (containerType != null) {
- stack.push({
- declNames: declNames,
- type: containerType,
- });
+ if ("type" in declVal.expr) {
+ let value = zigAnalysis.types[declVal.expr.type];
+ if (declCanRepresentTypeKind(value.kind))
+ {
+ canonTypeDecls[declVal.type] = mainDeclIndex;
+ }
+
+ if (isContainerType(value)) {
+ stack.push({
+ declNames: declNames,
+ type:value,
+ });
+ }
+
+
+ // Generic function
+ if (value.kind == typeKinds.Fn && value.generic_ret != null) {
+ let resolvedVal = resolveValue({ expr: value.generic_ret});
+ if ("type" in resolvedVal.expr) {
+ let generic_type = zigAnalysis.types[resolvedVal.expr.type];
+ if (isContainerType(generic_type)){
+ stack.push({
+ declNames: declNames,
+ type: generic_type,
+ });
+ }
+ }
+ }
}
}
}
@@ -1341,41 +2616,49 @@
return list;
}
+
function getCanonDeclPath(index) {
if (canonDeclPaths == null) {
canonDeclPaths = computeCanonDeclPaths();
}
+ //let cd = (canonDeclPaths);
return canonDeclPaths[index];
}
+
function getCanonTypeDecl(index) {
getCanonDeclPath(0);
+ //let ct = (canonTypeDecls);
return canonTypeDecls[index];
}
+
function escapeHtml(text) {
return text.replace(/[&"<>]/g, function (m) {
return escapeHtmlReplacements[m];
});
}
+
function shortDescMarkdown(docs) {
- var parts = docs.trim().split("\n");
- var firstLine = parts[0];
+ let parts = docs.trim().split("\n");
+ let firstLine = parts[0];
return markdown(firstLine);
}
+
function markdown(input) {
const raw_lines = input.split('\n'); // zig allows no '\r', so we don't need to split on CR
+
const lines = [];
// PHASE 1:
// Dissect lines and determine the type for each line.
- // Also computes indentation level and removes unnecessary whitespace
+ // Also computes indentation level and removes unnecessary whitespace
- var is_reading_code = false;
- var code_indent = 0;
- for (var line_no = 0; line_no < raw_lines.length; line_no++) {
+ let is_reading_code = false;
+ let code_indent = 0;
+ for (let line_no = 0; line_no < raw_lines.length; line_no++) {
const raw_line = raw_lines[line_no];
const line = {
@@ -1383,6 +2666,7 @@
raw_text: raw_line,
text: raw_line.trim(),
type: "p", // p, h1 … h6, code, ul, ol, blockquote, skip, empty
+ ordered_number: -1, // NOTE: hack to make the type checker happy
};
if (!is_reading_code) {
@@ -1419,7 +2703,7 @@
line.text = line.text.substr(1);
}
else if (line.text.match(/^\d+\..*$/)) { // if line starts with {number}{dot}
- const match = line.text.match(/(\d+)\./);
+ const match = (line.text.match(/(\d+)\./));
line.type = "ul";
line.text = line.text.substr(match[0].length);
line.ordered_number = Number(match[1].length);
@@ -1450,21 +2734,24 @@
// PHASE 2:
// Render HTML from markdown lines.
- // Look at each line and emit fitting HTML code
+ // Look at each line and emit fitting HTML code
- function markdownInlines(innerText, stopChar) {
+
+ function markdownInlines(innerText) {
// inline types:
// **{INLINE}** : <strong>
- // __{INLINE}__ : <u>
- // ~~{INLINE}~~ : <s>
- // *{INLINE}* : <emph>
- // _{INLINE}_ : <emph>
- // `{TEXT}` : <code>
- // [{INLINE}]({URL}) : <a>
- // ![{TEXT}]({URL}) : <img>
- // [[std;format.fmt]] : <a> (inner link)
-
+ // __{INLINE}__ : <u>
+ // ~~{INLINE}~~ : <s>
+ // *{INLINE}* : <emph>
+ // _{INLINE}_ : <emph>
+ // `{TEXT}` : <code>
+ // [{INLINE}]({URL}) : <a>
+ // ![{TEXT}]({URL}) : <img>
+ // [[std;format.fmt]] : <a> (inner link)
+
+
+
const formats = [
{
marker: "**",
@@ -1484,26 +2771,11 @@
}
];
- // Links, images and inner links don't use the same marker to wrap their content.
- const linksFormat = [
- {
- prefix: "[",
- regex: /\[([^\]]*)\]\(([^\)]*)\)/,
- urlIndex: 2, // Index in the match that contains the link URL
- textIndex: 1 // Index in the match that contains the link text
- },
- {
- prefix: "h",
- regex: /http[s]?:\/\/[^\s]+/,
- urlIndex: 0,
- textIndex: 0
- }
- ];
-
+
const stack = [];
- var innerHTML = "";
- var currentRun = "";
+ let innerHTML = "";
+ let currentRun = "";
function flushRun() {
if (currentRun != "") {
@@ -1512,18 +2784,18 @@
currentRun = "";
}
- var parsing_code = false;
- var codetag = "";
- var in_code = false;
+ let parsing_code = false;
+ let codetag = "";
+ let in_code = false;
- for (var i = 0; i < innerText.length; i++) {
+ for (let i = 0; i < innerText.length; i++) {
if (parsing_code && in_code) {
if (innerText.substr(i, codetag.length) == codetag) {
// remove leading and trailing whitespace if string both starts and ends with one.
- if (currentRun[0] == " " && currentRun[currentRun.length - 1] == " ") {
- currentRun = currentRun.substr(1, currentRun.length - 2);
- }
+ if (currentRun[0] == " " && currentRun[currentRun.length - 1] == " ") {
+ currentRun = currentRun.substr(1, currentRun.length - 2);
+ }
flushRun();
i += codetag.length - 1;
in_code = false;
@@ -1550,31 +2822,8 @@
currentRun += innerText[i];
in_code = true;
} else {
- var foundMatches = false;
-
- for (var j = 0; j < linksFormat.length; j++) {
- const linkFmt = linksFormat[j];
-
- if (linkFmt.prefix == innerText[i]) {
- var remaining = innerText.substring(i);
- var matches = remaining.match(linkFmt.regex);
-
- if (matches) {
- flushRun();
- innerHTML += ' <a href="' + matches[linkFmt.urlIndex] + '">' + matches[linkFmt.textIndex] + '</a> ';
- i += matches[0].length; // Skip the fragment we just consumed
- foundMatches = true;
- break;
- }
- }
- }
-
- if (foundMatches) {
- continue;
- }
-
- var any = false;
- for (var idx = (stack.length > 0 ? -1 : 0); idx < formats.length; idx++) {
+ let any = false;
+ for (let idx = (stack.length > 0 ? -1 : 0); idx < formats.length; idx++) {
const fmt = idx >= 0 ? formats[idx] : stack[stack.length - 1];
if (innerText.substr(i, fmt.marker.length) == fmt.marker) {
flushRun();
@@ -1598,48 +2847,54 @@
flushRun();
while (stack.length > 0) {
- const fmt = stack.pop();
+ const fmt = (stack.pop());
innerHTML += "</" + fmt.tag + ">";
}
return innerHTML;
}
- var html = "";
- for (var line_no = 0; line_no < lines.length; line_no++) {
- const line = lines[line_no];
-
- function previousLineIs(type) {
- if (line_no > 0) {
- return (lines[line_no - 1].type == type);
- } else {
- return false;
- }
+
+ function previousLineIs(type, line_no) {
+ if (line_no > 0) {
+ return (lines[line_no - 1].type == type);
+ } else {
+ return false;
}
+ }
- function nextLineIs(type) {
- if (line_no < (lines.length - 1)) {
- return (lines[line_no + 1].type == type);
- } else {
- return false;
- }
+
+ function nextLineIs(type, line_no) {
+ if (line_no < (lines.length - 1)) {
+ return (lines[line_no + 1].type == type);
+ } else {
+ return false;
}
+ }
- function getPreviousLineIndent() {
- if (line_no > 0) {
- return lines[line_no - 1].indent;
- } else {
- return 0;
- }
+
+ function getPreviousLineIndent(line_no) {
+ if (line_no > 0) {
+ return lines[line_no - 1].indent;
+ } else {
+ return 0;
}
+ }
- function getNextLineIndent() {
- if (line_no < (lines.length - 1)) {
- return lines[line_no + 1].indent;
- } else {
- return 0;
- }
+
+ function getNextLineIndent(line_no) {
+ if (line_no < (lines.length - 1)) {
+ return lines[line_no + 1].indent;
+ } else {
+ return 0;
}
+ }
+
+ let html = "";
+ for (let line_no = 0; line_no < lines.length; line_no++) {
+ const line = lines[line_no];
+
+
switch (line.type) {
case "h1":
@@ -1653,33 +2908,33 @@
case "ul":
case "ol":
- if (!previousLineIs("ul") || getPreviousLineIndent() < line.indent) {
+ if (!previousLineIs("ul", line_no) || getPreviousLineIndent(line_no) < line.indent) {
html += "<" + line.type + ">\n";
}
html += "<li>" + markdownInlines(line.text) + "</li>\n";
- if (!nextLineIs("ul") || getNextLineIndent() < line.indent) {
+ if (!nextLineIs("ul", line_no) || getNextLineIndent(line_no) < line.indent) {
html += "</" + line.type + ">\n";
}
break;
case "p":
- if (!previousLineIs("p")) {
+ if (!previousLineIs("p", line_no)) {
html += "<p>\n";
}
html += markdownInlines(line.text) + "\n";
- if (!nextLineIs("p")) {
+ if (!nextLineIs("p", line_no)) {
html += "</p>\n";
}
break;
case "code":
- if (!previousLineIs("code")) {
+ if (!previousLineIs("code", line_no)) {
html += "<pre><code>";
}
html += escapeHtml(line.text) + "\n";
- if (!nextLineIs("code")) {
+ if (!nextLineIs("code", line_no)) {
html += "</code></pre>\n";
}
break;
@@ -1694,26 +2949,27 @@
return;
}
- var liDom = domListSearchResults.children[curSearchIndex];
+ let liDom = domListSearchResults.children[curSearchIndex];
if (liDom == null && domListSearchResults.children.length !== 0) {
liDom = domListSearchResults.children[0];
}
if (liDom != null) {
- var aDom = liDom.children[0];
- location.href = aDom.getAttribute("href");
+ let aDom = liDom.children[0];
+ location.href = (aDom.getAttribute("href"));
curSearchIndex = -1;
}
domSearch.blur();
}
+
function onSearchKeyDown(ev) {
switch (getKeyString(ev)) {
case "Enter":
// detect if this search changes anything
- var terms1 = getSearchTerms();
+ let terms1 = getSearchTerms();
startSearch();
updateCurNav();
- var terms2 = getSearchTerms();
+ let terms2 = getSearchTerms();
// we might have to wait for onHashChange to trigger
imFeelingLucky = (terms1.join(' ') !== terms2.join(' '));
if (!imFeelingLucky) activateSelectedResult();
@@ -1749,6 +3005,8 @@
}
}
+
+
function moveSearchCursor(dir) {
if (curSearchIndex < 0 || curSearchIndex >= domListSearchResults.children.length) {
if (dir > 0) {
@@ -1768,9 +3026,10 @@
renderSearchCursor();
}
+
function getKeyString(ev) {
- var name;
- var ignoreShift = false;
+ let name;
+ let ignoreShift = false;
switch (ev.which) {
case 13:
name = "Enter";
@@ -1794,6 +3053,7 @@
return name;
}
+
function onWindowKeyDown(ev) {
switch (getKeyString(ev)) {
case "Esc":
@@ -1811,214 +3071,160 @@
startAsyncSearch();
break;
case "?":
- ev.preventDefault();
+ ev.preventDefault();
ev.stopPropagation();
showHelpModal();
break;
}
}
- 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 onClickSearchShowAllResults(ev) {
- ev.preventDefault();
- ev.stopPropagation();
- searchTrimResults = false;
- onHashChange();
- }
-
- function clearAsyncSearch() {
- if (searchTimer != null) {
- clearTimeout(searchTimer);
- searchTimer = null;
- }
- }
-
- function startAsyncSearch() {
- clearAsyncSearch();
- searchTrimResults = true;
- searchTimer = setTimeout(startSearch, 10);
- }
- function startSearch() {
- clearAsyncSearch();
- var oldHash = location.hash;
- var parts = oldHash.split("?");
- var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value);
- var newHash = (oldHash === "" ? "#" : parts[0]) + newPart2;
- // create a history entry only once per search
- if (parts.length === 1) {
- location.assign(newHash);
- } else {
- location.replace(newHash);
- }
- }
- 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;
+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 startAsyncSearch() {
+ clearAsyncSearch();
+ searchTimer = setTimeout(startSearch, 100);
+}
+function startSearch() {
+ clearAsyncSearch();
+ let oldHash = location.hash;
+ let parts = oldHash.split("?");
+ let newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value);
+ location.hash = (parts.length === 1) ? (oldHash + newPart2) : (parts[0] + newPart2);
+}
+function getSearchTerms() {
+ let list = curNavSearch.trim().split(/[ \r\n\t]+/);
+ list.sort();
+ return list;
+}
+function renderSearch() {
+ let matchedItems = [];
+ let ignoreCase = (curNavSearch.toLowerCase() === curNavSearch);
+ let terms = getSearchTerms();
+
+ decl_loop: for (let declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) {
+ let canonPath = getCanonDeclPath(declIndex);
+ if (canonPath == null) continue;
+
+ let decl = zigAnalysis.decls[declIndex];
+ let lastPkgName = canonPath.pkgNames[canonPath.pkgNames.length - 1];
+ let fullPathSearchText = lastPkgName + "." + canonPath.declNames.join('.');
+ let astNode = zigAnalysis.astNodes[decl.src];
+ let fileAndDocs = "" //zigAnalysis.files[astNode.file];
+ // TODO: understand what this piece of code is trying to achieve
+ // also right now `files` are expressed as a hashmap.
+ if (astNode.docs != null) {
+ fileAndDocs += "\n" + astNode.docs;
+ }
+ let fullPathSearchTextLower = fullPathSearchText;
+ if (ignoreCase) {
+ fullPathSearchTextLower = fullPathSearchTextLower.toLowerCase();
+ fileAndDocs = fileAndDocs.toLowerCase();
+ }
+
+ let points = 0;
+ for (let termIndex = 0; termIndex < terms.length; termIndex += 1) {
+ let 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;
}
- matchedItems.push({
- decl: decl,
- path: canonPath,
- points: points,
- });
+ continue decl_loop;
}
- if (matchedItems.length !== 0) {
- 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);
- });
+ matchedItems.push({
+ decl: decl,
+ path: canonPath,
+ points: points,
+ });
+ }
- var searchTrimmed = false
- var searchTrimResultsMaxItems = 200
- if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) {
- matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems)
- searchTrimmed = true
- }
+ if (matchedItems.length !== 0) {
+ resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>');
- var domListSearchResultsFragment = createDomListFragment(matchedItems.length, '<li><a href="#"></a></li>');
- for (var i = 0; i < matchedItems.length; i += 1) {
- var liDom = domListSearchResultsFragment.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));
- }
+ matchedItems.sort(function(a, b) {
+ let cmp = operatorCompare(b.points, a.points);
+ if (cmp != 0) return cmp;
+ return operatorCompare(a.decl.name, b.decl.name);
+ });
- domListSearchResults.innerHTML = "";
- domListSearchResults.appendChild(domListSearchResultsFragment);
- domSectSearchResults.classList.remove("hidden");
+ for (let i = 0; i < matchedItems.length; i += 1) {
+ let liDom = domListSearchResults.children[i];
+ let aDom = liDom.children[0];
+ let match = matchedItems[i];
+ let 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();
- if (searchTrimmed) {
- domSectSearchAllResultsLink.classList.remove("hidden");
- }
+ domSectSearchResults.classList.remove("hidden");
+ } else {
+ domSectSearchNoResults.classList.remove("hidden");
+ }
+}
- renderSearchCursor();
+function renderSearchCursor() {
+ for (let i = 0; i < domListSearchResults.children.length; i += 1) {
+ let liDom = (domListSearchResults.children[i]);
+ if (curSearchIndex === i) {
+ liDom.classList.add("selected");
} else {
- domSectSearchNoResults.classList.remove("hidden");
+ liDom.classList.remove("selected");
}
}
+}
- function renderSearchCursor() {
- for (var i = 0; i < domListSearchResults.children.length; i += 1) {
- var liDom = domListSearchResults.children[i];
- if (curSearchIndex === i) {
- liDom.classList.add("selected");
- } else {
- liDom.classList.remove("selected");
- }
- }
- }
- function indexNodesToFns() {
- var map = {};
- for (var i = 0; i < zigAnalysis.fns.length; i += 1) {
- var fn = zigAnalysis.fns[i];
- if (typeIsGenericFn(fn.type)) continue;
- if (map[fn.src] == null) {
- map[fn.src] = [i];
- } else {
- map[fn.src].push(i);
- }
- }
- return map;
- }
- function indexNodesToCalls() {
- var map = {};
- for (var i = 0; i < zigAnalysis.calls.length; i += 1) {
- var call = zigAnalysis.calls[i];
- var fn = zigAnalysis.fns[call.fn];
- if (map[fn.src] == null) {
- map[fn.src] = [i];
- } else {
- map[fn.src].push(i);
- }
- }
- return map;
- }
+// function indexNodesToCalls() {
+// let map = {};
+// for (let i = 0; i < zigAnalysis.calls.length; i += 1) {
+// let call = zigAnalysis.calls[i];
+// let fn = zigAnalysis.fns[call.fn];
+// if (map[fn.src] == null) {
+// map[fn.src] = [i];
+// } else {
+// map[fn.src].push(i);
+// }
+// }
+// return map;
+// }
- function byNameProperty(a, b) {
- return operatorCompare(a.name, b.name);
- }
- function clone(obj) {
- var res = {};
- for (var key in obj) {
- res[key] = obj[key];
- }
- return res;
- }
- function firstObjectKey(obj) {
- for (var key in obj) {
- return key;
- }
- }
+function byNameProperty(a, b) {
+ return operatorCompare(a.name, b.name);
+}
+
+
- function token(value, tokenClass, wantHtml){
- if(wantHtml){
- return '<span class="' + tokenClass + '">' + value + '</span>';
- } else {
- return value + '';
- }
- }
})();