authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2022-03-30 19:06:02+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-19 19:10:11-07:00
log72e5b4fb747908d4cf4e5039c671ec729e5b7716
tree71ba0e203877c3c34021ce69a1f0add6b1be3afb
parent64feb222b52ae135c23fec55a2431fd733a6f1e8

autodoc: improve type checking in main.js


1 files changed, 180 insertions(+), 121 deletions(-)

lib/docs/main.js+180-121
...@@ -57,15 +57,19 @@...@@ -57,15 +57,19 @@
5757
58/**58/**
59 * @typedef {59 * @typedef {
60 { kind: number } & (60 | { kind: number, name: string; src: number; privDecls: number[]; pubDecls: number[]; fields: WalkResult[] } // Struct, Enum, Union
61 | { name: string } // Type, Void, Bool, NoReturn, Int, Float, ComptimeExpr, ComptimeFloat, ComptimeInt, Undefined, Null, ErrorUnion, BoundFn, Opaque, Frame, AnyFrame, Vector, EnumLiteral61 } ContainerType
62 | { name: string; child: TypeRef } // Optional62*/
63 | { len: WalkResult; child: TypeRef } // Array63
64 | { name: string; fields: { name: string; docs: string }[] } // ErrorSet64/**
65 | { size: "One" | "Many" | "Slice" | "C"; child: TypeRef } // Pointer65 * @typedef {
66 | { name: string; src: number; privDecls: number[]; pubDecls: number[]; fields: WalkResult[] } // Struct, Enum, Union66 | { kind: number, name: string } // Type, Void, Bool, NoReturn, Int, Float, ComptimeExpr, ComptimeFloat, ComptimeInt, Undefined, Null, ErrorUnion, BoundFn, Opaque, Frame, AnyFrame, Vector, EnumLiteral
67 | { name: string; src: number; ret: WalkResult; params: WalkResult[] } // Fn67 | { kind: number, name: string; child: TypeRef } // Optional
68 )68 | { kind: number, len: WalkResult; child: TypeRef } // Array
69 | { kind: number, name: string; fields: { name: string; docs: string }[] } // ErrorSet
70 | { kind: number, size: "One" | "Many" | "Slice" | "C"; child: TypeRef } // Pointer
71 | ContainerType
72 | { kind: number, name: string; src: number; ret: WalkResult; params: WalkResult[] } // Fn
69 } Type73 } Type
70*/74*/
7175
...@@ -156,7 +160,7 @@...@@ -156,7 +160,7 @@
156 errors: {};160 errors: {};
157 astNodes: AstNode[];161 astNodes: AstNode[];
158 calls: Call[];162 calls: Call[];
159 files: Record<string, number>;163 files: Record<string, string>;
160 types: Type[];164 types: Type[];
161 decls: Decl[];165 decls: Decl[];
162 comptimeExprs: ComptimeExpr[];166 comptimeExprs: ComptimeExpr[];
...@@ -168,53 +172,57 @@...@@ -168,53 +172,57 @@
168var zigAnalysis;172var zigAnalysis;
169173
170(function() {174(function() {
171 var domStatus = document.getElementById("status");175 var domStatus = /** @type HTMLElement */(document.getElementById("status"));
172 var domSectNav = document.getElementById("sectNav");176 var domSectNav = /** @type HTMLElement */(document.getElementById("sectNav"));
173 var domListNav = document.getElementById("listNav");177 var domListNav = /** @type HTMLElement */(document.getElementById("listNav"));
174 var domSectMainPkg = document.getElementById("sectMainPkg");178 var domSectMainPkg = /** @type HTMLElement */(document.getElementById("sectMainPkg"));
175 var domSectPkgs = document.getElementById("sectPkgs");179 var domSectPkgs = /** @type HTMLElement */(document.getElementById("sectPkgs"));
176 var domListPkgs = document.getElementById("listPkgs");180 var domListPkgs = /** @type HTMLElement */(document.getElementById("listPkgs"));
177 var domSectTypes = document.getElementById("sectTypes");181 var domSectTypes = /** @type HTMLElement */(document.getElementById("sectTypes"));
178 var domListTypes = document.getElementById("listTypes");182 var domListTypes = /** @type HTMLElement */(document.getElementById("listTypes"));
179 var domSectTests = document.getElementById("sectTests");183 var domSectTests = /** @type HTMLElement */(document.getElementById("sectTests"));
180 var domListTests = document.getElementById("listTests");184 var domListTests = /** @type HTMLElement */(document.getElementById("listTests"));
181 var domSectNamespaces = document.getElementById("sectNamespaces");185 var domSectNamespaces = /** @type HTMLElement */(document.getElementById("sectNamespaces"));
182 var domListNamespaces = document.getElementById("listNamespaces");186 var domListNamespaces = /** @type HTMLElement */(document.getElementById("listNamespaces"));
183 var domSectErrSets = document.getElementById("sectErrSets");187 var domSectErrSets = /** @type HTMLElement */(document.getElementById("sectErrSets"));
184 var domListErrSets = document.getElementById("listErrSets");188 var domListErrSets = /** @type HTMLElement */(document.getElementById("listErrSets"));
185 var domSectFns = document.getElementById("sectFns");189 var domSectFns = /** @type HTMLElement */(document.getElementById("sectFns"));
186 var domListFns = document.getElementById("listFns");190 var domListFns = /** @type HTMLElement */(document.getElementById("listFns"));
187 var domSectFields = document.getElementById("sectFields");191 var domSectFields = /** @type HTMLElement */(document.getElementById("sectFields"));
188 var domListFields = document.getElementById("listFields");192 var domListFields = /** @type HTMLElement */(document.getElementById("listFields"));
189 var domSectGlobalVars = document.getElementById("sectGlobalVars");193 var domSectGlobalVars = /** @type HTMLElement */(document.getElementById("sectGlobalVars"));
190 var domListGlobalVars = document.getElementById("listGlobalVars");194 var domListGlobalVars = /** @type HTMLElement */(document.getElementById("listGlobalVars"));
191 var domSectValues = document.getElementById("sectValues");195 var domSectValues = /** @type HTMLElement */(document.getElementById("sectValues"));
192 var domListValues = document.getElementById("listValues");196 var domListValues = /** @type HTMLElement */(document.getElementById("listValues"));
193 var domFnProto = document.getElementById("fnProto");197 var domFnProto = /** @type HTMLElement */(document.getElementById("fnProto"));
194 var domFnProtoCode = document.getElementById("fnProtoCode");198 var domFnProtoCode = /** @type HTMLElement */(document.getElementById("fnProtoCode"));
195 var domSectParams = document.getElementById("sectParams");199 var domSectParams = /** @type HTMLElement */(document.getElementById("sectParams"));
196 var domListParams = document.getElementById("listParams");200 var domListParams = /** @type HTMLElement */(document.getElementById("listParams"));
197 var domTldDocs = document.getElementById("tldDocs");201 var domTldDocs = /** @type HTMLElement */(document.getElementById("tldDocs"));
198 var domSectFnErrors = document.getElementById("sectFnErrors");202 var domSectFnErrors = /** @type HTMLElement */(document.getElementById("sectFnErrors"));
199 var domListFnErrors = document.getElementById("listFnErrors");203 var domListFnErrors = /** @type HTMLElement */(document.getElementById("listFnErrors"));
200 var domTableFnErrors = document.getElementById("tableFnErrors");204 var domTableFnErrors =/** @type HTMLElement */(document.getElementById("tableFnErrors"));
201 var domFnErrorsAnyError = document.getElementById("fnErrorsAnyError");205 var domFnErrorsAnyError = /** @type HTMLElement */(document.getElementById("fnErrorsAnyError"));
202 var domFnExamples = document.getElementById("fnExamples");206 var domFnExamples = /** @type HTMLElement */(document.getElementById("fnExamples"));
203 var domListFnExamples = document.getElementById("listFnExamples");207 var domListFnExamples = /** @type HTMLElement */(document.getElementById("listFnExamples"));
204 var domFnNoExamples = document.getElementById("fnNoExamples");208 var domFnNoExamples = /** @type HTMLElement */(document.getElementById("fnNoExamples"));
205 var domDeclNoRef = document.getElementById("declNoRef");209 var domDeclNoRef = /** @type HTMLElement */(document.getElementById("declNoRef"));
206 var domSearch = document.getElementById("search");210 var domSearch = /** @type HTMLInputElement */(document.getElementById("search"));
207 var domSectSearchResults = document.getElementById("sectSearchResults");211 var domSectSearchResults = /** @type HTMLElement */(document.getElementById("sectSearchResults"));
208 var domListSearchResults = document.getElementById("listSearchResults");212
209 var domSectSearchNoResults = document.getElementById("sectSearchNoResults");213 var domListSearchResults = /** @type HTMLElement */(document.getElementById("listSearchResults"));
210 var domSectInfo = document.getElementById("sectInfo");214 var domSectSearchNoResults = /** @type HTMLElement */(document.getElementById("sectSearchNoResults"));
211 var domTdTarget = document.getElementById("tdTarget");215 var domSectInfo = /** @type HTMLElement */(document.getElementById("sectInfo"));
212 var domPrivDeclsBox = document.getElementById("privDeclsBox");216 var domTdTarget = /** @type HTMLElement */(document.getElementById("tdTarget"));
213 var domTdZigVer = document.getElementById("tdZigVer");217 var domPrivDeclsBox = /** @type HTMLElement */(document.getElementById("privDeclsBox"));
214 var domHdrName = document.getElementById("hdrName");218 var domTdZigVer = /** @type HTMLElement */(document.getElementById("tdZigVer"));
215 var domHelpModal = document.getElementById("helpDialog");219 var domHdrName = /** @type HTMLElement */(document.getElementById("hdrName"));
216220 var domHelpModal = /** @type HTMLElement */(document.getElementById("helpDialog"));
221
222 /** @type number | null */
217 var searchTimer = null;223 var searchTimer = null;
224
225 /** @type Object<string, string> */
218 var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };226 var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
219227
220 var typeKinds = indexTypeKinds();228 var typeKinds = indexTypeKinds();
...@@ -298,12 +306,6 @@ var zigAnalysis;...@@ -298,12 +306,6 @@ var zigAnalysis;
298 return isType(x) && typeKindIsContainer(x.kind) ;306 return isType(x) && typeKindIsContainer(x.kind) ;
299 }307 }
300308
301 function declContainsType(x){
302 console.assert("value" in x);
303
304
305 }
306
307 function typeShorthandName(type) {309 function typeShorthandName(type) {
308 var name = type.name;310 var name = type.name;
309 if (type.kind === typeKinds.Struct) {311 if (type.kind === typeKinds.Struct) {
...@@ -1434,6 +1436,10 @@ var zigAnalysis;...@@ -1434,6 +1436,10 @@ var zigAnalysis;
1434 }1436 }
14351437
14361438
1439 /**
1440 * @param {number[]} decls
1441 * @param {Decl[]} typesList, namespacesList, errSetsList, fnsList, varsList, valsList, testsList
1442 */
1437 function categorizeDecls(decls,1443 function categorizeDecls(decls,
1438 typesList, namespacesList, errSetsList,1444 typesList, namespacesList, errSetsList,
1439 fnsList, varsList, valsList, testsList) {1445 fnsList, varsList, valsList, testsList) {
...@@ -1495,13 +1501,23 @@ var zigAnalysis;...@@ -1495,13 +1501,23 @@ var zigAnalysis;
1495 }1501 }
1496 }1502 }
14971503
1504 /**
1505 * @param {ContainerType} container
1506 */
1498 function renderContainer(container) {1507 function renderContainer(container) {
1508 /** @type {Decl[]} */
1499 var typesList = [];1509 var typesList = [];
1510 /** @type {Decl[]} */
1500 var namespacesList = [];1511 var namespacesList = [];
1512 /** @type {Decl[]} */
1501 var errSetsList = [];1513 var errSetsList = [];
1514 /** @type {Decl[]} */
1502 var fnsList = [];1515 var fnsList = [];
1516 /** @type {Decl[]} */
1503 var varsList = [];1517 var varsList = [];
1518 /** @type {Decl[]} */
1504 var valsList = [];1519 var valsList = [];
1520 /** @type {Decl[]} */
1505 var testsList = [];1521 var testsList = [];
15061522
1507 categorizeDecls(container.pubDecls,1523 categorizeDecls(container.pubDecls,
...@@ -1911,20 +1927,32 @@ var zigAnalysis;...@@ -1911,20 +1927,32 @@ var zigAnalysis;
1911 return canonTypeDecls[index];1927 return canonTypeDecls[index];
1912 }1928 }
19131929
1930 /** @param {string} text */
1914 function escapeHtml(text) {1931 function escapeHtml(text) {
1915 return text.replace(/[&"<>]/g, function (m) {1932 return text.replace(/[&"<>]/g, function (m) {
1916 return escapeHtmlReplacements[m];1933 return escapeHtmlReplacements[m];
1917 });1934 });
1918 }1935 }
19191936
1937 /** @param {string} docs */
1920 function shortDescMarkdown(docs) {1938 function shortDescMarkdown(docs) {
1921 var parts = docs.trim().split("\n");1939 var parts = docs.trim().split("\n");
1922 var firstLine = parts[0];1940 var firstLine = parts[0];
1923 return markdown(firstLine);1941 return markdown(firstLine);
1924 }1942 }
19251943
1944 /** @param {string} input */
1926 function markdown(input) {1945 function markdown(input) {
1927 const raw_lines = input.split('\n'); // zig allows no '\r', so we don't need to split on CR1946 const raw_lines = input.split('\n'); // zig allows no '\r', so we don't need to split on CR
1947 /**
1948 * @type Array<{
1949 * indent: number,
1950 * raw_text: string,
1951 * text: string,
1952 * type: string,
1953 * ordered_number: number,
1954 * }>
1955 */
1928 const lines = [];1956 const lines = [];
19291957
1930 // PHASE 1:1958 // PHASE 1:
...@@ -1941,6 +1969,7 @@ var zigAnalysis;...@@ -1941,6 +1969,7 @@ var zigAnalysis;
1941 raw_text: raw_line,1969 raw_text: raw_line,
1942 text: raw_line.trim(),1970 text: raw_line.trim(),
1943 type: "p", // p, h1 … h6, code, ul, ol, blockquote, skip, empty1971 type: "p", // p, h1 … h6, code, ul, ol, blockquote, skip, empty
1972 ordered_number: -1, // NOTE: hack to make the type checker happy
1944 };1973 };
19451974
1946 if (!is_reading_code) {1975 if (!is_reading_code) {
...@@ -1977,7 +2006,7 @@ var zigAnalysis;...@@ -1977,7 +2006,7 @@ var zigAnalysis;
1977 line.text = line.text.substr(1);2006 line.text = line.text.substr(1);
1978 }2007 }
1979 else if (line.text.match(/^\d+\..*$/)) { // if line starts with {number}{dot}2008 else if (line.text.match(/^\d+\..*$/)) { // if line starts with {number}{dot}
1980 const match = line.text.match(/(\d+)\./);2009 const match = /** @type {RegExpMatchArray} */(line.text.match(/(\d+)\./));
1981 line.type = "ul";2010 line.type = "ul";
1982 line.text = line.text.substr(match[0].length);2011 line.text = line.text.substr(match[0].length);
1983 line.ordered_number = Number(match[1].length);2012 line.ordered_number = Number(match[1].length);
...@@ -2010,7 +2039,10 @@ var zigAnalysis;...@@ -2010,7 +2039,10 @@ var zigAnalysis;
2010 // Render HTML from markdown lines.2039 // Render HTML from markdown lines.
2011 // Look at each line and emit fitting HTML code2040 // Look at each line and emit fitting HTML code
20122041
2013 function markdownInlines(innerText, stopChar) {2042 /**
2043 * @param {string } innerText
2044 */
2045 function markdownInlines(innerText) {
20142046
2015 // inline types:2047 // inline types:
2016 // **{INLINE}** : <strong>2048 // **{INLINE}** : <strong>
...@@ -2023,6 +2055,8 @@ var zigAnalysis;...@@ -2023,6 +2055,8 @@ var zigAnalysis;
2023 // ![{TEXT}]({URL}) : <img>2055 // ![{TEXT}]({URL}) : <img>
2024 // [[std;format.fmt]] : <a> (inner link)2056 // [[std;format.fmt]] : <a> (inner link)
20252057
2058 /** @typedef {{marker: string, tag: string}} Fmt*/
2059 /** @type {Array<Fmt>} */
2026 const formats = [2060 const formats = [
2027 {2061 {
2028 marker: "**",2062 marker: "**",
...@@ -2042,6 +2076,7 @@ var zigAnalysis;...@@ -2042,6 +2076,7 @@ var zigAnalysis;
2042 }2076 }
2043 ];2077 ];
20442078
2079 /** @type {Array<Fmt>} */
2045 const stack = [];2080 const stack = [];
20462081
2047 var innerHTML = "";2082 var innerHTML = "";
...@@ -2093,7 +2128,7 @@ var zigAnalysis;...@@ -2093,7 +2128,7 @@ var zigAnalysis;
2093 in_code = true;2128 in_code = true;
2094 } else {2129 } else {
2095 var any = false;2130 var any = false;
2096 for (var idx = (stack.length > 0 ? -1 : 0); idx < formats.length; idx++) {2131 for (let idx = /** @type {number} */(stack.length > 0 ? -1 : 0); idx < formats.length; idx++) {
2097 const fmt = idx >= 0 ? formats[idx] : stack[stack.length - 1];2132 const fmt = idx >= 0 ? formats[idx] : stack[stack.length - 1];
2098 if (innerText.substr(i, fmt.marker.length) == fmt.marker) {2133 if (innerText.substr(i, fmt.marker.length) == fmt.marker) {
2099 flushRun();2134 flushRun();
...@@ -2117,48 +2152,60 @@ var zigAnalysis;...@@ -2117,48 +2152,60 @@ var zigAnalysis;
2117 flushRun();2152 flushRun();
21182153
2119 while (stack.length > 0) {2154 while (stack.length > 0) {
2120 const fmt = stack.pop();2155 const fmt = /** @type {Fmt} */(stack.pop());
2121 innerHTML += "</" + fmt.tag + ">";2156 innerHTML += "</" + fmt.tag + ">";
2122 }2157 }
21232158
2124 return innerHTML;2159 return innerHTML;
2125 }2160 }
21262161
2127 var html = "";2162 /**
2128 for (var line_no = 0; line_no < lines.length; line_no++) {2163 * @param {string} type
2129 const line = lines[line_no];2164 * @param {number} line_no
21302165 */
2131 function previousLineIs(type) {2166 function previousLineIs(type, line_no) {
2132 if (line_no > 0) {2167 if (line_no > 0) {
2133 return (lines[line_no - 1].type == type);2168 return (lines[line_no - 1].type == type);
2134 } else {2169 } else {
2135 return false;2170 return false;
2136 }
2137 }2171 }
2172 }
21382173
2139 function nextLineIs(type) {2174 /**
2140 if (line_no < (lines.length - 1)) {2175 * @param {string} type
2141 return (lines[line_no + 1].type == type);2176 * @param {number} line_no
2142 } else {2177 */
2143 return false;2178 function nextLineIs(type, line_no) {
2144 }2179 if (line_no < (lines.length - 1)) {
2180 return (lines[line_no + 1].type == type);
2181 } else {
2182 return false;
2145 }2183 }
2184 }
21462185
2147 function getPreviousLineIndent() {2186 /** @param {number} line_no */
2148 if (line_no > 0) {2187 function getPreviousLineIndent(line_no) {
2149 return lines[line_no - 1].indent;2188 if (line_no > 0) {
2150 } else {2189 return lines[line_no - 1].indent;
2151 return 0;2190 } else {
2152 }2191 return 0;
2153 }2192 }
2193 }
21542194
2155 function getNextLineIndent() {2195 /** @param {number} line_no */
2156 if (line_no < (lines.length - 1)) {2196 function getNextLineIndent(line_no) {
2157 return lines[line_no + 1].indent;2197 if (line_no < (lines.length - 1)) {
2158 } else {2198 return lines[line_no + 1].indent;
2159 return 0;2199 } else {
2160 }2200 return 0;
2161 }2201 }
2202 }
2203
2204 var html = "";
2205 for (var line_no = 0; line_no < lines.length; line_no++) {
2206 const line = lines[line_no];
2207
2208
21622209
2163 switch (line.type) {2210 switch (line.type) {
2164 case "h1":2211 case "h1":
...@@ -2172,33 +2219,33 @@ var zigAnalysis;...@@ -2172,33 +2219,33 @@ var zigAnalysis;
21722219
2173 case "ul":2220 case "ul":
2174 case "ol":2221 case "ol":
2175 if (!previousLineIs("ul") || getPreviousLineIndent() < line.indent) {2222 if (!previousLineIs("ul", line_no) || getPreviousLineIndent(line_no) < line.indent) {
2176 html += "<" + line.type + ">\n";2223 html += "<" + line.type + ">\n";
2177 }2224 }
21782225
2179 html += "<li>" + markdownInlines(line.text) + "</li>\n";2226 html += "<li>" + markdownInlines(line.text) + "</li>\n";
21802227
2181 if (!nextLineIs("ul") || getNextLineIndent() < line.indent) {2228 if (!nextLineIs("ul", line_no) || getNextLineIndent(line_no) < line.indent) {
2182 html += "</" + line.type + ">\n";2229 html += "</" + line.type + ">\n";
2183 }2230 }
2184 break;2231 break;
21852232
2186 case "p":2233 case "p":
2187 if (!previousLineIs("p")) {2234 if (!previousLineIs("p", line_no)) {
2188 html += "<p>\n";2235 html += "<p>\n";
2189 }2236 }
2190 html += markdownInlines(line.text) + "\n";2237 html += markdownInlines(line.text) + "\n";
2191 if (!nextLineIs("p")) {2238 if (!nextLineIs("p", line_no)) {
2192 html += "</p>\n";2239 html += "</p>\n";
2193 }2240 }
2194 break;2241 break;
21952242
2196 case "code":2243 case "code":
2197 if (!previousLineIs("code")) {2244 if (!previousLineIs("code", line_no)) {
2198 html += "<pre><code>";2245 html += "<pre><code>";
2199 }2246 }
2200 html += escapeHtml(line.text) + "\n";2247 html += escapeHtml(line.text) + "\n";
2201 if (!nextLineIs("code")) {2248 if (!nextLineIs("code", line_no)) {
2202 html += "</code></pre>\n";2249 html += "</code></pre>\n";
2203 }2250 }
2204 break;2251 break;
...@@ -2219,12 +2266,13 @@ var zigAnalysis;...@@ -2219,12 +2266,13 @@ var zigAnalysis;
2219 }2266 }
2220 if (liDom != null) {2267 if (liDom != null) {
2221 var aDom = liDom.children[0];2268 var aDom = liDom.children[0];
2222 location.href = aDom.getAttribute("href");2269 location.href = /** @type {string} */(aDom.getAttribute("href"));
2223 curSearchIndex = -1;2270 curSearchIndex = -1;
2224 }2271 }
2225 domSearch.blur();2272 domSearch.blur();
2226 }2273 }
22272274
2275 /** @param {KeyboardEvent} ev */
2228 function onSearchKeyDown(ev) {2276 function onSearchKeyDown(ev) {
2229 switch (getKeyString(ev)) {2277 switch (getKeyString(ev)) {
2230 case "Enter":2278 case "Enter":
...@@ -2268,6 +2316,8 @@ var zigAnalysis;...@@ -2268,6 +2316,8 @@ var zigAnalysis;
2268 }2316 }
2269 }2317 }
22702318
2319
2320 /** @param {number} dir */
2271 function moveSearchCursor(dir) {2321 function moveSearchCursor(dir) {
2272 if (curSearchIndex < 0 || curSearchIndex >= domListSearchResults.children.length) {2322 if (curSearchIndex < 0 || curSearchIndex >= domListSearchResults.children.length) {
2273 if (dir > 0) {2323 if (dir > 0) {
...@@ -2287,6 +2337,7 @@ var zigAnalysis;...@@ -2287,6 +2337,7 @@ var zigAnalysis;
2287 renderSearchCursor();2337 renderSearchCursor();
2288 }2338 }
22892339
2340 /** @param {KeyboardEvent} ev */
2290 function getKeyString(ev) {2341 function getKeyString(ev) {
2291 var name;2342 var name;
2292 var ignoreShift = false;2343 var ignoreShift = false;
...@@ -2313,6 +2364,7 @@ var zigAnalysis;...@@ -2313,6 +2364,7 @@ var zigAnalysis;
2313 return name;2364 return name;
2314 }2365 }
23152366
2367 /** @param {KeyboardEvent} ev */
2316 function onWindowKeyDown(ev) {2368 function onWindowKeyDown(ev) {
2317 switch (getKeyString(ev)) {2369 switch (getKeyString(ev)) {
2318 case "Esc":2370 case "Esc":
...@@ -2451,7 +2503,7 @@ function renderSearch() {...@@ -2451,7 +2503,7 @@ function renderSearch() {
24512503
2452function renderSearchCursor() {2504function renderSearchCursor() {
2453 for (var i = 0; i < domListSearchResults.children.length; i += 1) {2505 for (var i = 0; i < domListSearchResults.children.length; i += 1) {
2454 var liDom = domListSearchResults.children[i];2506 var liDom = /** @type HTMLElement */(domListSearchResults.children[i]);
2455 if (curSearchIndex === i) {2507 if (curSearchIndex === i) {
2456 liDom.classList.add("selected");2508 liDom.classList.add("selected");
2457 } else {2509 } else {
...@@ -2462,35 +2514,42 @@ function renderSearchCursor() {...@@ -2462,35 +2514,42 @@ function renderSearchCursor() {
24622514
24632515
24642516
2465function indexNodesToCalls() {2517// function indexNodesToCalls() {
2466 var map = {};2518// var map = {};
2467 for (var i = 0; i < zigAnalysis.calls.length; i += 1) {2519// for (var i = 0; i < zigAnalysis.calls.length; i += 1) {
2468 var call = zigAnalysis.calls[i];2520// var call = zigAnalysis.calls[i];
2469 var fn = zigAnalysis.fns[call.fn];2521// var fn = zigAnalysis.fns[call.fn];
2470 if (map[fn.src] == null) {2522// if (map[fn.src] == null) {
2471 map[fn.src] = [i];2523// map[fn.src] = [i];
2472 } else {2524// } else {
2473 map[fn.src].push(i);2525// map[fn.src].push(i);
2474 }2526// }
2475 }2527// }
2476 return map;2528// return map;
2477}2529// }
24782530
2531
2532/**
2533* @param {{ name: string }} a
2534* @param {{ name: string }} b
2535*/
2479function byNameProperty(a, b) {2536function byNameProperty(a, b) {
2480 return operatorCompare(a.name, b.name);2537 return operatorCompare(a.name, b.name);
2481}2538}
24822539
2540
2541/**
2542 * @template T
2543 * @param {T} obj
2544 * @returns {T}
2545 */
2483function clone(obj) {2546function clone(obj) {
2484 var res = {};2547 var res = /** @type T */({});
2485 for (var key in obj) {2548 for (var key in obj) {
2486 res[key] = obj[key];2549 res[key] = obj[key];
2487 }2550 }
2488 return res;2551 return res;
2489}2552}
24902553
2491function firstObjectKey(obj) {2554
2492 for (var key in obj) {
2493 return key;
2494 }
2495}
2496})();2555})();