authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2022-02-10 19:30:04+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-19 19:10:10-07:00
log564d6c4960018020913d3a2883cdd028f841af20
tree1e4465756c1942776a26ad502db92e00572163b5
parentb296f5ac023517a4cbf31abdab52cabcc2d3c1e7

autodocs: improve function rendering


1 files changed, 210 insertions(+), 165 deletions(-)

lib/docs/main.js+210-165
...@@ -118,6 +118,20 @@...@@ -118,6 +118,20 @@
118 function declContainsType(x){118 function declContainsType(x){
119 console.assert("value" in x);119 console.assert("value" in x);
120120
121
122 }
123
124 function typeShorthandName(type) {
125 var name = type.name;
126 if (type.kind === typeKinds.Struct) {
127 name = "struct";
128 } else if (type.kind === typeKinds.Enum) {
129 name = "enum";
130 } else if (type.kind === typeKinds.Union) {
131 name= "union";
132 }
133
134 return name
121 }135 }
122136
123 function typeKindIsContainer(typeKind) {137 function typeKindIsContainer(typeKind) {
...@@ -169,7 +183,7 @@...@@ -169,7 +183,7 @@
169 }183 }
170184
171 if ("struct" in decl.value) {185 if ("struct" in decl.value) {
172 return resolveTypeRefToTypeId(decl.value.struct.typeRef);186 return resolveTypeRefToTypeId(decl.value.struct.typeRef);
173 }187 }
174188
175 console.log("TODO: handle in `resolveDeclValueTypeId` more cases: ", decl);189 console.log("TODO: handle in `resolveDeclValueTypeId` more cases: ", decl);
...@@ -251,7 +265,7 @@...@@ -251,7 +265,7 @@
251265
252 var childDeclValue = resolveValue(childDecl.value);266 var childDeclValue = resolveValue(childDecl.value);
253 if ("type" in childDeclValue &&267 if ("type" in childDeclValue &&
254 zigAnalysis.types[childDeclValue.type].kind !== typeKinds.Fn){268 zigAnalysis.types[childDeclValue.type].kind !== typeKinds.Fn){
255 if (i + 1 === curNav.declNames.length) {269 if (i + 1 === curNav.declNames.length) {
256 curNav.declObjs.push(zigAnalysis.types[childDeclValue.type]);270 curNav.declObjs.push(zigAnalysis.types[childDeclValue.type]);
257 break;271 break;
...@@ -416,12 +430,29 @@...@@ -416,12 +430,29 @@
416 }430 }
417 var divDom = domListParams.children[domIndex];431 var divDom = domListParams.children[domIndex];
418 domIndex += 1;432 domIndex += 1;
419 var value = resolveValue(typeObj.params[i]);433
420 console.assert("type" in value);434
421 var argTypeIndex = value.type;435 var value = typeObj.params[i];
436 var valueType = resolveValue(value);
437 console.assert("type" in valueType);
438 var argTypeIndex = valueType.type;
422 var html = '<pre>' + escapeHtml(fieldNode.name) + ": ";439 var html = '<pre>' + escapeHtml(fieldNode.name) + ": ";
423 if (isVarArgs && i === typeObj.params.length - 1) {440 if (isVarArgs && i === typeObj.params.length - 1) {
424 html += '...';441 html += '...';
442 } else if ("declRef" in value) {
443 var decl = zigAnalysis.decls[value.declRef];
444 var val = resolveValue(decl.value);
445 var valType = zigAnalysis.types[argTypeIndex];
446
447 var valTypeName = typeShorthandName(valType);
448
449 html += '<a href="'+navLinkDecl(decl.name)+'">';
450 html += '<span class="tok-kw" style="color:lightblue;">' + decl.name + '</span>';
451 html += '</a>';
452 html += ' ('+ valTypeName +')';
453 } else if ("type" in value) {
454 var name = zigAnalysis.types[value.type].name;
455 html += '<span class="tok-kw">' + name + '</span>';
425 } else if (argTypeIndex != null) {456 } else if (argTypeIndex != null) {
426 html += typeIndexName(argTypeIndex, true, true);457 html += typeIndexName(argTypeIndex, true, true);
427 } else {458 } else {
...@@ -558,12 +589,12 @@...@@ -558,12 +589,12 @@
558 var callName = declNamesCopy.pop();589 var callName = declNamesCopy.pop();
559590
560 callName += '(';591 callName += '(';
561 for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {592 for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {
562 if (arg_i !== 0) callName += ',';593 if (arg_i !== 0) callName += ',';
563 var argObj = callObj.args[arg_i];594 var argObj = callObj.args[arg_i];
564 callName += getValueText(argObj.type, argObj.value, false, false);595 callName += getValueText(argObj.type, argObj.value, false, false);
565 }596 }
566 callName += ')';597 callName += ')';
567598
568 declNamesCopy.push(callName);599 declNamesCopy.push(callName);
569 return navLink(curNav.pkgNames, declNamesCopy);600 return navLink(curNav.pkgNames, declNamesCopy);
...@@ -633,15 +664,15 @@...@@ -633,15 +664,15 @@
633664
634 // TODO make these links work665 // TODO make these links work
635 //var html = '<a href="' + navLinkCall(callObj) + '">' + escapeHtml(fnDecl.name) + '</a>(';666 //var html = '<a href="' + navLinkCall(callObj) + '">' + escapeHtml(fnDecl.name) + '</a>(';
636 var html = escapeHtml(fnDecl.name) + '(';667 var html = escapeHtml(fnDecl.name) + '(';
637 for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {668 for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) {
638 if (arg_i !== 0) html += ', ';669 if (arg_i !== 0) html += ', ';
639 var argObj = callObj.args[arg_i];670 var argObj = callObj.args[arg_i];
640 html += getValueText(argObj.type, argObj.value, true, true);671 html += getValueText(argObj.type, argObj.value, true, true);
672 }
673 html += ')';
674 return html;
641 }675 }
642 html += ')';
643 return html;
644 }
645676
646 function getValueText(typeIndex, value, wantHtml, wantLink) {677 function getValueText(typeIndex, value, wantHtml, wantLink) {
647 var typeObj = zigAnalysis.types[typeIndex];678 var typeObj = zigAnalysis.types[typeIndex];
...@@ -677,7 +708,7 @@...@@ -677,7 +708,7 @@
677 case typeKinds.Optional:708 case typeKinds.Optional:
678 return "?" + typeIndexName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl);709 return "?" + typeIndexName(typeObj.child, wantHtml, wantSubLink, fnDecl, linkFnNameDecl);
679 case typeKinds.Pointer:710 case typeKinds.Pointer:
680 var name = "";711 var name = "";
681 switch (typeObj.len) {712 switch (typeObj.len) {
682 case pointerSizeEnum.One:713 case pointerSizeEnum.One:
683 default:714 default:
...@@ -832,72 +863,86 @@...@@ -832,72 +863,86 @@
832 payloadHtml += 'fn'863 payloadHtml += 'fn'
833 }864 }
834 payloadHtml += '(';865 payloadHtml += '(';
835 if (typeObj.params) {866 if (typeObj.params) {
836 var fields = null;867 var fields = null;
837 var isVarArgs = false;868 var isVarArgs = false;
838 var fnNode = zigAnalysis.astNodes[fnDecl.src];869 var fnNode = zigAnalysis.astNodes[fnDecl.src];
839 fields = fnNode.fields;870 fields = fnNode.fields;
840 isVarArgs = fnNode.varArgs;871 isVarArgs = fnNode.varArgs;
841872
842 for (var i = 0; i < typeObj.params.length; i += 1) {873 for (var i = 0; i < typeObj.params.length; i += 1) {
843 if (i != 0) {874 if (i != 0) {
844 payloadHtml += ', ';875 payloadHtml += ', ';
845 }876 }
877 var value = typeObj.params[i];
878 var paramValue = resolveValue(value);
879 console.assert("type" in paramValue);
880 var argTypeIndex = paramValue.type;
846881
847 var paramValue = resolveValue(typeObj.params[i]);
848 console.assert("type" in paramValue);
849 var argTypeIndex = paramValue.type;
850882
851 if (fields != null) {883 if (fields != null) {
852 var paramNode = zigAnalysis.astNodes[fields[i]];884 var paramNode = zigAnalysis.astNodes[fields[i]];
853885
854 if (paramNode.varArgs) {886 if (paramNode.varArgs) {
855 payloadHtml += '...';887 payloadHtml += '...';
856 continue;888 continue;
857 }889 }
858890
859 if (paramNode.noalias) {891 if (paramNode.noalias) {
860 if (wantHtml) {892 if (wantHtml) {
861 payloadHtml += '<span class="tok-kw">noalias</span> ';893 payloadHtml += '<span class="tok-kw">noalias</span> ';
862 } else {894 } else {
863 payloadHtml += 'noalias ';895 payloadHtml += 'noalias ';
896 }
864 }897 }
865 }
866898
867 if (paramNode.comptime) {899 if (paramNode.comptime) {
868 if (wantHtml) {900 if (wantHtml) {
869 payloadHtml += '<span class="tok-kw">comptime</span> ';901 payloadHtml += '<span class="tok-kw">comptime</span> ';
870 } else {902 } else {
871 payloadHtml += 'comptime ';903 payloadHtml += 'comptime ';
904 }
872 }905 }
873 }
874906
875 var paramName = paramNode.name;907 var paramName = paramNode.name;
876 if (paramName != null) {908 if (paramName != null) {
877 // skip if it matches the type name909 // skip if it matches the type name
878 if (argTypeIndex == null || !shouldSkipParamName(argTypeIndex, paramName)) {910 if (argTypeIndex == null || !shouldSkipParamName(argTypeIndex, paramName)) {
879 payloadHtml += paramName + ': ';911 payloadHtml += paramName + ': ';
912 }
880 }913 }
881 }914 }
882 }
883915
884 if (isVarArgs && i === typeObj.args.length - 1) {916 if (isVarArgs && i === typeObj.args.length - 1) {
885 payloadHtml += '...';917 payloadHtml += '...';
886 } else if (argTypeIndex != null) {918 } else if ("declRef" in value) {
887 payloadHtml += typeIndexName(argTypeIndex, wantHtml, wantSubLink);919 var decl = zigAnalysis.decls[value.declRef];
888 } else if (wantHtml) {920 var val = resolveValue(decl.value);
889 payloadHtml += '<span class="tok-kw">var</span>';921 var valType = zigAnalysis.types[argTypeIndex];
890 } else {922
891 payloadHtml += 'var';923 var valTypeName = typeShorthandName(valType);
924
925 payloadHtml += '<a href="'+navLinkDecl(decl.name)+'">';
926 payloadHtml += '<span class="tok-kw" style="color:lightblue;">' + decl.name + '</span>';
927 payloadHtml += '</a>';
928 } else if ("type" in value) {
929 var name = zigAnalysis.types[value.type].name;
930 payloadHtml += '<span class="tok-kw">' + name + '</span>';
931 } else if (argTypeIndex != null) {
932 payloadHtml += typeIndexName(argTypeIndex, wantHtml, wantSubLink);
933 } else if (wantHtml) {
934 payloadHtml += '<span class="tok-kw">var</span>';
935 } else {
936 payloadHtml += 'var';
937 }
892 }938 }
893 }939 }
894 }
895940
896 var retValue = resolveValue(typeObj.ret);941 var retValue = resolveValue(typeObj.ret);
897 console.assert("type" in retValue);942 console.assert("type" in retValue);
898 var retTypeIndex = retValue.type;943 var retTypeIndex = retValue.type;
899944
900 payloadHtml += ') ';945 payloadHtml += ') ';
901 if (retTypeIndex != null) {946 if (retTypeIndex != null) {
902 payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl);947 payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl);
903 } else if (wantHtml) {948 } else if (wantHtml) {
...@@ -1015,14 +1060,14 @@...@@ -1015,14 +1060,14 @@
1015 var next = typeObj.pubDecls[declI];1060 var next = typeObj.pubDecls[declI];
1016 if (prev === next) continue;1061 if (prev === next) continue;
1017 // TODO instead of showing "examples" as the public declarations,1062 // TODO instead of showing "examples" as the public declarations,
1018 // do logic like this:1063 // do logic like this:
1019 //if (typeof(prev) !== 'object') {1064 //if (typeof(prev) !== 'object') {
1020 // var newDeclId = zigAnalysis.decls.length;1065 // var newDeclId = zigAnalysis.decls.length;
1021 // prev = clone(zigAnalysis.decls[prev]);1066 // prev = clone(zigAnalysis.decls[prev]);
1022 // prev.id = newDeclId;1067 // prev.id = newDeclId;
1023 // zigAnalysis.decls.push(prev);1068 // zigAnalysis.decls.push(prev);
1024 // containerObj.pubDecls[declI] = prev;1069 // containerObj.pubDecls[declI] = prev;
1025 //}1070 //}
1026 //mergeDecls(prev, next, firstTypeObj, typeObj);1071 //mergeDecls(prev, next, firstTypeObj, typeObj);
1027 }1072 }
1028 }1073 }
...@@ -1067,10 +1112,10 @@...@@ -1067,10 +1112,10 @@
1067 switch(Object.keys(decl.value)[0]) {1112 switch(Object.keys(decl.value)[0]) {
1068 case "int":1113 case "int":
1069 declValueText += decl.value.int.value;1114 declValueText += decl.value.int.value;
1070 break;1115 break;
1071 case "float":1116 case "float":
1072 declValueText += decl.value.float.value;1117 declValueText += decl.value.float.value;
1073 break;1118 break;
1074 default:1119 default:
1075 console.log("TODO: renderValue for ", Object.keys(decl.value)[0]);1120 console.log("TODO: renderValue for ", Object.keys(decl.value)[0]);
1076 declValueText += "#TODO#";1121 declValueText += "#TODO#";
...@@ -1114,32 +1159,33 @@...@@ -1114,32 +1159,33 @@
1114 var declLen = container.pubDecls ? container.pubDecls.length : 0;1159 var declLen = container.pubDecls ? container.pubDecls.length : 0;
1115 for (var i = 0; i < declLen; i += 1) {1160 for (var i = 0; i < declLen; i += 1) {
1116 var decl = zigAnalysis.decls[container.pubDecls[i]];1161 var decl = zigAnalysis.decls[container.pubDecls[i]];
1117 var declTypeId = resolveDeclValueTypeId(decl);1162 var declValue = resolveValue(decl.value);
11181163
1119 if (decl.kind === 'var') {1164 if (decl.kind === 'var') {
1120 varsList.push(decl);1165 varsList.push(decl);
1121 continue;1166 continue;
1122 } else if (decl.kind === 'const') {1167 }
1123 if (declTypeId === typeTypeId) {1168
1124 if (typeIsErrSet(declTypeId)) {1169 if (decl.kind === 'const') {
1170 if (!("type" in declValue)){
1171 valsList.push(decl);
1172 } else {
1173 var value = zigAnalysis.types[declValue.type];
1174 var kind = value.kind;
1175 if (kind === typeKinds.Fn) {
1176 //if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) {
1177 // typesList.push(decl);
1178 //} else {
1179 fnsList.push(decl);
1180 // }
1181
1182 } else if (typeIsErrSet(declValue.type)) {
1125 errSetsList.push(decl);1183 errSetsList.push(decl);
1126 } else if (typeIsStructWithNoFields(declTypeId)) {1184 } else if (typeIsStructWithNoFields(declValue.type)) {
1127 namespacesList.push(decl);1185 namespacesList.push(decl);
1128 } else {1186 } else {
1129 typesList.push(decl);1187 typesList.push(decl);
1130 }1188 }
1131 } else {
1132 var typeKind = zigAnalysis.types[declTypeId].kind;
1133 if (typeKind === typeKinds.Fn) {
1134 // TODO: this is broken but I don't understand functions yet
1135 if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) {
1136 typesList.push(decl);
1137 } else {
1138 fnsList.push(decl);
1139 }
1140 } else {
1141 valsList.push(decl);
1142 }
1143 }1189 }
1144 }1190 }
1145 }1191 }
...@@ -1202,7 +1248,10 @@...@@ -1202,7 +1248,10 @@
1202 var tdFnCode = trDom.children[0];1248 var tdFnCode = trDom.children[0];
1203 var tdDesc = trDom.children[1];1249 var tdDesc = trDom.children[1];
12041250
1205 tdFnCode.innerHTML = typeIndexName(decl.type, true, true, decl, navLinkDecl(decl.name));1251 var declType = resolveValue(decl.value);
1252 console.assert("type" in declType);
1253
1254 tdFnCode.innerHTML = typeIndexName(declType.type, true, true, decl, navLinkDecl(decl.name));
12061255
1207 var docs = zigAnalysis.astNodes[decl.src].docs;1256 var docs = zigAnalysis.astNodes[decl.src].docs;
1208 if (docs != null) {1257 if (docs != null) {
...@@ -1238,11 +1287,7 @@...@@ -1238,11 +1287,7 @@
1238 console.assert("type" in val);1287 console.assert("type" in val);
1239 var valType = zigAnalysis.types[val.type];1288 var valType = zigAnalysis.types[val.type];
12401289
1241 var valTypeName = valType.name;1290 var valTypeName = typeShorthandName(valType);
1242 if (valType.kind === typeKinds.Struct) {
1243 valTypeName = "struct";
1244 }
1245
1246 html += '<a href="'+navLinkDecl(decl.name)+'">';1291 html += '<a href="'+navLinkDecl(decl.name)+'">';
1247 html += '<span class="tok-kw" style="color:lightblue;">' + decl.name + '</span>';1292 html += '<span class="tok-kw" style="color:lightblue;">' + decl.name + '</span>';
1248 html += '</a>';1293 html += '</a>';
...@@ -1430,12 +1475,12 @@...@@ -1430,12 +1475,12 @@
1430 function computeCanonicalPackagePaths() {1475 function computeCanonicalPackagePaths() {
1431 var list = new Array(zigAnalysis.packages.length);1476 var list = new Array(zigAnalysis.packages.length);
1432 // Now we try to find all the packages from root.1477 // Now we try to find all the packages from root.
1433 var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];1478 var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg];
1434 // Breadth-first to keep the path shortest possible.1479 // Breadth-first to keep the path shortest possible.
1435 var stack = [{1480 var stack = [{
1436 path: [],1481 path: [],
1437 pkg: rootPkg,1482 pkg: rootPkg,
1438 }];1483 }];
1439 while (stack.length !== 0) {1484 while (stack.length !== 0) {
1440 var item = stack.shift();1485 var item = stack.shift();
1441 for (var key in item.pkg.table) {1486 for (var key in item.pkg.table) {
...@@ -1534,7 +1579,7 @@...@@ -1534,7 +1579,7 @@
15341579
1535 // PHASE 1:1580 // PHASE 1:
1536 // Dissect lines and determine the type for each line.1581 // Dissect lines and determine the type for each line.
1537 // Also computes indentation level and removes unnecessary whitespace1582 // Also computes indentation level and removes unnecessary whitespace
15381583
1539 var is_reading_code = false;1584 var is_reading_code = false;
1540 var code_indent = 0;1585 var code_indent = 0;
...@@ -1613,20 +1658,20 @@...@@ -1613,20 +1658,20 @@
16131658
1614 // PHASE 2:1659 // PHASE 2:
1615 // Render HTML from markdown lines.1660 // Render HTML from markdown lines.
1616 // Look at each line and emit fitting HTML code1661 // Look at each line and emit fitting HTML code
16171662
1618 function markdownInlines(innerText, stopChar) {1663 function markdownInlines(innerText, stopChar) {
16191664
1620 // inline types:1665 // inline types:
1621 // **{INLINE}** : <strong>1666 // **{INLINE}** : <strong>
1622 // __{INLINE}__ : <u>1667 // __{INLINE}__ : <u>
1623 // ~~{INLINE}~~ : <s>1668 // ~~{INLINE}~~ : <s>
1624 // *{INLINE}* : <emph>1669 // *{INLINE}* : <emph>
1625 // _{INLINE}_ : <emph>1670 // _{INLINE}_ : <emph>
1626 // `{TEXT}` : <code>1671 // `{TEXT}` : <code>
1627 // [{INLINE}]({URL}) : <a>1672 // [{INLINE}]({URL}) : <a>
1628 // ![{TEXT}]({URL}) : <img>1673 // ![{TEXT}]({URL}) : <img>
1629 // [[std;format.fmt]] : <a> (inner link)1674 // [[std;format.fmt]] : <a> (inner link)
16301675
1631 const formats = [1676 const formats = [
1632 {1677 {
...@@ -1668,9 +1713,9 @@...@@ -1668,9 +1713,9 @@
1668 if (parsing_code && in_code) {1713 if (parsing_code && in_code) {
1669 if (innerText.substr(i, codetag.length) == codetag) {1714 if (innerText.substr(i, codetag.length) == codetag) {
1670 // remove leading and trailing whitespace if string both starts and ends with one.1715 // remove leading and trailing whitespace if string both starts and ends with one.
1671 if (currentRun[0] == " " && currentRun[currentRun.length - 1] == " ") {1716 if (currentRun[0] == " " && currentRun[currentRun.length - 1] == " ") {
1672 currentRun = currentRun.substr(1, currentRun.length - 2);1717 currentRun = currentRun.substr(1, currentRun.length - 2);
1673 }1718 }
1674 flushRun();1719 flushRun();
1675 i += codetag.length - 1;1720 i += codetag.length - 1;
1676 in_code = false;1721 in_code = false;
...@@ -1935,7 +1980,7 @@...@@ -1935,7 +1980,7 @@
1935 startAsyncSearch();1980 startAsyncSearch();
1936 break;1981 break;
1937 case "?":1982 case "?":
1938 ev.preventDefault();1983 ev.preventDefault();
1939 ev.stopPropagation();1984 ev.stopPropagation();
1940 showHelpModal();1985 showHelpModal();
1941 break;1986 break;
...@@ -2054,60 +2099,60 @@...@@ -2054,60 +2099,60 @@
2054 }2099 }
2055 }2100 }
20562101
2057 function renderSearchCursor() {2102function renderSearchCursor() {
2058 for (var i = 0; i < domListSearchResults.children.length; i += 1) {2103 for (var i = 0; i < domListSearchResults.children.length; i += 1) {
2059 var liDom = domListSearchResults.children[i];2104 var liDom = domListSearchResults.children[i];
2060 if (curSearchIndex === i) {2105 if (curSearchIndex === i) {
2061 liDom.classList.add("selected");2106 liDom.classList.add("selected");
2062 } else {2107 } else {
2063 liDom.classList.remove("selected");2108 liDom.classList.remove("selected");
2064 }
2065 }2109 }
2066 }2110 }
2111}
20672112
2068 function indexNodesToFns() {2113function indexNodesToFns() {
2069 var map = {};2114 var map = {};
2070 for (var i = 0; i < zigAnalysis.fns.length; i += 1) {2115 for (var i = 0; i < zigAnalysis.fns.length; i += 1) {
2071 var fn = zigAnalysis.fns[i];2116 var fn = zigAnalysis.fns[i];
2072 if (typeIsGenericFn(fn.type)) continue;2117 if (typeIsGenericFn(fn.type)) continue;
2073 if (map[fn.src] == null) {2118 if (map[fn.src] == null) {
2074 map[fn.src] = [i];2119 map[fn.src] = [i];
2075 } else {2120 } else {
2076 map[fn.src].push(i);2121 map[fn.src].push(i);
2077 }
2078 }2122 }
2079 return map;
2080 }2123 }
2124 return map;
2125}
20812126
2082 function indexNodesToCalls() {2127function indexNodesToCalls() {
2083 var map = {};2128 var map = {};
2084 for (var i = 0; i < zigAnalysis.calls.length; i += 1) {2129 for (var i = 0; i < zigAnalysis.calls.length; i += 1) {
2085 var call = zigAnalysis.calls[i];2130 var call = zigAnalysis.calls[i];
2086 var fn = zigAnalysis.fns[call.fn];2131 var fn = zigAnalysis.fns[call.fn];
2087 if (map[fn.src] == null) {2132 if (map[fn.src] == null) {
2088 map[fn.src] = [i];2133 map[fn.src] = [i];
2089 } else {2134 } else {
2090 map[fn.src].push(i);2135 map[fn.src].push(i);
2091 }
2092 }2136 }
2093 return map;
2094 }2137 }
2138 return map;
2139}
20952140
2096 function byNameProperty(a, b) {2141function byNameProperty(a, b) {
2097 return operatorCompare(a.name, b.name);2142 return operatorCompare(a.name, b.name);
2098 }2143}
20992144
2100 function clone(obj) {2145function clone(obj) {
2101 var res = {};2146 var res = {};
2102 for (var key in obj) {2147 for (var key in obj) {
2103 res[key] = obj[key];2148 res[key] = obj[key];
2104 }
2105 return res;
2106 }2149 }
2150 return res;
2151}
21072152
2108 function firstObjectKey(obj) {2153function firstObjectKey(obj) {
2109 for (var key in obj) {2154 for (var key in obj) {
2110 return key;2155 return key;
2111 }
2112 }2156 }
2157}
2113})();2158})();