| ... | @@ -29,11 +29,17 @@ | ... | @@ -29,11 +29,17 @@ |
| 29 | | 29 | |
| 30 | var typeKindTypeId; | 30 | var typeKindTypeId; |
| 31 | var typeKindFnId; | 31 | var typeKindFnId; |
| | 32 | var typeKindPtrId; |
| | 33 | var typeKindFloatId; |
| | 34 | var typeKindIntId; |
| 32 | findTypeKinds(); | 35 | findTypeKinds(); |
| 33 | | 36 | |
| 34 | // for each package, is an array with packages to get to this one | 37 | // for each package, is an array with packages to get to this one |
| 35 | var canonPkgPaths = computeCanonicalPackagePaths(); | 38 | var canonPkgPaths = computeCanonicalPackagePaths(); |
| | 39 | // for each decl, is an array with {declNames, pkgNames} to get to this one |
| 36 | var canonDeclPaths = null; // lazy; use getCanonDeclPath | 40 | var canonDeclPaths = null; // lazy; use getCanonDeclPath |
| | 41 | // for each type, is an array with {declNames, pkgNames} to get to this one |
| | 42 | var canonTypeDecls = null; // lazy; use getCanonTypeDecl |
| 37 | | 43 | |
| 38 | var curNav = { | 44 | var curNav = { |
| 39 | // each element is a package name, e.g. @import("a") then within there @import("b") | 45 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| ... | @@ -158,7 +164,29 @@ | ... | @@ -158,7 +164,29 @@ |
| 158 | | 164 | |
| 159 | function renderFn(fnDecl) { | 165 | function renderFn(fnDecl) { |
| 160 | var typeObj = zigAnalysis.types[fnDecl.type]; | 166 | var typeObj = zigAnalysis.types[fnDecl.type]; |
| 161 | domFnProtoCode.textContent = "fn " + fnDecl.name + typeObj.name.substring(2); | 167 | var protoHtml = '<span class="tok-kw">fn</span> <span class="tok-fn">' |
| | 168 | + escapeHtml(fnDecl.name) + '</span>('; |
| | 169 | if (typeObj.args != null) { |
| | 170 | for (var i = 0; i < typeObj.args.length; i += 1) { |
| | 171 | if (i != 0) { |
| | 172 | protoHtml += ', '; |
| | 173 | } |
| | 174 | var argTypeIndex = typeObj.args[i]; |
| | 175 | if (argTypeIndex != null) { |
| | 176 | protoHtml += typeIndexName(argTypeIndex, true, true); |
| | 177 | } else { |
| | 178 | protoHtml += '<span class="tok-kw">var</span>'; |
| | 179 | } |
| | 180 | } |
| | 181 | } |
| | 182 | |
| | 183 | protoHtml += ') '; |
| | 184 | if (typeObj.ret != null) { |
| | 185 | protoHtml += typeIndexName(typeObj.ret, true, true); |
| | 186 | } else { |
| | 187 | protoHtml += '<span class="tok-kw">var</span>'; |
| | 188 | } |
| | 189 | domFnProtoCode.innerHTML = protoHtml; |
| 162 | | 190 | |
| 163 | var docsSource = null; | 191 | var docsSource = null; |
| 164 | var srcNode = zigAnalysis.astNodes[fnDecl.src]; | 192 | var srcNode = zigAnalysis.astNodes[fnDecl.src]; |
| ... | @@ -306,9 +334,107 @@ | ... | @@ -306,9 +334,107 @@ |
| 306 | } | 334 | } |
| 307 | } | 335 | } |
| 308 | | 336 | |
| | 337 | function typeIndexName(typeIndex, wantHtml, wantLink) { |
| | 338 | var typeObj = zigAnalysis.types[typeIndex]; |
| | 339 | if (wantLink) { |
| | 340 | var declIndex = getCanonTypeDecl(typeIndex); |
| | 341 | var declPath = getCanonDeclPath(declIndex); |
| | 342 | var haveLink = declPath != null; |
| | 343 | var typeNameHtml = typeName(typeObj, true, !haveLink); |
| | 344 | if (haveLink) { |
| | 345 | return '<a href="' + navLink(declPath.pkgNames, declPath.declNames) + '">' + typeNameHtml + '</a>'; |
| | 346 | } else { |
| | 347 | return typeNameHtml; |
| | 348 | } |
| | 349 | } else { |
| | 350 | return typeName(typeObj, wantHtml); |
| | 351 | } |
| | 352 | } |
| | 353 | |
| | 354 | function typeName(typeObj, wantHtml, wantSubLink) { |
| | 355 | switch (typeObj.kind) { |
| | 356 | case typeKindPtrId: |
| | 357 | var name = ""; |
| | 358 | switch (typeObj.len) { |
| | 359 | case 0: |
| | 360 | default: |
| | 361 | name += "*"; |
| | 362 | break; |
| | 363 | case 1: |
| | 364 | name += "[*]"; |
| | 365 | break; |
| | 366 | case 2: |
| | 367 | name += "[]"; |
| | 368 | break; |
| | 369 | case 3: |
| | 370 | name += "[*c]"; |
| | 371 | break; |
| | 372 | } |
| | 373 | if (typeObj['const']) { |
| | 374 | if (wantHtml) { |
| | 375 | name += '<span class="tok-kw">const</span> '; |
| | 376 | } else { |
| | 377 | name += "const "; |
| | 378 | } |
| | 379 | } |
| | 380 | if (typeObj['volatile']) { |
| | 381 | if (wantHtml) { |
| | 382 | name += '<span class="tok-kw">volatile</span> '; |
| | 383 | } else { |
| | 384 | name += "volatile "; |
| | 385 | } |
| | 386 | } |
| | 387 | if (typeObj.align != null) { |
| | 388 | if (wantHtml) { |
| | 389 | name += '<span class="tok-kw">align</span>('; |
| | 390 | } else { |
| | 391 | name += "align("; |
| | 392 | } |
| | 393 | if (wantHtml) { |
| | 394 | name += '<span class="tok-number">' + typeObj.align + '</span>'; |
| | 395 | } else { |
| | 396 | name += typeObj.align; |
| | 397 | } |
| | 398 | if (typeObj.hostIntBytes != null) { |
| | 399 | name += ":" + typeObj.bitOffsetInHost + ":" + typeObj.hostIntBytes; |
| | 400 | } |
| | 401 | name += ") "; |
| | 402 | } |
| | 403 | name += typeIndexName(typeObj.elem, wantHtml, wantSubLink); |
| | 404 | return name; |
| | 405 | case typeKindFloatId: |
| | 406 | if (wantHtml) { |
| | 407 | return '<span class="tok-type">f' + typeObj.bits + '</span>'; |
| | 408 | } else { |
| | 409 | return "f" + typeObj.bits; |
| | 410 | } |
| | 411 | case typeKindIntId: |
| | 412 | var signed = (typeObj.i != null) ? 'i' : 'u'; |
| | 413 | var bits = typeObj[signed]; |
| | 414 | if (wantHtml) { |
| | 415 | return '<span class="tok-type">' + signed + bits + '</span>'; |
| | 416 | } else { |
| | 417 | return signed + bits; |
| | 418 | } |
| | 419 | case typeKindTypeId: |
| | 420 | if (wantHtml) { |
| | 421 | return '<span class="tok-type">type</span>'; |
| | 422 | } else { |
| | 423 | return "type"; |
| | 424 | } |
| | 425 | default: |
| | 426 | if (wantHtml) { |
| | 427 | return escapeHtml(typeObj.name); |
| | 428 | } else { |
| | 429 | return typeObj.name; |
| | 430 | } |
| | 431 | } |
| | 432 | } |
| | 433 | |
| 309 | function renderType(typeObj) { | 434 | function renderType(typeObj) { |
| 310 | if (typeObj.name != null && typeObj.name != "") { | 435 | var name = typeName(typeObj); |
| 311 | domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + typeObj.name; | 436 | if (name != null && name != "") { |
| | 437 | domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + name; |
| 312 | domHdrName.classList.remove("hidden"); | 438 | domHdrName.classList.remove("hidden"); |
| 313 | } | 439 | } |
| 314 | } | 440 | } |
| ... | @@ -402,6 +528,12 @@ | ... | @@ -402,6 +528,12 @@ |
| 402 | typeKindTypeId = i; | 528 | typeKindTypeId = i; |
| 403 | } else if (zigAnalysis.typeKinds[i] === "Fn") { | 529 | } else if (zigAnalysis.typeKinds[i] === "Fn") { |
| 404 | typeKindFnId = i; | 530 | typeKindFnId = i; |
| | 531 | } else if (zigAnalysis.typeKinds[i] === "Pointer") { |
| | 532 | typeKindPtrId = i; |
| | 533 | } else if (zigAnalysis.typeKinds[i] === "Float") { |
| | 534 | typeKindFloatId = i; |
| | 535 | } else if (zigAnalysis.typeKinds[i] === "Int") { |
| | 536 | typeKindIntId = i; |
| 405 | } | 537 | } |
| 406 | } | 538 | } |
| 407 | if (typeKindTypeId == null) { | 539 | if (typeKindTypeId == null) { |
| ... | @@ -410,6 +542,15 @@ | ... | @@ -410,6 +542,15 @@ |
| 410 | if (typeKindFnId == null) { | 542 | if (typeKindFnId == null) { |
| 411 | throw new Error("No type kind 'Fn' found"); | 543 | throw new Error("No type kind 'Fn' found"); |
| 412 | } | 544 | } |
| | 545 | if (typeKindPtrId == null) { |
| | 546 | throw new Error("No type kind 'Pointer' found"); |
| | 547 | } |
| | 548 | if (typeKindFloatId == null) { |
| | 549 | throw new Error("No type kind 'Float' found"); |
| | 550 | } |
| | 551 | if (typeKindIntId == null) { |
| | 552 | throw new Error("No type kind 'Int' found"); |
| | 553 | } |
| 413 | } | 554 | } |
| 414 | | 555 | |
| 415 | function findTypeTypeId() { | 556 | function findTypeTypeId() { |
| ... | @@ -500,6 +641,7 @@ | ... | @@ -500,6 +641,7 @@ |
| 500 | | 641 | |
| 501 | function computeCanonDeclPaths() { | 642 | function computeCanonDeclPaths() { |
| 502 | var list = new Array(zigAnalysis.decls.length); | 643 | var list = new Array(zigAnalysis.decls.length); |
| | 644 | canonTypeDecls = new Array(zigAnalysis.types.length); |
| 503 | | 645 | |
| 504 | for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) { | 646 | for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) { |
| 505 | if (pkgI === zigAnalysis.rootPkg && rootIsStd) continue; | 647 | if (pkgI === zigAnalysis.rootPkg && rootIsStd) continue; |
| ... | @@ -518,6 +660,9 @@ | ... | @@ -518,6 +660,9 @@ |
| 518 | if (list[mainDeclIndex] != null) continue; | 660 | if (list[mainDeclIndex] != null) continue; |
| 519 | | 661 | |
| 520 | var decl = zigAnalysis.decls[mainDeclIndex]; | 662 | var decl = zigAnalysis.decls[mainDeclIndex]; |
| | 663 | if (decl.type === typeTypeId) { |
| | 664 | canonTypeDecls[decl.value] = mainDeclIndex; |
| | 665 | } |
| 521 | var declNames = item.declNames.concat([decl.name]); | 666 | var declNames = item.declNames.concat([decl.name]); |
| 522 | list[mainDeclIndex] = { | 667 | list[mainDeclIndex] = { |
| 523 | pkgNames: pkgNames, | 668 | pkgNames: pkgNames, |
| ... | @@ -544,12 +689,22 @@ | ... | @@ -544,12 +689,22 @@ |
| 544 | return canonDeclPaths[index]; | 689 | return canonDeclPaths[index]; |
| 545 | } | 690 | } |
| 546 | | 691 | |
| 547 | function markdown(mdText) { | 692 | function getCanonTypeDecl(index) { |
| 548 | return mdText.replace(/[&"<>]/g, function (m) { | 693 | getCanonDeclPath(0); |
| | 694 | return canonTypeDecls[index]; |
| | 695 | } |
| | 696 | |
| | 697 | function escapeHtml(text) { |
| | 698 | return text.replace(/[&"<>]/g, function (m) { |
| 549 | return escapeHtmlReplacements[m]; | 699 | return escapeHtmlReplacements[m]; |
| 550 | }); | 700 | }); |
| 551 | } | 701 | } |
| 552 | | 702 | |
| | 703 | function markdown(mdText) { |
| | 704 | // TODO implement more |
| | 705 | return escapeHtml(mdText); |
| | 706 | } |
| | 707 | |
| 553 | function onSearchKeyDown(ev) { | 708 | function onSearchKeyDown(ev) { |
| 554 | switch (ev.which) { | 709 | switch (ev.which) { |
| 555 | case 13: | 710 | case 13: |