| ... | ... | @@ -33,26 +33,27 @@ |
| 33 | 33 | */ |
| 34 | 34 | |
| 35 | 35 | /** |
| 36 | | * @typedef { |
| 37 | | | { void: {} } |
| 38 | | | { unreachable: {} } |
| 39 | | | { anytype: {} } |
| 40 | | | { type: number } |
| 41 | | | { comptimeExpr: number } |
| 42 | | | { call: number } |
| 43 | | | { int: { typeRef: WalkResult; value: number } } |
| 44 | | | { float: { typeRef: WalkResult; value: number } } |
| 45 | | | { bool: boolean } |
| 46 | | | { undefined: WalkResult } |
| 47 | | | { null: WalkResult } |
| 48 | | | { typeOf: WalkResult } |
| 49 | | | { compileError: string } |
| 50 | | | { string: string } |
| 51 | | | { struct: Struct } |
| 52 | | | { refPath: WalkResult[] } |
| 53 | | | { array: ZigArray } |
| 54 | | | { enumLiteral: string } |
| 55 | | } WalkResult |
| 36 | * @typedef {{ |
| 37 | void: {}, |
| 38 | unreachable: {}, |
| 39 | anytype: {}, |
| 40 | type: number, |
| 41 | comptimeExpr: number, |
| 42 | call: number, |
| 43 | int: { typeRef: WalkResult; value: number }, |
| 44 | float: { typeRef: WalkResult; value: number }, |
| 45 | bool: boolean, |
| 46 | undefined: WalkResult, |
| 47 | null: WalkResult, |
| 48 | typeOf: WalkResult, |
| 49 | compileError: string, |
| 50 | string: string, |
| 51 | struct: Struct, |
| 52 | refPath: WalkResult[], |
| 53 | declRef: number, |
| 54 | array: ZigArray, |
| 55 | enumLiteral: string, |
| 56 | }} WalkResult |
| 56 | 57 | */ |
| 57 | 58 | |
| 58 | 59 | /** |
| ... | ... | @@ -76,16 +77,70 @@ |
| 76 | 77 | }} Fn |
| 77 | 78 | */ |
| 78 | 79 | |
| 80 | /** |
| 81 | * @typedef {{ |
| 82 | kind: number, |
| 83 | name: string, |
| 84 | fields: { name: string, docs: string }[] |
| 85 | fn: number | undefined, |
| 86 | }} ErrSetType |
| 87 | */ |
| 88 | |
| 89 | /** |
| 90 | * @typedef {{ |
| 91 | kind: number, |
| 92 | err: WalkResult, |
| 93 | payload: WalkResult, |
| 94 | }} ErrUnionType |
| 95 | */ |
| 96 | |
| 97 | // Type, Void, Bool, NoReturn, Int, Float, ComptimeExpr, ComptimeFloat, ComptimeInt, Undefined, Null, ErrorUnion, BoundFn, Opaque, Frame, AnyFrame, Vector, EnumLiteral |
| 98 | /** |
| 99 | * @typedef {{ |
| 100 | kind: number, |
| 101 | name: string |
| 102 | }} NumberType |
| 103 | */ |
| 104 | |
| 105 | /** |
| 106 | * @typedef {{ |
| 107 | kind: number, |
| 108 | size: number, |
| 109 | child: WalkResult |
| 110 | align: number, |
| 111 | bitOffsetInHost: number, |
| 112 | hostIntBytes: number, |
| 113 | volatile: boolean, |
| 114 | const: boolean, |
| 115 | }} PointerType |
| 116 | */ |
| 117 | |
| 118 | /** |
| 119 | * @typedef {{ |
| 120 | kind: number, |
| 121 | len: WalkResult |
| 122 | child: WalkResult |
| 123 | }} ArrayType |
| 124 | */ |
| 125 | |
| 126 | /** |
| 127 | * @typedef {{ |
| 128 | kind: number, |
| 129 | name: string, |
| 130 | child: WalkResult |
| 131 | }} OptionalType |
| 132 | */ |
| 79 | 133 | |
| 80 | 134 | /** |
| 81 | 135 | * @typedef { |
| 82 | | | { kind: number, name: string } // Type, Void, Bool, NoReturn, Int, Float, ComptimeExpr, ComptimeFloat, ComptimeInt, Undefined, Null, ErrorUnion, BoundFn, Opaque, Frame, AnyFrame, Vector, EnumLiteral |
| 83 | | | { kind: number, name: string; child: WalkResult } // Optional |
| 84 | | | { kind: number, len: WalkResult; child: WalkResult } // Array |
| 85 | | | { kind: number, name: string; fields: { name: string; docs: string }[] } // ErrorSet |
| 86 | | | { kind: number, size: "One" | "Many" | "Slice" | "C"; child: WalkResult } // Pointer |
| 136 | | OptionalType |
| 137 | | ArrayType |
| 138 | | PointerType |
| 87 | 139 | | ContainerType |
| 88 | 140 | | Fn |
| 141 | | ErrSetType |
| 142 | | ErrUnionType |
| 143 | | NumberType |
| 89 | 144 | } Type |
| 90 | 145 | */ |
| 91 | 146 | |
| ... | ... | @@ -107,6 +162,8 @@ |
| 107 | 162 | docs?: string, |
| 108 | 163 | fields?: number[], |
| 109 | 164 | comptime: boolean, |
| 165 | noalias: boolean, |
| 166 | varArgs: boolean, |
| 110 | 167 | }} AstNode |
| 111 | 168 | */ |
| 112 | 169 | |
| ... | ... | @@ -117,7 +174,7 @@ |
| 117 | 174 | src: number, |
| 118 | 175 | value: WalkResult, |
| 119 | 176 | decltest?: number, |
| 120 | | isTest: bool, |
| 177 | isTest: boolean, |
| 121 | 178 | }} Decl |
| 122 | 179 | */ |
| 123 | 180 | |
| ... | ... | @@ -223,7 +280,7 @@ var zigAnalysis; |
| 223 | 280 | var domSectSearchNoResults = /** @type HTMLElement */(document.getElementById("sectSearchNoResults")); |
| 224 | 281 | var domSectInfo = /** @type HTMLElement */(document.getElementById("sectInfo")); |
| 225 | 282 | var domTdTarget = /** @type HTMLElement */(document.getElementById("tdTarget")); |
| 226 | | var domPrivDeclsBox = /** @type HTMLElement */(document.getElementById("privDeclsBox")); |
| 283 | var domPrivDeclsBox = /** @type HTMLCheckboxElement */(document.getElementById("privDeclsBox")); |
| 227 | 284 | var domTdZigVer = /** @type HTMLElement */(document.getElementById("tdZigVer")); |
| 228 | 285 | var domHdrName = /** @type HTMLElement */(document.getElementById("hdrName")); |
| 229 | 286 | var domHelpModal = /** @type HTMLElement */(document.getElementById("helpDialog")); |
| ... | ... | @@ -252,7 +309,7 @@ var zigAnalysis; |
| 252 | 309 | var canonTypeDecls = null; // lazy; use getCanonTypeDecl |
| 253 | 310 | |
| 254 | 311 | /** @typedef {{ |
| 255 | | * showPrivDecls: bool, |
| 312 | * showPrivDecls: boolean, |
| 256 | 313 | * pkgNames: string[], |
| 257 | 314 | * pkgObjs: Package[], |
| 258 | 315 | * declNames: string[], |
| ... | ... | @@ -598,6 +655,7 @@ var zigAnalysis; |
| 598 | 655 | return typeObj.generic; |
| 599 | 656 | } |
| 600 | 657 | |
| 658 | /** @param {Decl} fnDecl */ |
| 601 | 659 | function renderFn(fnDecl) { |
| 602 | 660 | var value = resolveValue(fnDecl.value); |
| 603 | 661 | console.assert("type" in value); |
| ... | ... | @@ -622,31 +680,32 @@ var zigAnalysis; |
| 622 | 680 | errSetTypeIndex = retType.err; |
| 623 | 681 | } |
| 624 | 682 | if (errSetTypeIndex != null) { |
| 625 | | var errSetType = zigAnalysis.types[errSetTypeIndex]; |
| 683 | var errSetType = /** @type {ErrSetType} */(zigAnalysis.types[errSetTypeIndex]); |
| 626 | 684 | renderErrorSet(errSetType); |
| 627 | 685 | } |
| 628 | 686 | |
| 629 | 687 | var protoSrcIndex = fnDecl.src; |
| 630 | 688 | if (typeIsGenericFn(value.type)) { |
| 631 | | var instantiations = nodesToFnsMap[protoSrcIndex]; |
| 632 | | var calls = nodesToCallsMap[protoSrcIndex]; |
| 633 | | if (instantiations == null && calls == null) { |
| 634 | | domFnNoExamples.classList.remove("hidden"); |
| 635 | | } else if (calls != null) { |
| 636 | | // if (fnObj.combined === undefined) fnObj.combined = allCompTimeFnCallsResult(calls); |
| 637 | | if (fnObj.combined != null) renderContainer(fnObj.combined); |
| 638 | | |
| 639 | | resizeDomList(domListFnExamples, calls.length, '<li></li>'); |
| 640 | | |
| 641 | | for (var callI = 0; callI < calls.length; callI += 1) { |
| 642 | | var liDom = domListFnExamples.children[callI]; |
| 643 | | liDom.innerHTML = getCallHtml(fnDecl, calls[callI]); |
| 644 | | } |
| 645 | | |
| 646 | | domFnExamples.classList.remove("hidden"); |
| 647 | | } else if (instantiations != null) { |
| 648 | | // TODO |
| 649 | | } |
| 689 | throw "TODO"; |
| 690 | // var instantiations = nodesToFnsMap[protoSrcIndex]; |
| 691 | // var calls = nodesToCallsMap[protoSrcIndex]; |
| 692 | // if (instantiations == null && calls == null) { |
| 693 | // domFnNoExamples.classList.remove("hidden"); |
| 694 | // } else if (calls != null) { |
| 695 | // // if (fnObj.combined === undefined) fnObj.combined = allCompTimeFnCallsResult(calls); |
| 696 | // if (fnObj.combined != null) renderContainer(fnObj.combined); |
| 697 | |
| 698 | // resizeDomList(domListFnExamples, calls.length, '<li></li>'); |
| 699 | |
| 700 | // for (var callI = 0; callI < calls.length; callI += 1) { |
| 701 | // var liDom = domListFnExamples.children[callI]; |
| 702 | // liDom.innerHTML = getCallHtml(fnDecl, calls[callI]); |
| 703 | // } |
| 704 | |
| 705 | // domFnExamples.classList.remove("hidden"); |
| 706 | // } else if (instantiations != null) { |
| 707 | // // TODO |
| 708 | // } |
| 650 | 709 | } else { |
| 651 | 710 | |
| 652 | 711 | domFnExamples.classList.add("hidden"); |
| ... | ... | @@ -664,11 +723,15 @@ var zigAnalysis; |
| 664 | 723 | domFnProto.classList.remove("hidden"); |
| 665 | 724 | } |
| 666 | 725 | |
| 726 | /** |
| 727 | * @param {Decl} fnDecl |
| 728 | * @param {Fn} typeObj |
| 729 | */ |
| 667 | 730 | function renderFnParamDocs(fnDecl, typeObj) { |
| 668 | 731 | var docCount = 0; |
| 669 | 732 | |
| 670 | 733 | var fnNode = zigAnalysis.astNodes[fnDecl.src]; |
| 671 | | var fields = fnNode.fields; |
| 734 | var fields = /** @type {number[]} */(fnNode.fields); |
| 672 | 735 | var isVarArgs = fnNode.varArgs; |
| 673 | 736 | |
| 674 | 737 | for (var i = 0; i < fields.length; i += 1) { |
| ... | ... | @@ -696,11 +759,11 @@ var zigAnalysis; |
| 696 | 759 | |
| 697 | 760 | |
| 698 | 761 | var value = typeObj.params[i]; |
| 699 | | var html = '<pre>' + escapeHtml(fieldNode.name) + ": "; |
| 762 | var html = '<pre>' + escapeHtml(/** @type {string} */(fieldNode.name)) + ": "; |
| 700 | 763 | if (isVarArgs && i === typeObj.params.length - 1) { |
| 701 | 764 | html += '...'; |
| 702 | 765 | } else { |
| 703 | | var name = typeValueName(value); |
| 766 | var name = typeValueName(value, false, false); |
| 704 | 767 | html += '<span class="tok-kw">' + name + '</span>'; |
| 705 | 768 | } |
| 706 | 769 | |
| ... | ... | @@ -720,7 +783,7 @@ var zigAnalysis; |
| 720 | 783 | resizeDomList(domListNav, len, '<li><a href="#"></a></li>'); |
| 721 | 784 | var list = []; |
| 722 | 785 | var hrefPkgNames = []; |
| 723 | | var hrefDeclNames = []; |
| 786 | var hrefDeclNames = /** @type {string[]} */([]); |
| 724 | 787 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| 725 | 788 | hrefPkgNames.push(curNav.pkgNames[i]); |
| 726 | 789 | list.push({ |
| ... | ... | @@ -753,7 +816,7 @@ var zigAnalysis; |
| 753 | 816 | |
| 754 | 817 | function renderInfo() { |
| 755 | 818 | domTdZigVer.textContent = zigAnalysis.params.zigVersion; |
| 756 | | domTdTarget.textContent = zigAnalysis.params.builds[0].target; |
| 819 | //domTdTarget.textContent = zigAnalysis.params.builds[0].target; |
| 757 | 820 | |
| 758 | 821 | domSectInfo.classList.remove("hidden"); |
| 759 | 822 | } |
| ... | ... | @@ -809,6 +872,12 @@ var zigAnalysis; |
| 809 | 872 | } |
| 810 | 873 | } |
| 811 | 874 | |
| 875 | /** |
| 876 | * @param {string[]} pkgNames |
| 877 | * @param {string[]} declNames |
| 878 | * @param {string} [callName] |
| 879 | */ |
| 880 | |
| 812 | 881 | function navLink(pkgNames, declNames, callName) { |
| 813 | 882 | let base = '#'; |
| 814 | 883 | if (curNav.showPrivDecls) { |
| ... | ... | @@ -826,23 +895,26 @@ var zigAnalysis; |
| 826 | 895 | } |
| 827 | 896 | } |
| 828 | 897 | |
| 898 | /** @param {number} pkgIndex */ |
| 829 | 899 | function navLinkPkg(pkgIndex) { |
| 830 | 900 | return navLink(canonPkgPaths[pkgIndex], []); |
| 831 | 901 | } |
| 832 | 902 | |
| 903 | /** @param {string} childName */ |
| 833 | 904 | function navLinkDecl(childName) { |
| 834 | 905 | return navLink(curNav.pkgNames, curNav.declNames.concat([childName])); |
| 835 | 906 | } |
| 836 | 907 | |
| 908 | /** @param {Call} callObj */ |
| 837 | 909 | function navLinkCall(callObj) { |
| 838 | 910 | var declNamesCopy = curNav.declNames.concat([]); |
| 839 | | var callName = declNamesCopy.pop(); |
| 911 | var callName = /** @type {string} */(declNamesCopy.pop()); |
| 840 | 912 | |
| 841 | 913 | callName += '('; |
| 842 | 914 | for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) { |
| 843 | 915 | if (arg_i !== 0) callName += ','; |
| 844 | 916 | var argObj = callObj.args[arg_i]; |
| 845 | | callName += getValueText(argObj.type, argObj.value, false, false); |
| 917 | callName += getValueText(argObj, argObj, false, false); |
| 846 | 918 | } |
| 847 | 919 | callName += ')'; |
| 848 | 920 | |
| ... | ... | @@ -850,6 +922,10 @@ var zigAnalysis; |
| 850 | 922 | return navLink(curNav.pkgNames, declNamesCopy); |
| 851 | 923 | } |
| 852 | 924 | |
| 925 | /** |
| 926 | * @param {any} dlDom |
| 927 | * @param {number} desiredLen |
| 928 | */ |
| 853 | 929 | function resizeDomListDl(dlDom, desiredLen) { |
| 854 | 930 | // add the missing dom entries |
| 855 | 931 | var i, ev; |
| ... | ... | @@ -863,6 +939,11 @@ var zigAnalysis; |
| 863 | 939 | } |
| 864 | 940 | } |
| 865 | 941 | |
| 942 | /** |
| 943 | * @param {any} listDom |
| 944 | * @param {number} desiredLen |
| 945 | * @param {string} templateHtml |
| 946 | */ |
| 866 | 947 | function resizeDomList(listDom, desiredLen, templateHtml) { |
| 867 | 948 | // add the missing dom entries |
| 868 | 949 | var i, ev; |
| ... | ... | @@ -879,14 +960,14 @@ var zigAnalysis; |
| 879 | 960 | * @param {WalkResult} typeValue, |
| 880 | 961 | * @param {boolean} wantHtml, |
| 881 | 962 | * @param {boolean} wantLink, |
| 882 | | * @param {number} [fnDecl], |
| 963 | * @param {Decl | null} [fnDecl], |
| 883 | 964 | * @param {string} [linkFnNameDecl], |
| 884 | 965 | * @return {string} |
| 885 | 966 | */ |
| 886 | 967 | function typeValueName(typeValue, wantHtml, wantLink, fnDecl, linkFnNameDecl) { |
| 887 | 968 | |
| 888 | 969 | if ("int" in typeValue) { |
| 889 | | return typeValue.int.value; |
| 970 | return "" + typeValue.int.value; |
| 890 | 971 | } |
| 891 | 972 | if ("call" in typeValue) { |
| 892 | 973 | var result = ""; |
| ... | ... | @@ -963,38 +1044,51 @@ var zigAnalysis; |
| 963 | 1044 | } |
| 964 | 1045 | } |
| 965 | 1046 | |
| 1047 | /** |
| 1048 | * @param {WalkResult} typeRef |
| 1049 | * @param {string} paramName |
| 1050 | */ |
| 966 | 1051 | function shouldSkipParamName(typeRef, paramName) { |
| 967 | 1052 | var resolvedTypeRef = resolveValue(typeRef); |
| 968 | 1053 | if ("type" in resolvedTypeRef) { |
| 969 | 1054 | var typeObj = zigAnalysis.types[resolvedTypeRef.type]; |
| 970 | | if (typeObj.kind === typeKinds.Pointer && |
| 971 | | getPtrSize(typeObj) === pointerSizeEnum.One) { |
| 972 | | const value = resolveValue(typeObj.child); |
| 973 | | return typeValueName(value, false, true).toLowerCase() === paramName; |
| 1055 | if (typeObj.kind === typeKinds.Pointer){ |
| 1056 | let ptrObj = /** @type {PointerType} */(typeObj); |
| 1057 | if (getPtrSize(ptrObj) === pointerSizeEnum.One) { |
| 1058 | const value = resolveValue(ptrObj.child); |
| 1059 | return typeValueName(value, false, true).toLowerCase() === paramName; |
| 1060 | } |
| 974 | 1061 | } |
| 975 | 1062 | } |
| 976 | 1063 | return false; |
| 977 | 1064 | } |
| 978 | 1065 | |
| 1066 | /** @param {PointerType} typeObj */ |
| 979 | 1067 | function getPtrSize(typeObj) { |
| 980 | | return (typeObj.len == null) ? pointerSizeEnum.One : typeObj.len; |
| 1068 | return (typeObj.size == null) ? pointerSizeEnum.One : typeObj.size; |
| 981 | 1069 | } |
| 982 | 1070 | |
| 983 | | function getCallHtml(fnDecl, callIndex) { |
| 984 | | var callObj = zigAnalysis.calls[callIndex]; |
| 985 | | |
| 986 | | // TODO make these links work |
| 987 | | //var html = '<a href="' + navLinkCall(callObj) + '">' + escapeHtml(fnDecl.name) + '</a>('; |
| 988 | | var html = escapeHtml(fnDecl.name) + '('; |
| 989 | | for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) { |
| 990 | | if (arg_i !== 0) html += ', '; |
| 991 | | var argObj = callObj.args[arg_i]; |
| 992 | | html += getValueText(argObj, argObj.value, true, true); |
| 993 | | } |
| 994 | | html += ')'; |
| 995 | | return html; |
| 996 | | } |
| 1071 | // function getCallHtml(fnDecl, callIndex) { |
| 1072 | // var callObj = zigAnalysis.calls[callIndex]; |
| 1073 | |
| 1074 | // // TODO make these links work |
| 1075 | // //var html = '<a href="' + navLinkCall(callObj) + '">' + escapeHtml(fnDecl.name) + '</a>('; |
| 1076 | // var html = escapeHtml(fnDecl.name) + '('; |
| 1077 | // for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) { |
| 1078 | // if (arg_i !== 0) html += ', '; |
| 1079 | // var argObj = callObj.args[arg_i]; |
| 1080 | // html += getValueText(argObj, argObj.value, true, true); |
| 1081 | // } |
| 1082 | // html += ')'; |
| 1083 | // return html; |
| 1084 | // } |
| 997 | 1085 | |
| 1086 | /** |
| 1087 | * @param {WalkResult} typeRef |
| 1088 | * @param {any} value |
| 1089 | * @param {boolean} wantHtml |
| 1090 | * @param {boolean} wantLink |
| 1091 | */ |
| 998 | 1092 | function getValueText(typeRef, value, wantHtml, wantLink) { |
| 999 | 1093 | var resolvedTypeRef = resolveValue(typeRef); |
| 1000 | 1094 | if ("comptimeExpr" in resolvedTypeRef) { |
| ... | ... | @@ -1004,10 +1098,10 @@ var zigAnalysis; |
| 1004 | 1098 | var typeObj = zigAnalysis.types[typeRef.type]; |
| 1005 | 1099 | switch (typeObj.kind) { |
| 1006 | 1100 | case typeKinds.Type: |
| 1007 | | return typeIndexName(value, wantHtml, wantLink); |
| 1101 | return typeValueName(value, wantHtml, wantLink); |
| 1008 | 1102 | case typeKinds.Fn: |
| 1009 | 1103 | var fnObj = zigAnalysis.fns[value]; |
| 1010 | | return typeValueName(fnObj, wantHtml, wantLink); |
| 1104 | return typeName(fnObj, wantHtml, wantLink); |
| 1011 | 1105 | case typeKinds.Int: |
| 1012 | 1106 | if (wantHtml) { |
| 1013 | 1107 | return '<span class="tok-number">' + value + '</span>'; |
| ... | ... | @@ -1023,29 +1117,34 @@ var zigAnalysis; |
| 1023 | 1117 | * @param {Type} typeObj, |
| 1024 | 1118 | * @param {boolean} wantHtml, |
| 1025 | 1119 | * @param {boolean} wantSubLink, |
| 1026 | | * @param {number} [fnDecl], |
| 1120 | * @param {Decl | null} [fnDecl], |
| 1027 | 1121 | * @param {string} [linkFnNameDecl], |
| 1028 | 1122 | * @return {string} |
| 1029 | 1123 | */ |
| 1030 | 1124 | function typeName(typeObj, wantHtml, wantSubLink, fnDecl, linkFnNameDecl) { |
| 1031 | 1125 | switch (typeObj.kind) { |
| 1032 | 1126 | case typeKinds.Array: |
| 1127 | { |
| 1128 | let arrayObj = /** @type {ArrayType} */(typeObj); |
| 1033 | 1129 | var name = "["; |
| 1034 | | var lenName = typeValueName(typeObj.len, wantHtml); |
| 1130 | var lenName = typeValueName(arrayObj.len, wantHtml, wantSubLink); |
| 1035 | 1131 | if (wantHtml) { |
| 1036 | 1132 | name += '<span class="tok-number">' + lenName + '</span>'; |
| 1037 | 1133 | } else { |
| 1038 | 1134 | name += lenName; |
| 1039 | 1135 | } |
| 1040 | 1136 | name += "]"; |
| 1041 | | name += typeValueName(typeObj.child, wantHtml, wantSubLink, null); |
| 1137 | name += typeValueName(arrayObj.child, wantHtml, wantSubLink, null); |
| 1042 | 1138 | return name; |
| 1139 | } |
| 1043 | 1140 | case typeKinds.Optional: |
| 1044 | 1141 | |
| 1045 | | return "?" + typeValueName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl); |
| 1142 | return "?" + typeValueName(/**@type {OptionalType} */(typeObj).child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl); |
| 1046 | 1143 | case typeKinds.Pointer: |
| 1047 | | var name = ""; |
| 1048 | | switch (typeObj.size) { |
| 1144 | { |
| 1145 | let ptrObj = /** @type {PointerType} */(typeObj); |
| 1146 | var name = ""; |
| 1147 | switch (ptrObj.size) { |
| 1049 | 1148 | default: |
| 1050 | 1149 | console.log("TODO: implement unhandled pointer size case"); |
| 1051 | 1150 | case pointerSizeEnum.One: |
| ... | ... | @@ -1061,62 +1160,70 @@ var zigAnalysis; |
| 1061 | 1160 | name += "[*c]"; |
| 1062 | 1161 | break; |
| 1063 | 1162 | } |
| 1064 | | if (typeObj['const']) { |
| 1163 | if (ptrObj['const']) { |
| 1065 | 1164 | if (wantHtml) { |
| 1066 | 1165 | name += '<span class="tok-kw">const</span> '; |
| 1067 | 1166 | } else { |
| 1068 | 1167 | name += "const "; |
| 1069 | 1168 | } |
| 1070 | 1169 | } |
| 1071 | | if (typeObj['volatile']) { |
| 1170 | if (ptrObj['volatile']) { |
| 1072 | 1171 | if (wantHtml) { |
| 1073 | 1172 | name += '<span class="tok-kw">volatile</span> '; |
| 1074 | 1173 | } else { |
| 1075 | 1174 | name += "volatile "; |
| 1076 | 1175 | } |
| 1077 | 1176 | } |
| 1078 | | if (typeObj.align != null) { |
| 1177 | if (ptrObj.align != null) { |
| 1079 | 1178 | if (wantHtml) { |
| 1080 | 1179 | name += '<span class="tok-kw">align</span>('; |
| 1081 | 1180 | } else { |
| 1082 | 1181 | name += "align("; |
| 1083 | 1182 | } |
| 1084 | 1183 | if (wantHtml) { |
| 1085 | | name += '<span class="tok-number">' + typeObj.align + '</span>'; |
| 1184 | name += '<span class="tok-number">' + ptrObj.align + '</span>'; |
| 1086 | 1185 | } else { |
| 1087 | | name += typeObj.align; |
| 1186 | name += ptrObj.align; |
| 1088 | 1187 | } |
| 1089 | | if (typeObj.hostIntBytes != null) { |
| 1188 | if (ptrObj.hostIntBytes != null) { |
| 1090 | 1189 | name += ":"; |
| 1091 | 1190 | if (wantHtml) { |
| 1092 | | name += '<span class="tok-number">' + typeObj.bitOffsetInHost + '</span>'; |
| 1191 | name += '<span class="tok-number">' + ptrObj.bitOffsetInHost + '</span>'; |
| 1093 | 1192 | } else { |
| 1094 | | name += typeObj.bitOffsetInHost; |
| 1193 | name += ptrObj.bitOffsetInHost; |
| 1095 | 1194 | } |
| 1096 | 1195 | name += ":"; |
| 1097 | 1196 | if (wantHtml) { |
| 1098 | | name += '<span class="tok-number">' + typeObj.hostIntBytes + '</span>'; |
| 1197 | name += '<span class="tok-number">' + ptrObj.hostIntBytes + '</span>'; |
| 1099 | 1198 | } else { |
| 1100 | | name += typeObj.hostIntBytes; |
| 1199 | name += ptrObj.hostIntBytes; |
| 1101 | 1200 | } |
| 1102 | 1201 | } |
| 1103 | 1202 | name += ") "; |
| 1104 | 1203 | } |
| 1105 | | name += typeValueName(typeObj.child, wantHtml, wantSubLink, null); |
| 1204 | name += typeValueName(ptrObj.child, wantHtml, wantSubLink, null); |
| 1106 | 1205 | return name; |
| 1206 | } |
| 1107 | 1207 | case typeKinds.Float: |
| 1208 | { |
| 1209 | let floatObj = /** @type {NumberType} */ (typeObj); |
| 1210 | |
| 1108 | 1211 | if (wantHtml) { |
| 1109 | | return '<span class="tok-type">f' + typeObj.bits + '</span>'; |
| 1212 | return '<span class="tok-type">' + floatObj.name + '</span>'; |
| 1110 | 1213 | } else { |
| 1111 | | return "f" + typeObj.bits; |
| 1214 | return floatObj.name; |
| 1112 | 1215 | } |
| 1216 | } |
| 1113 | 1217 | case typeKinds.Int: |
| 1114 | | var name = typeObj.name; |
| 1218 | { |
| 1219 | let intObj = /** @type {NumberType} */(typeObj); |
| 1220 | var name = intObj.name; |
| 1115 | 1221 | if (wantHtml) { |
| 1116 | 1222 | return '<span class="tok-type">' + name + '</span>'; |
| 1117 | 1223 | } else { |
| 1118 | 1224 | return name; |
| 1119 | 1225 | } |
| 1226 | } |
| 1120 | 1227 | case typeKinds.ComptimeInt: |
| 1121 | 1228 | if (wantHtml) { |
| 1122 | 1229 | return '<span class="tok-type">comptime_int</span>'; |
| ... | ... | @@ -1160,29 +1267,41 @@ var zigAnalysis; |
| 1160 | 1267 | return "noreturn"; |
| 1161 | 1268 | } |
| 1162 | 1269 | case typeKinds.ErrorSet: |
| 1163 | | if (typeObj.errors == null) { |
| 1270 | { |
| 1271 | let errSetObj = /** @type {ErrSetType} */(typeObj); |
| 1272 | if (errSetObj.fields == null) { |
| 1164 | 1273 | if (wantHtml) { |
| 1165 | 1274 | return '<span class="tok-type">anyerror</span>'; |
| 1166 | 1275 | } else { |
| 1167 | 1276 | return "anyerror"; |
| 1168 | 1277 | } |
| 1169 | 1278 | } else { |
| 1170 | | if (wantHtml) { |
| 1171 | | return escapeHtml(typeObj.name); |
| 1172 | | } else { |
| 1173 | | return typeObj.name; |
| 1174 | | } |
| 1279 | throw "TODO"; |
| 1280 | // if (wantHtml) { |
| 1281 | // return escapeHtml(typeObj.name); |
| 1282 | // } else { |
| 1283 | // return typeObj.name; |
| 1284 | // } |
| 1175 | 1285 | } |
| 1286 | } |
| 1176 | 1287 | case typeKinds.ErrorUnion: |
| 1177 | | var errSetTypeObj = zigAnalysis.types[typeObj.err]; |
| 1178 | | var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null); |
| 1179 | | if (fnDecl != null && errSetTypeObj.fn === fnDecl.value) { |
| 1180 | | // function index parameter supplied and this is the inferred error set of it |
| 1181 | | return "!" + payloadHtml; |
| 1182 | | } else { |
| 1183 | | return typeIndexName(typeObj.err, wantHtml, wantSubLink, null) + "!" + payloadHtml; |
| 1184 | | } |
| 1288 | { |
| 1289 | throw "TODO"; |
| 1290 | // TODO: implement error union printing assuming that both |
| 1291 | // payload and error union are walk results! |
| 1292 | // let errUnionObj = /** @type {ErrUnionType} */(typeObj); |
| 1293 | // var errSetTypeObj = /** @type {ErrSetType} */ (zigAnalysis.types[errUnionObj.err]); |
| 1294 | // var payloadHtml = typeValueName(errUnionObj.payload, wantHtml, wantSubLink, null); |
| 1295 | // if (fnDecl != null && errSetTypeObj.fn === fnDecl.value.type) { |
| 1296 | // // function index parameter supplied and this is the inferred error set of it |
| 1297 | // return "!" + payloadHtml; |
| 1298 | // } else { |
| 1299 | // return typeValueName(errUnionObj.err, wantHtml, wantSubLink, null) + "!" + payloadHtml; |
| 1300 | // } |
| 1301 | } |
| 1185 | 1302 | case typeKinds.Fn: |
| 1303 | { |
| 1304 | let fnObj = /** @type {Fn} */(typeObj); |
| 1186 | 1305 | var payloadHtml = ""; |
| 1187 | 1306 | if (wantHtml) { |
| 1188 | 1307 | payloadHtml += '<span class="tok-kw">fn</span>'; |
| ... | ... | @@ -1200,19 +1319,19 @@ var zigAnalysis; |
| 1200 | 1319 | payloadHtml += 'fn' |
| 1201 | 1320 | } |
| 1202 | 1321 | payloadHtml += '('; |
| 1203 | | if (typeObj.params) { |
| 1322 | if (fnObj.params) { |
| 1204 | 1323 | var fields = null; |
| 1205 | 1324 | var isVarArgs = false; |
| 1206 | | var fnNode = zigAnalysis.astNodes[typeObj.src]; |
| 1325 | var fnNode = zigAnalysis.astNodes[fnObj.src]; |
| 1207 | 1326 | fields = fnNode.fields; |
| 1208 | 1327 | isVarArgs = fnNode.varArgs; |
| 1209 | 1328 | |
| 1210 | | for (var i = 0; i < typeObj.params.length; i += 1) { |
| 1329 | for (var i = 0; i < fnObj.params.length; i += 1) { |
| 1211 | 1330 | if (i != 0) { |
| 1212 | 1331 | payloadHtml += ', '; |
| 1213 | 1332 | } |
| 1214 | 1333 | |
| 1215 | | var value = typeObj.params[i]; |
| 1334 | var value = fnObj.params[i]; |
| 1216 | 1335 | var paramValue = resolveValue(value); |
| 1217 | 1336 | var isCte = "comptimeExpr" in paramValue; |
| 1218 | 1337 | |
| ... | ... | @@ -1249,7 +1368,7 @@ var zigAnalysis; |
| 1249 | 1368 | } |
| 1250 | 1369 | } |
| 1251 | 1370 | |
| 1252 | | if (isVarArgs && i === typeObj.params.length - 1) { |
| 1371 | if (isVarArgs && i === fnObj.params.length - 1) { |
| 1253 | 1372 | payloadHtml += '...'; |
| 1254 | 1373 | } else if ("refPath" in value) { |
| 1255 | 1374 | payloadHtml += '<a href="">'; |
| ... | ... | @@ -1257,7 +1376,7 @@ var zigAnalysis; |
| 1257 | 1376 | payloadHtml += '</a>'; |
| 1258 | 1377 | |
| 1259 | 1378 | } else if ("type" in value) { |
| 1260 | | var name = typeValueName(value, false); |
| 1379 | var name = typeValueName(value, wantHtml, wantSubLink, fnDecl, linkFnNameDecl); |
| 1261 | 1380 | payloadHtml += '<span class="tok-kw">' + escapeHtml(name) + '</span>'; |
| 1262 | 1381 | } else if ("comptimeExpr" in value) { |
| 1263 | 1382 | payloadHtml += '<span class="tok-kw">[ComptimeExpr]</span>'; |
| ... | ... | @@ -1270,23 +1389,26 @@ var zigAnalysis; |
| 1270 | 1389 | } |
| 1271 | 1390 | |
| 1272 | 1391 | payloadHtml += ') '; |
| 1273 | | if (typeObj.ret != null) { |
| 1274 | | payloadHtml += typeValueName(typeObj.ret, wantHtml, wantSubLink, fnDecl); |
| 1392 | if (fnObj.ret != null) { |
| 1393 | payloadHtml += typeValueName(fnObj.ret, wantHtml, wantSubLink, fnDecl); |
| 1275 | 1394 | } else if (wantHtml) { |
| 1276 | 1395 | payloadHtml += '<span class="tok-kw">anytype</span>'; |
| 1277 | 1396 | } else { |
| 1278 | 1397 | payloadHtml += 'anytype'; |
| 1279 | 1398 | } |
| 1280 | 1399 | return payloadHtml; |
| 1400 | } |
| 1281 | 1401 | default: |
| 1282 | | if (wantHtml) { |
| 1283 | | return escapeHtml(typeObj.name); |
| 1284 | | } else { |
| 1285 | | return typeObj.name; |
| 1286 | | } |
| 1402 | throw "TODO"; |
| 1403 | // if (wantHtml) { |
| 1404 | // return escapeHtml(typeObj.name); |
| 1405 | // } else { |
| 1406 | // return typeObj.name; |
| 1407 | // } |
| 1287 | 1408 | } |
| 1288 | 1409 | } |
| 1289 | 1410 | |
| 1411 | /** @param {Type} typeObj */ |
| 1290 | 1412 | function renderType(typeObj) { |
| 1291 | 1413 | var name; |
| 1292 | 1414 | if (rootIsStd && typeObj === zigAnalysis.types[zigAnalysis.packages[zigAnalysis.rootPkg].main]) { |
| ... | ... | @@ -1299,32 +1421,30 @@ var zigAnalysis; |
| 1299 | 1421 | domHdrName.classList.remove("hidden"); |
| 1300 | 1422 | } |
| 1301 | 1423 | if (typeObj.kind == typeKinds.ErrorSet) { |
| 1302 | | renderErrorSet(typeObj); |
| 1424 | renderErrorSet(/** @type {ErrSetType} */(typeObj)); |
| 1303 | 1425 | } |
| 1304 | 1426 | } |
| 1305 | 1427 | |
| 1428 | /** @param {ErrSetType} errSetType */ |
| 1306 | 1429 | function renderErrorSet(errSetType) { |
| 1307 | | if (errSetType.errors == null) { |
| 1430 | if (errSetType.fields == null) { |
| 1308 | 1431 | domFnErrorsAnyError.classList.remove("hidden"); |
| 1309 | 1432 | } else { |
| 1310 | 1433 | var errorList = []; |
| 1311 | | for (var i = 0; i < errSetType.errors.length; i += 1) { |
| 1312 | | var errObj = zigAnalysis.errors[errSetType.errors[i]]; |
| 1313 | | var srcObj = zigAnalysis.astNodes[errObj.src]; |
| 1314 | | errorList.push({ |
| 1315 | | err: errObj, |
| 1316 | | docs: srcObj.docs, |
| 1317 | | }); |
| 1434 | for (var i = 0; i < errSetType.fields.length; i += 1) { |
| 1435 | var errObj = errSetType.fields[i]; |
| 1436 | //var srcObj = zigAnalysis.astNodes[errObj.src]; |
| 1437 | errorList.push(errObj); |
| 1318 | 1438 | } |
| 1319 | 1439 | errorList.sort(function(a, b) { |
| 1320 | | return operatorCompare(a.err.name.toLowerCase(), b.err.name.toLowerCase()); |
| 1440 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 1321 | 1441 | }); |
| 1322 | 1442 | |
| 1323 | 1443 | resizeDomListDl(domListFnErrors, errorList.length); |
| 1324 | 1444 | for (var i = 0; i < errorList.length; i += 1) { |
| 1325 | 1445 | var nameTdDom = domListFnErrors.children[i * 2 + 0]; |
| 1326 | 1446 | var descTdDom = domListFnErrors.children[i * 2 + 1]; |
| 1327 | | nameTdDom.textContent = errorList[i].err.name; |
| 1447 | nameTdDom.textContent = errorList[i].name; |
| 1328 | 1448 | var docs = errorList[i].docs; |
| 1329 | 1449 | if (docs != null) { |
| 1330 | 1450 | descTdDom.innerHTML = markdown(docs); |
| ... | ... | @@ -1517,7 +1637,7 @@ var zigAnalysis; |
| 1517 | 1637 | let fDecl = resolveValue(c.func); |
| 1518 | 1638 | if ("type" in fDecl) { |
| 1519 | 1639 | console.assert("type" in fDecl); |
| 1520 | | let fType = zigAnalysis.types[fDecl.type]; |
| 1640 | let fType = /** @type {Fn} */(zigAnalysis.types[fDecl.type]); |
| 1521 | 1641 | console.assert("type" in fType.ret); |
| 1522 | 1642 | if (fType.ret.type === typeTypeId) { |
| 1523 | 1643 | typesList.push(decl); |
| ... | ... | @@ -1671,7 +1791,7 @@ var zigAnalysis; |
| 1671 | 1791 | } else { |
| 1672 | 1792 | var field = container.fields[i]; |
| 1673 | 1793 | html += ": "; |
| 1674 | | var name = typeValueName(field); |
| 1794 | var name = typeValueName(field, false, false); |
| 1675 | 1795 | html += '<span class="tok-kw">'+ name +'</span>'; |
| 1676 | 1796 | } |
| 1677 | 1797 | |