authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-13 21:45:25+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-16 16:40:42+02:00
log227f167958ab37fe1df1b1dea5e3da42651b49c9
treec6c8239b3896eb1563e01fe19d8c39d7c25b3994
parent685778c5a73bf08487ebfb4b1632aee089a89e79
signature Commit is signed but in an unrecognized format.

translate-c: render binops and break/continue


1 files changed, 99 insertions(+), 14 deletions(-)

src/translate_c/ast.zig+99-14
...@@ -87,11 +87,7 @@ pub const Node = extern union {...@@ -87,11 +87,7 @@ pub const Node = extern union {
87 mod,87 mod,
88 mod_assign,88 mod_assign,
89 @"and",89 @"and",
90 and_assign,
91 @"or",90 @"or",
92 or_assign,
93 xor,
94 xor_assign,
95 less_than,91 less_than,
96 less_than_equal,92 less_than_equal,
97 greater_than,93 greater_than,
...@@ -263,11 +259,7 @@ pub const Node = extern union {...@@ -263,11 +259,7 @@ pub const Node = extern union {
263 .mod,259 .mod,
264 .mod_assign,260 .mod_assign,
265 .@"and",261 .@"and",
266 .and_assign,
267 .@"or",262 .@"or",
268 .or_assign,
269 .xor,
270 .xor_assign,
271 .less_than,263 .less_than,
272 .less_than_equal,264 .less_than_equal,
273 .greater_than,265 .greater_than,
...@@ -832,7 +824,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -832,7 +824,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
832 .rhs = undefined,824 .rhs = undefined,
833 },825 },
834 }),826 }),
835 .@"anytype" => return try c.addNode(.{827 .@"anytype" => return c.addNode(.{
836 .tag = .@"anytype",828 .tag = .@"anytype",
837 .main_token = try c.addToken(.keyword_anytype, "anytype"),829 .main_token = try c.addToken(.keyword_anytype, "anytype"),
838 .data = .{830 .data = .{
...@@ -840,7 +832,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -840,7 +832,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
840 .rhs = undefined,832 .rhs = undefined,
841 },833 },
842 }),834 }),
843 .noreturn_type => return try c.addNode(.{835 .noreturn_type => return c.addNode(.{
844 .tag = .identifier,836 .tag = .identifier,
845 .main_token = try c.addToken(.identifier, "noreturn"),837 .main_token = try c.addToken(.identifier, "noreturn"),
846 .data = .{838 .data = .{
...@@ -848,6 +840,53 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -848,6 +840,53 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
848 .rhs = undefined,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 .type => {890 .type => {
852 const payload = node.castTag(.type).?.data;891 const payload = node.castTag(.type).?.data;
853 return c.addNode(.{892 return c.addNode(.{
...@@ -1093,6 +1132,43 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -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 else => return c.addNode(.{1172 else => return c.addNode(.{
1097 .tag = .identifier,1173 .tag = .identifier,
1098 .main_token = try c.addTokenFmt(.identifier, "@\"TODO {}\"", .{node.tag()}),1174 .main_token = try c.addTokenFmt(.identifier, "@\"TODO {}\"", .{node.tag()}),
...@@ -1177,7 +1253,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {...@@ -1177,7 +1253,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
1177 .mod,1253 .mod,
1178 .@"and",1254 .@"and",
1179 .@"or",1255 .@"or",
1180 .xor,
1181 .less_than,1256 .less_than,
1182 .less_than_equal,1257 .less_than_equal,
1183 .greater_than,1258 .greater_than,
...@@ -1243,9 +1318,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {...@@ -1243,9 +1318,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
1243 .shl_assign,1318 .shl_assign,
1244 .shr_assign,1319 .shr_assign,
1245 .mod_assign,1320 .mod_assign,
1246 .and_assign,
1247 .or_assign,
1248 .xor_assign,
1249 .bit_and_assign,1321 .bit_and_assign,
1250 .bit_or_assign,1322 .bit_or_assign,
1251 .bit_xor_assign,1323 .bit_xor_assign,
...@@ -1271,6 +1343,19 @@ fn renderPrefixOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: T...@@ -1271,6 +1343,19 @@ fn renderPrefixOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: T
1271 });1343 });
1272}1344}
12731345
1346fn 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
1274fn renderStdImport(c: *Context, first: []const u8, second: []const u8) !NodeIndex {1359fn renderStdImport(c: *Context, first: []const u8, second: []const u8) !NodeIndex {
1275 const import_tok = try c.addToken(.builtin, "@import");1360 const import_tok = try c.addToken(.builtin, "@import");
1276 _ = try c.addToken(.l_paren, "(");1361 _ = try c.addToken(.l_paren, "(");