| ... | ... | @@ -144,13 +144,33 @@ |
| 144 | 144 | return typeKind === typeKinds.ErrorSet || typeKindIsContainer(typeKind); |
| 145 | 145 | } |
| 146 | 146 | |
| 147 | function findCteInDeclPath(path) { |
| 148 | for (var i = path.length - 1; i >= 0; i -= 1) { |
| 149 | const decl = zigAnalysis.decls[path[i]]; |
| 150 | if ("comptimeExpr" in decl.value) { |
| 151 | return decl; |
| 152 | } |
| 153 | |
| 154 | if ("declPath" in decl.value) { |
| 155 | const res = findCteInDeclPath(decl.value.declPath); |
| 156 | if (res !== null) { |
| 157 | return res; |
| 158 | } |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | return null; |
| 163 | } |
| 164 | |
| 147 | 165 | function resolveValue(value) { |
| 148 | 166 | var i = 0; |
| 149 | 167 | while(i < 1000) { |
| 150 | 168 | i += 1; |
| 151 | 169 | |
| 152 | 170 | if ("declPath" in value) { |
| 153 | | console.assert(value.declPath.length == 1); // only support declRefs for now |
| 171 | if (value.hasCte) { |
| 172 | return findCteInDeclPath(value.declPath).value; |
| 173 | } |
| 154 | 174 | value = zigAnalysis.decls[value.declPath[0]].value; |
| 155 | 175 | continue; |
| 156 | 176 | } |
| ... | ... | @@ -171,30 +191,34 @@ |
| 171 | 191 | } |
| 172 | 192 | |
| 173 | 193 | if ("declPath" in decl.value) { |
| 174 | | console.assert(decl.value.declPath.length == 1); // only support declRefs for now |
| 175 | | decl = zigAnalysis.decls[decl.value.declPath[0]]; |
| 194 | if (decl.value.hasCte) { |
| 195 | decl = findCteInDeclPath(decl.value.declPath); |
| 196 | } else { |
| 197 | decl = zigAnalysis.decls[decl.value.declPath[0]]; |
| 198 | } |
| 199 | |
| 176 | 200 | continue; |
| 177 | 201 | } |
| 178 | 202 | |
| 179 | 203 | if ("int" in decl.value) { |
| 180 | | return resolveTypeRefToTypeId(decl.value.int.typeRef); |
| 204 | return decl.value.int.typeRef; |
| 181 | 205 | } |
| 182 | 206 | |
| 183 | 207 | if ("float" in decl.value) { |
| 184 | | return resolveTypeRefToTypeId(decl.value.float.typeRef); |
| 208 | return decl.value.float.typeRef; |
| 185 | 209 | } |
| 186 | 210 | |
| 187 | 211 | if ("array" in decl.value) { |
| 188 | | return resolveTypeRefToTypeId(decl.value.array.typeRef); |
| 212 | return decl.value.array.typeRef; |
| 189 | 213 | } |
| 190 | 214 | |
| 191 | 215 | if ("struct" in decl.value) { |
| 192 | | return resolveTypeRefToTypeId(decl.value.struct.typeRef); |
| 216 | return decl.value.struct.typeRef; |
| 193 | 217 | } |
| 194 | 218 | |
| 195 | 219 | if ("comptimeExpr" in decl.value) { |
| 196 | 220 | const cte = zigAnalysis.comptimeExprs[decl.value.comptimeExpr]; |
| 197 | | return resolveTypeRefToTypeId(cte.typeRef); |
| 221 | return cte.typeRef; |
| 198 | 222 | } |
| 199 | 223 | |
| 200 | 224 | if ("call" in decl.value) { |
| ... | ... | @@ -205,7 +229,7 @@ |
| 205 | 229 | console.assert("type" in fn_decl_value); //TODO handle comptimeExpr |
| 206 | 230 | const fn_type = zigAnalysis.types[fn_decl_value.type]; |
| 207 | 231 | console.assert(fn_type.kind === typeKinds.Fn); |
| 208 | | return resolveTypeRefToTypeId(fn_type.ret); |
| 232 | return fn_type.ret; |
| 209 | 233 | } |
| 210 | 234 | |
| 211 | 235 | console.log("TODO: handle in `typeOfDecl` more cases: ", decl); |
| ... | ... | @@ -215,23 +239,6 @@ |
| 215 | 239 | console.assert(false); |
| 216 | 240 | } |
| 217 | 241 | |
| 218 | | function resolveTypeRefToTypeId(ref) { |
| 219 | | if ("unspecified" in ref) { |
| 220 | | console.log("found an unspecified type!") |
| 221 | | return -1; |
| 222 | | } |
| 223 | | |
| 224 | | if ("declRef" in ref) { |
| 225 | | return typeOfDecl(ref.declRef); |
| 226 | | } |
| 227 | | |
| 228 | | if ("type" in ref) { |
| 229 | | return ref.type; |
| 230 | | } |
| 231 | | |
| 232 | | console.assert(false); |
| 233 | | } |
| 234 | | |
| 235 | 242 | function render() { |
| 236 | 243 | domStatus.classList.add("hidden"); |
| 237 | 244 | domFnProto.classList.add("hidden"); |
| ... | ... | @@ -369,7 +376,7 @@ |
| 369 | 376 | console.assert("type" in value); |
| 370 | 377 | var typeObj = zigAnalysis.types[value.type]; |
| 371 | 378 | |
| 372 | | domFnProtoCode.innerHTML = typeIndexName(value.type, true, true, fnDecl); |
| 379 | domFnProtoCode.innerHTML = typeValueName(value, true, true, fnDecl); |
| 373 | 380 | |
| 374 | 381 | var docsSource = null; |
| 375 | 382 | var srcNode = zigAnalysis.astNodes[fnDecl.src]; |
| ... | ... | @@ -462,9 +469,6 @@ |
| 462 | 469 | |
| 463 | 470 | |
| 464 | 471 | var value = typeObj.params[i]; |
| 465 | | var valueType = resolveValue(value); |
| 466 | | console.assert("type" in valueType); |
| 467 | | var argTypeIndex = valueType.type; |
| 468 | 472 | var html = '<pre>' + escapeHtml(fieldNode.name) + ": "; |
| 469 | 473 | if (isVarArgs && i === typeObj.params.length - 1) { |
| 470 | 474 | html += '...'; |
| ... | ... | @@ -482,8 +486,6 @@ |
| 482 | 486 | } else if ("type" in value) { |
| 483 | 487 | var name = zigAnalysis.types[value.type].name; |
| 484 | 488 | html += '<span class="tok-kw">' + escapeHtml(name) + '</span>'; |
| 485 | | } else if (argTypeIndex != null) { |
| 486 | | html += typeIndexName(argTypeIndex, true, true); |
| 487 | 489 | } else { |
| 488 | 490 | html += '<span class="tok-kw">var</span>'; |
| 489 | 491 | } |
| ... | ... | @@ -654,13 +656,16 @@ |
| 654 | 656 | } |
| 655 | 657 | } |
| 656 | 658 | |
| 657 | | function typeIndexName(typeIndex, wantHtml, wantLink, fnDecl, linkFnNameDecl) { |
| 658 | | return typeValueName({ type: typeIndex }, wantHtml, wantLink, fnDecl, linkFnNameDecl); |
| 659 | | } |
| 660 | | |
| 661 | 659 | function typeValueName(typeValue, wantHtml, wantLink, fnDecl, linkFnNameDecl) { |
| 662 | 660 | if ("declPath" in typeValue) { |
| 663 | | console.assert(typeValue.declPath.length == 1); |
| 661 | if (typeValue.hasCte) { |
| 662 | // TODO: find the cte, print it nicely |
| 663 | if (wantLink) { |
| 664 | return '<a href=""># CTE TODO #</a>'; |
| 665 | } else { |
| 666 | return "# CTE TODO #"; |
| 667 | } |
| 668 | } |
| 664 | 669 | var declIndex = typeValue.declPath[0]; |
| 665 | 670 | var name = zigAnalysis.decls[declIndex].name; |
| 666 | 671 | var declPath = getCanonDeclPath(declIndex); |
| ... | ... | @@ -695,12 +700,17 @@ |
| 695 | 700 | } |
| 696 | 701 | } |
| 697 | 702 | |
| 698 | | function shouldSkipParamName(typeIndex, paramName) { |
| 699 | | var typeObj = zigAnalysis.types[typeIndex]; |
| 700 | | if (typeObj.kind === typeKinds.Pointer && getPtrSize(typeObj) === pointerSizeEnum.One) { |
| 701 | | typeIndex = typeObj.child; |
| 703 | function shouldSkipParamName(typeRef, paramName) { |
| 704 | var resolvedTypeRef = resolveValue(typeRef); |
| 705 | if ("type" in resolvedTypeRef) { |
| 706 | var typeObj = zigAnalysis.types[resolvedTypeRef.type]; |
| 707 | if (typeObj.kind === typeKinds.Pointer && |
| 708 | getPtrSize(typeObj) === pointerSizeEnum.One) { |
| 709 | const value = resolveValue(typeObj.child); |
| 710 | return typeValueName(value, false, true).toLowerCase() === paramName; |
| 711 | } |
| 702 | 712 | } |
| 703 | | return typeIndexName(typeIndex, false, true).toLowerCase() === paramName; |
| 713 | return false; |
| 704 | 714 | } |
| 705 | 715 | |
| 706 | 716 | function getPtrSize(typeObj) { |
| ... | ... | @@ -716,20 +726,25 @@ |
| 716 | 726 | for (var arg_i = 0; arg_i < callObj.args.length; arg_i += 1) { |
| 717 | 727 | if (arg_i !== 0) html += ', '; |
| 718 | 728 | var argObj = callObj.args[arg_i]; |
| 719 | | html += getValueText(argObj.type, argObj.value, true, true); |
| 729 | html += getValueText(argObj, argObj.value, true, true); |
| 720 | 730 | } |
| 721 | 731 | html += ')'; |
| 722 | 732 | return html; |
| 723 | 733 | } |
| 724 | 734 | |
| 725 | | function getValueText(typeIndex, value, wantHtml, wantLink) { |
| 726 | | var typeObj = zigAnalysis.types[typeIndex]; |
| 735 | function getValueText(typeRef, value, wantHtml, wantLink) { |
| 736 | var resolvedTypeRef = resolveValue(typeRef); |
| 737 | if ("comptimeExpr" in resolvedTypeRef) { |
| 738 | return "# CTE TODO #"; |
| 739 | } |
| 740 | console.assert("type" in resolvedTypeRef); |
| 741 | var typeObj = zigAnalysis.types[typeRef.type]; |
| 727 | 742 | switch (typeObj.kind) { |
| 728 | 743 | case typeKinds.Type: |
| 729 | 744 | return typeIndexName(value, wantHtml, wantLink); |
| 730 | 745 | case typeKinds.Fn: |
| 731 | 746 | var fnObj = zigAnalysis.fns[value]; |
| 732 | | return typeIndexName(fnObj.type, wantHtml, wantLink); |
| 747 | return typeValueName(fnObj, wantHtml, wantLink); |
| 733 | 748 | case typeKinds.Int: |
| 734 | 749 | if (wantHtml) { |
| 735 | 750 | return '<span class="tok-number">' + value + '</span>'; |
| ... | ... | @@ -923,11 +938,10 @@ |
| 923 | 938 | if (i != 0) { |
| 924 | 939 | payloadHtml += ', '; |
| 925 | 940 | } |
| 941 | |
| 926 | 942 | var value = typeObj.params[i]; |
| 927 | 943 | var paramValue = resolveValue(value); |
| 928 | | console.assert("type" in paramValue); |
| 929 | | var argTypeIndex = paramValue.type; |
| 930 | | |
| 944 | var isCte = "comptimeExpr" in paramValue; |
| 931 | 945 | |
| 932 | 946 | if (fields != null) { |
| 933 | 947 | var paramNode = zigAnalysis.astNodes[fields[i]]; |
| ... | ... | @@ -956,7 +970,7 @@ |
| 956 | 970 | var paramName = paramNode.name; |
| 957 | 971 | if (paramName != null) { |
| 958 | 972 | // skip if it matches the type name |
| 959 | | if (argTypeIndex == null || !shouldSkipParamName(argTypeIndex, paramName)) { |
| 973 | if (!shouldSkipParamName(paramValue, paramName)) { |
| 960 | 974 | payloadHtml += paramName + ': '; |
| 961 | 975 | } |
| 962 | 976 | } |
| ... | ... | @@ -975,10 +989,10 @@ |
| 975 | 989 | payloadHtml += '<span class="tok-kw" style="color:lightblue;">' + escapeHtml(decl.name) + '</span>'; |
| 976 | 990 | payloadHtml += '</a>'; |
| 977 | 991 | } else if ("type" in value) { |
| 978 | | var name = zigAnalysis.types[value.type].name; |
| 992 | var name = typeValueName(value, false); |
| 979 | 993 | payloadHtml += '<span class="tok-kw">' + escapeHtml(name) + '</span>'; |
| 980 | | } else if (argTypeIndex != null) { |
| 981 | | payloadHtml += typeIndexName(argTypeIndex, wantHtml, wantSubLink); |
| 994 | } else if ("comptimeExpr" in value) { |
| 995 | payloadHtml += '<span class="tok-kw"> # CTE TODO #</span>'; |
| 982 | 996 | } else if (wantHtml) { |
| 983 | 997 | payloadHtml += '<span class="tok-kw">var</span>'; |
| 984 | 998 | } else { |
| ... | ... | @@ -1152,7 +1166,7 @@ |
| 1152 | 1166 | |
| 1153 | 1167 | function renderValue(decl) { |
| 1154 | 1168 | |
| 1155 | | var declTypeId = typeOfDecl(decl); |
| 1169 | var declTypeRef = typeOfDecl(decl); |
| 1156 | 1170 | var declValueText = ""; |
| 1157 | 1171 | switch(Object.keys(decl.value)[0]) { |
| 1158 | 1172 | case "int": |
| ... | ... | @@ -1170,7 +1184,7 @@ |
| 1170 | 1184 | } |
| 1171 | 1185 | |
| 1172 | 1186 | domFnProtoCode.innerHTML = '<span class="tok-kw">const</span> ' + |
| 1173 | | escapeHtml(decl.name) + ': ' + typeIndexName(declTypeId, true, true) + |
| 1187 | escapeHtml(decl.name) + ': ' + typeValueName(declTypeRef, true, true) + |
| 1174 | 1188 | " = " + declValueText; |
| 1175 | 1189 | |
| 1176 | 1190 | var docs = zigAnalysis.astNodes[decl.src].docs; |
| ... | ... | @@ -1183,9 +1197,9 @@ |
| 1183 | 1197 | } |
| 1184 | 1198 | |
| 1185 | 1199 | function renderVar(decl) { |
| 1186 | | var declTypeId = typeOfDecl(decl); |
| 1200 | var declTypeRef = typeOfDecl(decl); |
| 1187 | 1201 | domFnProtoCode.innerHTML = '<span class="tok-kw">var</span> ' + |
| 1188 | | escapeHtml(decl.name) + ': ' + typeIndexName(declTypeId, true, true); |
| 1202 | escapeHtml(decl.name) + ': ' + typeValueName(declTypeRef, true, true); |
| 1189 | 1203 | |
| 1190 | 1204 | var docs = zigAnalysis.astNodes[decl.src].docs; |
| 1191 | 1205 | if (docs != null) { |
| ... | ... | @@ -1221,8 +1235,9 @@ |
| 1221 | 1235 | var value = zigAnalysis.types[declValue.type]; |
| 1222 | 1236 | var kind = value.kind; |
| 1223 | 1237 | if (kind === typeKinds.Fn) { |
| 1224 | | //if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) { |
| 1225 | | if (resolveTypeRefToTypeId(value.ret) == typeTypeId) { |
| 1238 | // TODO: handle CTE return types when we know their type. |
| 1239 | const resVal = resolveValue(value.ret); |
| 1240 | if ("type" in resVal && resVal.type == typeTypeId) { |
| 1226 | 1241 | typesList.push(decl); |
| 1227 | 1242 | } else { |
| 1228 | 1243 | fnsList.push(decl); |
| ... | ... | @@ -1300,7 +1315,7 @@ |
| 1300 | 1315 | var declType = resolveValue(decl.value); |
| 1301 | 1316 | console.assert("type" in declType); |
| 1302 | 1317 | |
| 1303 | | tdFnCode.innerHTML = typeIndexName(declType.type, true, true, decl, navLinkDecl(decl.name)); |
| 1318 | tdFnCode.innerHTML = typeValueName(declType, true, true, decl, navLinkDecl(decl.name)); |
| 1304 | 1319 | |
| 1305 | 1320 | var docs = zigAnalysis.astNodes[decl.src].docs; |
| 1306 | 1321 | if (docs != null) { |
| ... | ... | @@ -1327,35 +1342,37 @@ |
| 1327 | 1342 | } else { |
| 1328 | 1343 | var field = container.fields[i]; |
| 1329 | 1344 | html += ": "; |
| 1330 | | if (typeof(field) === 'object') { |
| 1331 | | if (field.failure === true) { |
| 1332 | | html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>'; |
| 1333 | | } else if ("declPath" in field) { |
| 1334 | | for (var j = field.declPath.length - 1; j >= 0; j--) { |
| 1335 | | var decl = zigAnalysis.decls[field.declPath[j]]; |
| 1336 | | |
| 1337 | | html += '<a href="'+navLinkDecl(decl.name)+'">'; |
| 1338 | | html += '<span class="tok-kw" style="color:lightblue;">' + |
| 1339 | | escapeHtml(decl.name) + '</span>'; |
| 1340 | | html += '</a>'; |
| 1341 | | if (j != 0) html += "."; |
| 1345 | if (field.failure === true) { |
| 1346 | html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>'; |
| 1347 | } else if ("declPath" in field) { |
| 1348 | for (var j = field.declPath.length - 1; j >= 0; j--) { |
| 1349 | var decl = zigAnalysis.decls[field.declPath[j]]; |
| 1350 | |
| 1351 | // TODO: handle nested decl paths properly! |
| 1352 | if (field.hasCte) { |
| 1353 | html += "<a href=\"\"># CTE TODO #</a>"; |
| 1354 | break; |
| 1342 | 1355 | } |
| 1343 | | // at the end of the for loop this is the value of `decl` |
| 1344 | | //decl = zigAnalysis.decls[field.declPath[0]]; |
| 1345 | | |
| 1346 | | var val = resolveValue(decl.value); |
| 1347 | | console.assert("type" in val); |
| 1348 | | var valType = zigAnalysis.types[val.type]; |
| 1349 | | var valTypeName = typeShorthandName(valType); |
| 1350 | | html += ' ('+ valTypeName +')'; |
| 1351 | | } else if ("type" in field) { |
| 1352 | | var name = zigAnalysis.types[field.type].name; |
| 1353 | | html += '<span class="tok-kw">' + escapeHtml(name) + '</span>'; |
| 1354 | | } else { |
| 1355 | | html += '<span class="tok-kw">var</span>'; |
| 1356 | |
| 1357 | html += '<a href="'+navLinkDecl(decl.name)+'">'; |
| 1358 | html += '<span class="tok-kw" style="color:lightblue;">' + |
| 1359 | escapeHtml(decl.name) + '</span>'; |
| 1360 | html += '</a>'; |
| 1361 | if (j != 0) html += "."; |
| 1356 | 1362 | } |
| 1363 | // at the end of the for loop this is the value of `decl` |
| 1364 | //decl = zigAnalysis.decls[field.declPath[0]]; |
| 1365 | |
| 1366 | var val = resolveValue(decl.value); |
| 1367 | console.assert("type" in val); |
| 1368 | var valType = zigAnalysis.types[val.type]; |
| 1369 | var valTypeName = typeShorthandName(valType); |
| 1370 | html += ' ('+ valTypeName +')'; |
| 1371 | } else if ("type" in field) { |
| 1372 | var name = zigAnalysis.types[field.type].name; |
| 1373 | html += '<span class="tok-kw">' + escapeHtml(name) + '</span>'; |
| 1357 | 1374 | } else { |
| 1358 | | html += typeIndexName(field, true, true); |
| 1375 | html += '<span class="tok-kw">var</span>'; |
| 1359 | 1376 | } |
| 1360 | 1377 | } |
| 1361 | 1378 | |
| ... | ... | @@ -1385,7 +1402,7 @@ |
| 1385 | 1402 | tdNameA.setAttribute('href', navLinkDecl(decl.name)); |
| 1386 | 1403 | tdNameA.textContent = decl.name; |
| 1387 | 1404 | |
| 1388 | | tdType.innerHTML = typeIndexName(typeOfDecl(decl), true, true); |
| 1405 | tdType.innerHTML = typeValueName(typeOfDecl(decl), true, true); |
| 1389 | 1406 | |
| 1390 | 1407 | var docs = zigAnalysis.astNodes[decl.src].docs; |
| 1391 | 1408 | if (docs != null) { |
| ... | ... | @@ -1412,7 +1429,7 @@ |
| 1412 | 1429 | tdNameA.setAttribute('href', navLinkDecl(decl.name)); |
| 1413 | 1430 | tdNameA.textContent = decl.name; |
| 1414 | 1431 | |
| 1415 | | tdType.innerHTML = typeIndexName(typeOfDecl(decl), true, true); |
| 1432 | tdType.innerHTML = typeValueName(typeOfDecl(decl), true, true); |
| 1416 | 1433 | |
| 1417 | 1434 | var docs = zigAnalysis.astNodes[decl.src].docs; |
| 1418 | 1435 | if (docs != null) { |