| ... | ... | @@ -29,11 +29,17 @@ |
| 29 | 29 | |
| 30 | 30 | var typeKindTypeId; |
| 31 | 31 | var typeKindFnId; |
| 32 | var typeKindPtrId; |
| 33 | var typeKindFloatId; |
| 34 | var typeKindIntId; |
| 32 | 35 | findTypeKinds(); |
| 33 | 36 | |
| 34 | 37 | // for each package, is an array with packages to get to this one |
| 35 | 38 | var canonPkgPaths = computeCanonicalPackagePaths(); |
| 39 | // for each decl, is an array with {declNames, pkgNames} to get to this one |
| 36 | 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 | 44 | var curNav = { |
| 39 | 45 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| ... | ... | @@ -158,7 +164,29 @@ |
| 158 | 164 | |
| 159 | 165 | function renderFn(fnDecl) { |
| 160 | 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 | 191 | var docsSource = null; |
| 164 | 192 | var srcNode = zigAnalysis.astNodes[fnDecl.src]; |
| ... | ... | @@ -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 | 434 | function renderType(typeObj) { |
| 310 | | if (typeObj.name != null && typeObj.name != "") { |
| 311 | | domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + typeObj.name; |
| 435 | var name = typeName(typeObj); |
| 436 | if (name != null && name != "") { |
| 437 | domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + name; |
| 312 | 438 | domHdrName.classList.remove("hidden"); |
| 313 | 439 | } |
| 314 | 440 | } |
| ... | ... | @@ -402,6 +528,12 @@ |
| 402 | 528 | typeKindTypeId = i; |
| 403 | 529 | } else if (zigAnalysis.typeKinds[i] === "Fn") { |
| 404 | 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 | 539 | if (typeKindTypeId == null) { |
| ... | ... | @@ -410,6 +542,15 @@ |
| 410 | 542 | if (typeKindFnId == null) { |
| 411 | 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 | 556 | function findTypeTypeId() { |
| ... | ... | @@ -500,6 +641,7 @@ |
| 500 | 641 | |
| 501 | 642 | function computeCanonDeclPaths() { |
| 502 | 643 | var list = new Array(zigAnalysis.decls.length); |
| 644 | canonTypeDecls = new Array(zigAnalysis.types.length); |
| 503 | 645 | |
| 504 | 646 | for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) { |
| 505 | 647 | if (pkgI === zigAnalysis.rootPkg && rootIsStd) continue; |
| ... | ... | @@ -518,6 +660,9 @@ |
| 518 | 660 | if (list[mainDeclIndex] != null) continue; |
| 519 | 661 | |
| 520 | 662 | var decl = zigAnalysis.decls[mainDeclIndex]; |
| 663 | if (decl.type === typeTypeId) { |
| 664 | canonTypeDecls[decl.value] = mainDeclIndex; |
| 665 | } |
| 521 | 666 | var declNames = item.declNames.concat([decl.name]); |
| 522 | 667 | list[mainDeclIndex] = { |
| 523 | 668 | pkgNames: pkgNames, |
| ... | ... | @@ -544,12 +689,22 @@ |
| 544 | 689 | return canonDeclPaths[index]; |
| 545 | 690 | } |
| 546 | 691 | |
| 547 | | function markdown(mdText) { |
| 548 | | return mdText.replace(/[&"<>]/g, function (m) { |
| 692 | function getCanonTypeDecl(index) { |
| 693 | getCanonDeclPath(0); |
| 694 | return canonTypeDecls[index]; |
| 695 | } |
| 696 | |
| 697 | function escapeHtml(text) { |
| 698 | return text.replace(/[&"<>]/g, function (m) { |
| 549 | 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 | 708 | function onSearchKeyDown(ev) { |
| 554 | 709 | switch (ev.which) { |
| 555 | 710 | case 13: |