| ... | @@ -668,6 +668,10 @@ const DocData = struct { | ... | @@ -668,6 +668,10 @@ const DocData = struct { |
| 668 | compileError: []const u8, | 668 | compileError: []const u8, |
| 669 | errorSets: usize, | 669 | errorSets: usize, |
| 670 | string: []const u8, // direct value | 670 | string: []const u8, // direct value |
| | 671 | builtin: Builtin, |
| | 672 | builtinIndex: usize, |
| | 673 | builtinBin: BuiltinBin, |
| | 674 | builtinBinIndex: usize, |
| 671 | switchIndex: usize, // index in `exprs` | 675 | switchIndex: usize, // index in `exprs` |
| 672 | switchOp: SwitchOp, | 676 | switchOp: SwitchOp, |
| 673 | // Index a `type` like struct with expressions | 677 | // Index a `type` like struct with expressions |
| ... | @@ -682,7 +686,7 @@ const DocData = struct { | ... | @@ -682,7 +686,7 @@ const DocData = struct { |
| 682 | rhs: usize, // index in `exprs` | 686 | rhs: usize, // index in `exprs` |
| 683 | // opKind | 687 | // opKind |
| 684 | // Identify the operator in js | 688 | // 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 |
| 686 | // Others binOp are not handled yet | 690 | // Others binOp are not handled yet |
| 687 | opKind: usize = 0, | 691 | opKind: usize = 0, |
| 688 | // flags to operations | 692 | // flags to operations |
| ... | @@ -696,6 +700,15 @@ const DocData = struct { | ... | @@ -696,6 +700,15 @@ const DocData = struct { |
| 696 | cases: []usize, | 700 | cases: []usize, |
| 697 | else_index: ?usize, | 701 | else_index: ?usize, |
| 698 | }; | 702 | }; |
| | 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 | }; |
| 699 | const As = struct { | 712 | const As = struct { |
| 700 | typeRefArg: ?usize, // index in `exprs` | 713 | typeRefArg: ?usize, // index in `exprs` |
| 701 | exprArg: usize, // index in `exprs` | 714 | exprArg: usize, // index in `exprs` |
| ... | @@ -800,6 +813,26 @@ const DocData = struct { | ... | @@ -800,6 +813,26 @@ const DocData = struct { |
| 800 | options, | 813 | options, |
| 801 | w, | 814 | w, |
| 802 | ), | 815 | ), |
| | 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 | ), |
| 803 | .typeOf_peer => |v| try std.json.stringify( | 836 | .typeOf_peer => |v| try std.json.stringify( |
| 804 | struct { typeOf_peer: []usize }{ .typeOf_peer = v }, | 837 | struct { typeOf_peer: []usize }{ .typeOf_peer = v }, |
| 805 | options, | 838 | options, |
| ... | @@ -1041,7 +1074,39 @@ fn walkInstruction( | ... | @@ -1041,7 +1074,39 @@ fn walkInstruction( |
| 1041 | .expr = .{ .binOpIndex = binop_index }, | 1074 | .expr = .{ .binOpIndex = binop_index }, |
| 1042 | }; | 1075 | }; |
| 1043 | }, | 1076 | }, |
| 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 => { |
| 1045 | const pl_node = data[inst_index].pl_node; | 1110 | const pl_node = data[inst_index].pl_node; |
| 1046 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 1111 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| 1047 | | 1112 | |
| ... | @@ -1065,14 +1130,14 @@ fn walkInstruction( | ... | @@ -1065,14 +1130,14 @@ fn walkInstruction( |
| 1065 | try self.exprs.append(self.arena, lhs.expr); | 1130 | try self.exprs.append(self.arena, lhs.expr); |
| 1066 | const rhs_index = self.exprs.items.len; | 1131 | const rhs_index = self.exprs.items.len; |
| 1067 | try self.exprs.append(self.arena, rhs.expr); | 1132 | 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 } }; |
| 1069 | | 1134 | |
| 1070 | return DocData.WalkResult{ | 1135 | return DocData.WalkResult{ |
| 1071 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, | 1136 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| 1072 | .expr = .{ .binOpIndex = binop_index }, | 1137 | .expr = .{ .binOpIndex = binop_index }, |
| 1073 | }; | 1138 | }; |
| 1074 | }, | 1139 | }, |
| 1075 | .bit_or => { | 1140 | .bit_and => { |
| 1076 | const pl_node = data[inst_index].pl_node; | 1141 | const pl_node = data[inst_index].pl_node; |
| 1077 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 1142 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| 1078 | | 1143 | |
| ... | @@ -1096,7 +1161,7 @@ fn walkInstruction( | ... | @@ -1096,7 +1161,7 @@ fn walkInstruction( |
| 1096 | try self.exprs.append(self.arena, lhs.expr); | 1161 | try self.exprs.append(self.arena, lhs.expr); |
| 1097 | const rhs_index = self.exprs.items.len; | 1162 | const rhs_index = self.exprs.items.len; |
| 1098 | try self.exprs.append(self.arena, rhs.expr); | 1163 | 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 } }; |
| 1100 | | 1165 | |
| 1101 | return DocData.WalkResult{ | 1166 | return DocData.WalkResult{ |
| 1102 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, | 1167 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| ... | @@ -1763,6 +1828,175 @@ fn walkInstruction( | ... | @@ -1763,6 +1828,175 @@ fn walkInstruction( |
| 1763 | }; | 1828 | }; |
| 1764 | }, | 1829 | }, |
| 1765 | | 1830 | |
| | 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 | }, |
| 1766 | .error_union_type => { | 2000 | .error_union_type => { |
| 1767 | const pl_node = data[inst_index].pl_node; | 2001 | const pl_node = data[inst_index].pl_node; |
| 1768 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 2002 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| ... | @@ -2398,26 +2632,6 @@ fn walkInstruction( | ... | @@ -2398,26 +2632,6 @@ fn walkInstruction( |
| 2398 | .expr = .{ .typeOf = operand_index }, | 2632 | .expr = .{ .typeOf = operand_index }, |
| 2399 | }; | 2633 | }; |
| 2400 | }, | 2634 | }, |
| 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 | }, | | |
| 2421 | .typeof_builtin => { | 2635 | .typeof_builtin => { |
| 2422 | const pl_node = data[inst_index].pl_node; | 2636 | const pl_node = data[inst_index].pl_node; |
| 2423 | const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index); | 2637 | const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index); |
| ... | @@ -2438,31 +2652,6 @@ fn walkInstruction( | ... | @@ -2438,31 +2652,6 @@ fn walkInstruction( |
| 2438 | .expr = .{ .typeOf = operand_index }, | 2652 | .expr = .{ .typeOf = operand_index }, |
| 2439 | }; | 2653 | }; |
| 2440 | }, | 2654 | }, |
| 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 | }, | | |
| 2466 | .type_info => { | 2655 | .type_info => { |
| 2467 | // @check | 2656 | // @check |
| 2468 | const un_node = data[inst_index].un_node; | 2657 | const un_node = data[inst_index].un_node; |
| ... | @@ -3681,8 +3870,8 @@ fn tryResolveRefPath( | ... | @@ -3681,8 +3870,8 @@ fn tryResolveRefPath( |
| 3681 | panicWithContext( | 3870 | panicWithContext( |
| 3682 | file, | 3871 | file, |
| 3683 | inst_index, | 3872 | inst_index, |
| 3684 | "TODO: handle `{s}` in tryResolveDeclPath.type\n", | 3873 | "TODO: handle `{s}` in tryResolveDeclPath.type\nInfo: {}", |
| 3685 | .{@tagName(self.types.items[t_index])}, | 3874 | .{ @tagName(self.types.items[t_index]), resolved_parent }, |
| 3686 | ); | 3875 | ); |
| 3687 | }, | 3876 | }, |
| 3688 | .Unanalyzed => { | 3877 | .Unanalyzed => { |