| ... | ... | @@ -87,11 +87,7 @@ pub const Node = extern union { |
| 87 | 87 | mod, |
| 88 | 88 | mod_assign, |
| 89 | 89 | @"and", |
| 90 | | and_assign, |
| 91 | 90 | @"or", |
| 92 | | or_assign, |
| 93 | | xor, |
| 94 | | xor_assign, |
| 95 | 91 | less_than, |
| 96 | 92 | less_than_equal, |
| 97 | 93 | greater_than, |
| ... | ... | @@ -263,11 +259,7 @@ pub const Node = extern union { |
| 263 | 259 | .mod, |
| 264 | 260 | .mod_assign, |
| 265 | 261 | .@"and", |
| 266 | | .and_assign, |
| 267 | 262 | .@"or", |
| 268 | | .or_assign, |
| 269 | | .xor, |
| 270 | | .xor_assign, |
| 271 | 263 | .less_than, |
| 272 | 264 | .less_than_equal, |
| 273 | 265 | .greater_than, |
| ... | ... | @@ -832,7 +824,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 832 | 824 | .rhs = undefined, |
| 833 | 825 | }, |
| 834 | 826 | }), |
| 835 | | .@"anytype" => return try c.addNode(.{ |
| 827 | .@"anytype" => return c.addNode(.{ |
| 836 | 828 | .tag = .@"anytype", |
| 837 | 829 | .main_token = try c.addToken(.keyword_anytype, "anytype"), |
| 838 | 830 | .data = .{ |
| ... | ... | @@ -840,7 +832,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 840 | 832 | .rhs = undefined, |
| 841 | 833 | }, |
| 842 | 834 | }), |
| 843 | | .noreturn_type => return try c.addNode(.{ |
| 835 | .noreturn_type => return c.addNode(.{ |
| 844 | 836 | .tag = .identifier, |
| 845 | 837 | .main_token = try c.addToken(.identifier, "noreturn"), |
| 846 | 838 | .data = .{ |
| ... | ... | @@ -848,6 +840,53 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 848 | 840 | .rhs = undefined, |
| 849 | 841 | }, |
| 850 | 842 | }), |
| 843 | .@"continue" => { |
| 844 | const tok = try c.addToken(.keyword_continue, "continue"); |
| 845 | _ = try c.addToken(.semicolon, ";"); |
| 846 | return c.addNode(.{ |
| 847 | .tag = .@"continue", |
| 848 | .main_token = tok, |
| 849 | .data = .{ |
| 850 | .lhs = 0, |
| 851 | .rhs = undefined, |
| 852 | }, |
| 853 | }); |
| 854 | }, |
| 855 | .@"break" => { |
| 856 | const payload = node.castTag(.@"break").?.data; |
| 857 | const tok = try c.addToken(.keyword_break, "break"); |
| 858 | const break_label = if (payload) |some| blk: { |
| 859 | _ = try c.addToken(.colon, ":"); |
| 860 | break :blk try c.addIdentifier(some); |
| 861 | } else 0; |
| 862 | _ = try c.addToken(.semicolon, ";"); |
| 863 | return c.addNode(.{ |
| 864 | .tag = .identifier, |
| 865 | .main_token = try c.addToken(.keyword_break, "break"), |
| 866 | .data = .{ |
| 867 | .lhs = break_label, |
| 868 | .rhs = 0, |
| 869 | }, |
| 870 | }); |
| 871 | }, |
| 872 | .break_val => { |
| 873 | const payload = node.castTag(.break_val).?.data; |
| 874 | const tok = try c.addToken(.keyword_break, "break"); |
| 875 | const break_label = if (payload.label) |some| blk: { |
| 876 | _ = try c.addToken(.colon, ":"); |
| 877 | break :blk try c.addIdentifier(some); |
| 878 | } else 0; |
| 879 | const val = try renderNode(c, payload.val); |
| 880 | _ = try c.addToken(.semicolon, ";"); |
| 881 | return c.addNode(.{ |
| 882 | .tag = .identifier, |
| 883 | .main_token = try c.addToken(.keyword_break, "break"), |
| 884 | .data = .{ |
| 885 | .lhs = break_label, |
| 886 | .rhs = val, |
| 887 | }, |
| 888 | }); |
| 889 | }, |
| 851 | 890 | .type => { |
| 852 | 891 | const payload = node.castTag(.type).?.data; |
| 853 | 892 | return c.addNode(.{ |
| ... | ... | @@ -1093,6 +1132,43 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1093 | 1132 | }, |
| 1094 | 1133 | }); |
| 1095 | 1134 | }, |
| 1135 | .add => return renderBinOp(c, node, .add, .plus, "+"), |
| 1136 | .add_assign => return renderBinOp(c, node, .assign_add, .plus_equal, "+="), |
| 1137 | .add_wrap => return renderBinOp(c, node, .add_wrap, .plus_percent, "+%"), |
| 1138 | .add_wrap_assign => return renderBinOp(c, node, .assign_add_wrap, .plus_percent_equal, "+%="), |
| 1139 | .sub => return renderBinOp(c, node, .sub, .minus, "-"), |
| 1140 | .sub_assign => return renderBinOp(c, node, .assign_sub, .minus_equal, "-="), |
| 1141 | .sub_wrap => return renderBinOp(c, node, .sub_wrap, .minus_percent, "-%"), |
| 1142 | .sub_wrap_assign => return renderBinOp(c, node, .assign_sub_wrap, .minus_percent_equal, "-%="), |
| 1143 | .mul => return renderBinOp(c, node, .mul, .asterisk, "*"), |
| 1144 | .mul_assign => return renderBinOp(c, node, .assign_mul, .asterisk_equal, "*="), |
| 1145 | .mul_wrap => return renderBinOp(c, node, .mul_wrap, .asterisk_percent, "*="), |
| 1146 | .mul_wrap_assign => return renderBinOp(c, node, .assign_mul_wrap, .asterisk_percent_equal, "*%="), |
| 1147 | .div => return renderBinOp(c, node, .div, .slash, "/"), |
| 1148 | .div_assign => return renderBinOp(c, node, .assign_div, .slash_equal, "/="), |
| 1149 | .shl => return renderBinOp(c, node, .bit_shift_left, .angle_bracket_angle_bracket_left, "<<"), |
| 1150 | .shl_assign => return renderBinOp(c, node, .assign_bit_shift_left, .angle_bracket_angle_bracket_left_equal, "<<="), |
| 1151 | .shr => return renderBinOp(c, node, .bit_shift_right, .angle_bracket_angle_bracket_right, ">>"), |
| 1152 | .shr_assign => return renderBinOp(c, node, .assign_bit_shift_right, .angle_bracket_angle_bracket_right_equal, ">>="), |
| 1153 | .mod => return renderBinOp(c, node, .mod, .percent, "%"), |
| 1154 | .mod_assign => return renderBinOp(c, node, .assign_mod, .percent_equal, "%="), |
| 1155 | .@"and" => return renderBinOp(c, node, .bool_and, .keyword_and, "and"), |
| 1156 | .@"or" => return renderBinOp(c, node, .bool_or, .keyword_or, "or"), |
| 1157 | .less_than => return renderBinOp(c, node, .less_than, .angle_bracket_left, "<"), |
| 1158 | .less_than_equal => return renderBinOp(c, node, .less_or_equal, .angle_bracket_left_equal, "<="), |
| 1159 | .greater_than => return renderBinOp(c, node, .greater_than, .angle_bracket_right, ">="), |
| 1160 | .greater_than_equal => return renderBinOp(c, node, .greater_or_equal, .angle_bracket_right_equal, ">="), |
| 1161 | .equal => return renderBinOp(c, node, .equal_equal, .equal_equal, "=="), |
| 1162 | .not_equal => return renderBinOp(c, node, .bang_equal, .bang_equal, "!="), |
| 1163 | .bit_and => return renderBinOp(c, node, .bit_and, .ampersand, "&"), |
| 1164 | .bit_and_assign => return renderBinOp(c, node, .assign_bit_and, .ampersand_equal, "&="), |
| 1165 | .bit_or => return renderBinOp(c, node, .bit_or, .pipe, "|"), |
| 1166 | .bit_or_assign => return renderBinOp(c, node, .assign_bit_or, .pipe_equal, "|="), |
| 1167 | .bit_xor => return renderBinOp(c, node, .bit_xor, .caret, "^"), |
| 1168 | .bit_xor_assign => return renderBinOp(c, node, .assign_bit_xor, .caret_equal, "^="), |
| 1169 | .array_cat => return renderBinOp(c, node, .array_cat, .plus_plus, "++"), |
| 1170 | .ellipsis3 => return renderBinOp(c, node, .switch_range, .ellipsis3, "..."), |
| 1171 | .assign => return renderBinOp(c, node, .assign, .equal, "="), |
| 1096 | 1172 | else => return c.addNode(.{ |
| 1097 | 1173 | .tag = .identifier, |
| 1098 | 1174 | .main_token = try c.addTokenFmt(.identifier, "@\"TODO {}\"", .{node.tag()}), |
| ... | ... | @@ -1177,7 +1253,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { |
| 1177 | 1253 | .mod, |
| 1178 | 1254 | .@"and", |
| 1179 | 1255 | .@"or", |
| 1180 | | .xor, |
| 1181 | 1256 | .less_than, |
| 1182 | 1257 | .less_than_equal, |
| 1183 | 1258 | .greater_than, |
| ... | ... | @@ -1243,9 +1318,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { |
| 1243 | 1318 | .shl_assign, |
| 1244 | 1319 | .shr_assign, |
| 1245 | 1320 | .mod_assign, |
| 1246 | | .and_assign, |
| 1247 | | .or_assign, |
| 1248 | | .xor_assign, |
| 1249 | 1321 | .bit_and_assign, |
| 1250 | 1322 | .bit_or_assign, |
| 1251 | 1323 | .bit_xor_assign, |
| ... | ... | @@ -1271,6 +1343,19 @@ fn renderPrefixOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: T |
| 1271 | 1343 | }); |
| 1272 | 1344 | } |
| 1273 | 1345 | |
| 1346 | fn renderBinOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: TokenTag, bytes: []const u8) !NodeIndex { |
| 1347 | const payload = @fieldParentPtr(Payload.BinOp, "base", node.ptr_otherwise).data; |
| 1348 | const lhs = try renderNodeGrouped(c, payload.lhs); |
| 1349 | return c.addNode(.{ |
| 1350 | .tag = tag, |
| 1351 | .main_token = try c.addToken(tok_tag, bytes), |
| 1352 | .data = .{ |
| 1353 | .lhs = lhs, |
| 1354 | .rhs = try renderNodeGrouped(c, payload.rhs), |
| 1355 | }, |
| 1356 | }); |
| 1357 | } |
| 1358 | |
| 1274 | 1359 | fn renderStdImport(c: *Context, first: []const u8, second: []const u8) !NodeIndex { |
| 1275 | 1360 | const import_tok = try c.addToken(.builtin, "@import"); |
| 1276 | 1361 | _ = try c.addToken(.l_paren, "("); |