authorgravatar for vallahor91@gmail.comVallahor <vallahor91@gmail.com> 2022-06-01 01:24:29-03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-19 19:10:12-07:00
logb9fa91002eeec00312b55a1412476deb84a627c3
tree25e3e169e070d0cf793a40b467213341ed947299
parenta0ec87be717094b080a98595cfd4ceb0aec38cdf

add: builtins functions


2 files changed, 446 insertions(+), 58 deletions(-)

lib/docs/main.js+205-6
......@@ -1085,6 +1085,9 @@ var zigAnalysis;
10851085 let literal = expr.enumLiteral;
10861086 return literal;
10871087 }
1088 case "void": {
1089 return "VOID WIP";
1090 }
10881091 case "switchOp":{
10891092 let payloadHtml = "switch() {</br>";
10901093 for (let i = 0; i < expr.switchOp.cases.length; i++) {
......@@ -1115,13 +1118,12 @@ var zigAnalysis;
11151118 // const fieldRef = zigAnalysis.decls[expr.fieldRef.index];
11161119 // const struct_name = zigAnalysis.decls[expr.struct[0].val.typeRef.refPath[0].declRef].name;
11171120 console.log(expr)
1118 console.log(fieldRef)
1121 // console.log(fieldRef)
11191122 // return "@enumToInt(" + exprName(enumToInt, opts) + ")";
11201123 // return exprName(fieldRef,opts);
11211124 return "WIP"
11221125 }
11231126 case "enumToInt" : {
1124 console.log(expr);
11251127 const enumToInt = zigAnalysis.exprs[expr.enumToInt];
11261128 return "@enumToInt(" + exprName(enumToInt, opts) + ")";
11271129 }
......@@ -1133,6 +1135,187 @@ var zigAnalysis;
11331135 const sizeOf = zigAnalysis.exprs[expr.sizeOf];
11341136 return "@sizeOf(" + exprName(sizeOf, opts) + ")";
11351137 }
1138 case "builtinIndex" : {
1139 const builtinIndex = zigAnalysis.exprs[expr.builtinIndex];
1140 return exprName(builtinIndex, opts);
1141 }
1142 case "builtin": {
1143 const param_expr = zigAnalysis.exprs[expr.builtin.param];
1144 let param = exprName(param_expr, opts);
1145
1146 let payloadHtml = "@";
1147 switch (expr.builtin.name) {
1148
1149 case "align_of": {
1150 payloadHtml += "alignOf";
1151 break;
1152 }
1153 case "bool_to_int": {
1154 payloadHtml += "boolToInt";
1155 break;
1156 }
1157 case "embed_file": {
1158 payloadHtml += "embedFile";
1159 break;
1160 }
1161 case "error_name": {
1162 payloadHtml += "errorName";
1163 break;
1164 }
1165 case "panic": {
1166 payloadHtml += "panic";
1167 break;
1168 }
1169 case "set_cold": {
1170 payloadHtml += "setCold";
1171 break;
1172 }
1173 case "set_runtime_safety": {
1174 payloadHtml += "setRuntimeSafety";
1175 break;
1176 }
1177 case "sqrt": {
1178 payloadHtml += "sqrt";
1179 break;
1180 }
1181 case "sin": {
1182 payloadHtml += "sin";
1183 break;
1184 }
1185 case "cos": {
1186 payloadHtml += "cos";
1187 break;
1188 }
1189 case "tan": {
1190 payloadHtml += "tan";
1191 break;
1192 }
1193 case "exp": {
1194 payloadHtml += "exp";
1195 break;
1196 }
1197 case "exp2": {
1198 payloadHtml += "exp2";
1199 break;
1200 }
1201 case "log": {
1202 payloadHtml += "log";
1203 break;
1204 }
1205 case "log2": {
1206 payloadHtml += "log2";
1207 break;
1208 }
1209 case "log10": {
1210 payloadHtml += "log10";
1211 break;
1212 }
1213 case "fabs": {
1214 payloadHtml += "fabs";
1215 break;
1216 }
1217 case "floor": {
1218 payloadHtml += "floor";
1219 break;
1220 }
1221 case "ceil": {
1222 payloadHtml += "ceil";
1223 break;
1224 }
1225 case "trunc": {
1226 payloadHtml += "trunc";
1227 break;
1228 }
1229 case "round": {
1230 payloadHtml += "round";
1231 break;
1232 }
1233 case "tag_name": {
1234 payloadHtml += "tagName";
1235 break;
1236 }
1237 case "reify": {
1238 payloadHtml += "Type";
1239 break;
1240 }
1241 case "type_name": {
1242 payloadHtml += "typeName";
1243 break;
1244 }
1245 case "frame_type": {
1246 payloadHtml += "Frame";
1247 break;
1248 }
1249 case "frame_size": {
1250 payloadHtml += "frameSize";
1251 break;
1252 }
1253 default: console.log("builtin function not handled yet or doesn't exist!");
1254 };
1255 return payloadHtml + "(" + param + ")";
1256
1257 }
1258 case "builtinBinIndex" : {
1259 const builtinBinIndex = zigAnalysis.exprs[expr.builtinBinIndex];
1260 return exprName(builtinBinIndex, opts);
1261 }
1262 case "builtinBin": {
1263 const lhsOp = zigAnalysis.exprs[expr.builtinBin.lhs];
1264 const rhsOp = zigAnalysis.exprs[expr.builtinBin.rhs];
1265 let lhs = exprName(lhsOp, opts);
1266 let rhs = exprName(rhsOp, opts);
1267
1268 let payloadHtml = "@";
1269 switch (expr.builtinBin.name) {
1270 case "float_to_int": {
1271 payloadHtml += "floatToInt";
1272 break;
1273 }
1274 case "int_to_float": {
1275 payloadHtml += "intToFloat";
1276 break;
1277 }
1278 case "int_to_ptr": {
1279 payloadHtml += "intToPtr";
1280 break;
1281 }
1282 case "int_to_enum": {
1283 payloadHtml += "intToEnum";
1284 break;
1285 }
1286 case "float_cast": {
1287 payloadHtml += "floatCast";
1288 break;
1289 }
1290 case "int_cast": {
1291 payloadHtml += "intCast";
1292 break;
1293 }
1294 case "ptr_cast": {
1295 payloadHtml += "ptrCast";
1296 break;
1297 }
1298 case "truncate": {
1299 payloadHtml += "truncate";
1300 break;
1301 }
1302 case "align_cast": {
1303 payloadHtml += "alignCast";
1304 break;
1305 }
1306 case "has_decl": {
1307 payloadHtml += "hasDecl";
1308 break;
1309 }
1310 case "has_field": {
1311 payloadHtml += "hasField";
1312 break;
1313 }
1314 default: console.log("builtin function not handled yet or doesn't exist!");
1315 };
1316 return payloadHtml + "(" + lhs + ", " + rhs + ")";
1317
1318 }
11361319 case "binOpIndex" : {
11371320 const binOpIndex = zigAnalysis.exprs[expr.binOpIndex];
11381321 return exprName(binOpIndex, opts);
......@@ -1146,9 +1329,6 @@ var zigAnalysis;
11461329 let print_lhs = "";
11471330 let print_rhs = "";
11481331
1149 console.log(lhsOp)
1150 console.log(rhsOp)
1151
11521332 if (lhsOp['binOpIndex']) {
11531333 print_lhs = "(" + lhs + ")";
11541334 } else {
......@@ -1229,6 +1409,21 @@ var zigAnalysis;
12291409 case 11 : {
12301410 return "@alignCast(" + print_lhs + ", " + print_rhs + ")";
12311411 }
1412 case 12 : {
1413 operator += "&";
1414 break;
1415 }
1416 case 13 : {
1417 operator += "++";
1418 break;
1419 }
1420 case 14 : {
1421 operator += "**";
1422 break;
1423 }
1424 case 15 : {
1425 return "@Vector(" + print_lhs + ", " + print_rhs + ")";
1426 }
12321427 default: console.log("operator not handled yet or doesn't exist!");
12331428 };
12341429 if (expr.binOp.wrap) {
......@@ -1723,7 +1918,11 @@ var zigAnalysis;
17231918 linkFnNameDecl: opts.linkFnNameDecl,
17241919 });
17251920 payloadHtml += '<span class="tok-kw">' + escapeHtml(name) + '</span>';
1726 } else if ("comptimeExpr" in value) {
1921 } else if ("binOpIndex" in value) {
1922 payloadHtml += exprName(value, opts);
1923 console.log(value);
1924 console.log(payloadHtml);
1925 }else if ("comptimeExpr" in value) {
17271926 let comptimeExpr = zigAnalysis.comptimeExprs[value.comptimeExpr].code;
17281927 if (opts.wantHtml) {
17291928 payloadHtml += '<span class="tok-kw">' + comptimeExpr + '</span>';
src/Autodoc.zig+241-52
......@@ -668,6 +668,10 @@ const DocData = struct {
668668 compileError: []const u8,
669669 errorSets: usize,
670670 string: []const u8, // direct value
671 builtin: Builtin,
672 builtinIndex: usize,
673 builtinBin: BuiltinBin,
674 builtinBinIndex: usize,
671675 switchIndex: usize, // index in `exprs`
672676 switchOp: SwitchOp,
673677 // Index a `type` like struct with expressions
......@@ -682,7 +686,7 @@ const DocData = struct {
682686 rhs: usize, // index in `exprs`
683687 // opKind
684688 // Identify the operator in js
685 // 0: add, 1: sub, 2: mul, 3: div, 4: mod, 5: rem, 6: rem_mod, 7: shl, 8: shr, 9: bitcast, 10: bit_or, 11: align_cast
689 // 0: add, 1: sub, 2: mul, 3: div, 4: mod, 5: rem, 6: rem_mod, 7: shl, 8: shr, 9: bitcast, 10: bit_or, 11: align_cast, 12: bit_and, 13: array_cat, 14: array_mul, 15: vector
686690 // Others binOp are not handled yet
687691 opKind: usize = 0,
688692 // flags to operations
......@@ -696,6 +700,15 @@ const DocData = struct {
696700 cases: []usize,
697701 else_index: ?usize,
698702 };
703 const BuiltinBin = struct {
704 name: []const u8 = "", // fn name
705 lhs: usize, // index in `exprs`
706 rhs: usize, // index in `exprs`
707 };
708 const Builtin = struct {
709 name: []const u8 = "", // fn name
710 param: usize, // index in `exprs`
711 };
699712 const As = struct {
700713 typeRefArg: ?usize, // index in `exprs`
701714 exprArg: usize, // index in `exprs`
......@@ -800,6 +813,26 @@ const DocData = struct {
800813 options,
801814 w,
802815 ),
816 .builtin => |v| try std.json.stringify(
817 struct { builtin: Builtin }{ .builtin = v },
818 options,
819 w,
820 ),
821 .builtinIndex => |v| try std.json.stringify(
822 struct { builtinIndex: usize }{ .builtinIndex = v },
823 options,
824 w,
825 ),
826 .builtinBin => |v| try std.json.stringify(
827 struct { builtinBin: BuiltinBin }{ .builtinBin = v },
828 options,
829 w,
830 ),
831 .builtinBinIndex => |v| try std.json.stringify(
832 struct { builtinBinIndex: usize }{ .builtinBinIndex = v },
833 options,
834 w,
835 ),
803836 .typeOf_peer => |v| try std.json.stringify(
804837 struct { typeOf_peer: []usize }{ .typeOf_peer = v },
805838 options,
......@@ -1041,7 +1074,39 @@ fn walkInstruction(
10411074 .expr = .{ .binOpIndex = binop_index },
10421075 };
10431076 },
1044 .align_cast => {
1077 // implementing in builtinBin @check if it's ok to delete it
1078 // .align_cast => {
1079 // const pl_node = data[inst_index].pl_node;
1080 // const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
1081 //
1082 // const binop_index = self.exprs.items.len;
1083 // try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
1084 //
1085 // var lhs: DocData.WalkResult = try self.walkRef(
1086 // file,
1087 // parent_scope,
1088 // extra.data.lhs,
1089 // false,
1090 // );
1091 // var rhs: DocData.WalkResult = try self.walkRef(
1092 // file,
1093 // parent_scope,
1094 // extra.data.rhs,
1095 // false,
1096 // );
1097 //
1098 // const lhs_index = self.exprs.items.len;
1099 // try self.exprs.append(self.arena, lhs.expr);
1100 // const rhs_index = self.exprs.items.len;
1101 // try self.exprs.append(self.arena, rhs.expr);
1102 // self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 11 } };
1103 //
1104 // return DocData.WalkResult{
1105 // .typeRef = .{ .type = @enumToInt(Ref.type_type) },
1106 // .expr = .{ .binOpIndex = binop_index },
1107 // };
1108 // },
1109 .bit_or => {
10451110 const pl_node = data[inst_index].pl_node;
10461111 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
10471112
......@@ -1065,14 +1130,14 @@ fn walkInstruction(
10651130 try self.exprs.append(self.arena, lhs.expr);
10661131 const rhs_index = self.exprs.items.len;
10671132 try self.exprs.append(self.arena, rhs.expr);
1068 self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 11 } };
1133 self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 10 } };
10691134
10701135 return DocData.WalkResult{
10711136 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
10721137 .expr = .{ .binOpIndex = binop_index },
10731138 };
10741139 },
1075 .bit_or => {
1140 .bit_and => {
10761141 const pl_node = data[inst_index].pl_node;
10771142 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
10781143
......@@ -1096,7 +1161,7 @@ fn walkInstruction(
10961161 try self.exprs.append(self.arena, lhs.expr);
10971162 const rhs_index = self.exprs.items.len;
10981163 try self.exprs.append(self.arena, rhs.expr);
1099 self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 10 } };
1164 self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 12 } };
11001165
11011166 return DocData.WalkResult{
11021167 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
......@@ -1763,6 +1828,175 @@ fn walkInstruction(
17631828 };
17641829 },
17651830
1831 // throwing this TODO
1832 // TODO: handle `Array` in tryResolveDeclPath.type
1833 // .array_cat => {
1834 // const pl_node = data[inst_index].pl_node;
1835 // const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
1836 //
1837 // const binop_index = self.exprs.items.len;
1838 // try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
1839 //
1840 // var lhs: DocData.WalkResult = try self.walkRef(
1841 // file,
1842 // parent_scope,
1843 // extra.data.lhs,
1844 // false,
1845 // );
1846 // var rhs: DocData.WalkResult = try self.walkRef(
1847 // file,
1848 // parent_scope,
1849 // extra.data.rhs,
1850 // false,
1851 // );
1852 //
1853 // const lhs_index = self.exprs.items.len;
1854 // try self.exprs.append(self.arena, lhs.expr);
1855 // const rhs_index = self.exprs.items.len;
1856 // try self.exprs.append(self.arena, rhs.expr);
1857 // self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 13 } };
1858 //
1859 // return DocData.WalkResult{
1860 // .typeRef = .{ .type = @enumToInt(Ref.type_type) },
1861 // .expr = .{ .binOpIndex = binop_index },
1862 // };
1863 // },
1864 // .array_mul => {
1865 // const pl_node = data[inst_index].pl_node;
1866 // const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
1867 //
1868 // const binop_index = self.exprs.items.len;
1869 // try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
1870 //
1871 // var lhs: DocData.WalkResult = try self.walkRef(
1872 // file,
1873 // parent_scope,
1874 // extra.data.lhs,
1875 // false,
1876 // );
1877 // var rhs: DocData.WalkResult = try self.walkRef(
1878 // file,
1879 // parent_scope,
1880 // extra.data.rhs,
1881 // false,
1882 // );
1883 //
1884 // const lhs_index = self.exprs.items.len;
1885 // try self.exprs.append(self.arena, lhs.expr);
1886 // const rhs_index = self.exprs.items.len;
1887 // try self.exprs.append(self.arena, rhs.expr);
1888 // self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 14 } };
1889 //
1890 // return DocData.WalkResult{
1891 // .typeRef = .{ .type = @enumToInt(Ref.type_type) },
1892 // .expr = .{ .binOpIndex = binop_index },
1893 // };
1894 // },
1895 .vector_type => {
1896 const pl_node = data[inst_index].pl_node;
1897 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
1898
1899 const binop_index = self.exprs.items.len;
1900 try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
1901
1902 var lhs: DocData.WalkResult = try self.walkRef(
1903 file,
1904 parent_scope,
1905 extra.data.lhs,
1906 false,
1907 );
1908 var rhs: DocData.WalkResult = try self.walkRef(
1909 file,
1910 parent_scope,
1911 extra.data.rhs,
1912 false,
1913 );
1914
1915 const lhs_index = self.exprs.items.len;
1916 try self.exprs.append(self.arena, lhs.expr);
1917 const rhs_index = self.exprs.items.len;
1918 try self.exprs.append(self.arena, rhs.expr);
1919 self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 15 } };
1920
1921 return DocData.WalkResult{
1922 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
1923 .expr = .{ .binOpIndex = binop_index },
1924 };
1925 },
1926
1927 .align_of,
1928 .bool_to_int,
1929 .embed_file,
1930 .error_name,
1931 .panic,
1932 .set_cold, // @check
1933 .set_runtime_safety, // @check
1934 .sqrt,
1935 .sin,
1936 .cos,
1937 .tan,
1938 .exp,
1939 .exp2,
1940 .log,
1941 .log2,
1942 .log10,
1943 .fabs,
1944 .floor,
1945 .ceil,
1946 .trunc,
1947 .round,
1948 .tag_name,
1949 .reify,
1950 .type_name,
1951 .frame_type,
1952 .frame_size,
1953 => {
1954 const un_node = data[inst_index].un_node;
1955 const bin_index = self.exprs.items.len;
1956 try self.exprs.append(self.arena, .{ .builtin = .{ .param = 0 } });
1957 const param = try self.walkRef(file, parent_scope, un_node.operand, false);
1958
1959 const param_index = self.exprs.items.len;
1960 try self.exprs.append(self.arena, param.expr);
1961
1962 self.exprs.items[bin_index] = .{ .builtin = .{ .name = @tagName(tags[inst_index]), .param = param_index } };
1963
1964 return DocData.WalkResult{
1965 .typeRef = param.typeRef,
1966 .expr = .{ .builtinIndex = bin_index },
1967 };
1968 },
1969 .float_to_int, .int_to_float, .int_to_ptr, .int_to_enum, .float_cast, .int_cast, .ptr_cast, .truncate, .align_cast, .has_decl, .has_field => {
1970 const pl_node = data[inst_index].pl_node;
1971 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
1972
1973 const binop_index = self.exprs.items.len;
1974 try self.exprs.append(self.arena, .{ .builtinBin = .{ .lhs = 0, .rhs = 0 } });
1975
1976 var lhs: DocData.WalkResult = try self.walkRef(
1977 file,
1978 parent_scope,
1979 extra.data.lhs,
1980 false,
1981 );
1982 var rhs: DocData.WalkResult = try self.walkRef(
1983 file,
1984 parent_scope,
1985 extra.data.rhs,
1986 false,
1987 );
1988
1989 const lhs_index = self.exprs.items.len;
1990 try self.exprs.append(self.arena, lhs.expr);
1991 const rhs_index = self.exprs.items.len;
1992 try self.exprs.append(self.arena, rhs.expr);
1993 self.exprs.items[binop_index] = .{ .builtinBin = .{ .name = @tagName(tags[inst_index]), .lhs = lhs_index, .rhs = rhs_index } };
1994
1995 return DocData.WalkResult{
1996 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
1997 .expr = .{ .builtinBinIndex = binop_index },
1998 };
1999 },
17662000 .error_union_type => {
17672001 const pl_node = data[inst_index].pl_node;
17682002 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
......@@ -2398,26 +2632,6 @@ fn walkInstruction(
23982632 .expr = .{ .typeOf = operand_index },
23992633 };
24002634 },
2401 .align_of => {
2402 // WIP
2403 // not fully working
2404 // @alignOf() with some pointer type it's not even called in js
2405 // @alignOf([*]u8) are being rendered as [*]u8
2406 const un_node = data[inst_index].un_node;
2407 const operand = try self.walkRef(
2408 file,
2409 parent_scope,
2410 un_node.operand,
2411 need_type,
2412 );
2413 const operand_index = self.exprs.items.len;
2414 try self.exprs.append(self.arena, operand.expr);
2415
2416 return DocData.WalkResult{
2417 .typeRef = operand.typeRef,
2418 .expr = .{ .alignOf = operand_index },
2419 };
2420 },
24212635 .typeof_builtin => {
24222636 const pl_node = data[inst_index].pl_node;
24232637 const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index);
......@@ -2438,31 +2652,6 @@ fn walkInstruction(
24382652 .expr = .{ .typeOf = operand_index },
24392653 };
24402654 },
2441 .typeof_log2_int_type => {
2442 // @check
2443 const un_node = data[inst_index].un_node;
2444 const operand = try self.walkRef(
2445 file,
2446 parent_scope,
2447 un_node.operand,
2448 need_type,
2449 );
2450
2451 // WIP
2452 // const sep = "=" ** 200;
2453 // std.debug.print("{s}\n", .{sep});
2454 // std.debug.print("un_node = {any}\n", .{un_node});
2455 // std.debug.print("operand = {any}\n", .{operand});
2456 // std.debug.print("{s}\n", .{sep});
2457
2458 const operand_index = self.exprs.items.len;
2459 try self.exprs.append(self.arena, operand.expr);
2460
2461 return DocData.WalkResult{
2462 .typeRef = operand.typeRef,
2463 .expr = .{ .typeOf = operand_index },
2464 };
2465 },
24662655 .type_info => {
24672656 // @check
24682657 const un_node = data[inst_index].un_node;
......@@ -3681,8 +3870,8 @@ fn tryResolveRefPath(
36813870 panicWithContext(
36823871 file,
36833872 inst_index,
3684 "TODO: handle `{s}` in tryResolveDeclPath.type\n",
3685 .{@tagName(self.types.items[t_index])},
3873 "TODO: handle `{s}` in tryResolveDeclPath.type\nInfo: {}",
3874 .{ @tagName(self.types.items[t_index]), resolved_parent },
36863875 );
36873876 },
36883877 .Unanalyzed => {