| ... | ... | @@ -249,7 +249,7 @@ pub const Parser = struct { |
| 249 | 249 | const name = try self.createStringLiteral(arena, name_token); |
| 250 | 250 | const block = try self.createBlock(arena, token); |
| 251 | 251 | const test_decl = try self.createAttachTestDecl(arena, &root_node.decls, token, &name.base, block); |
| 252 | | try stack.append(State { .Block = block }); |
| 252 | stack.append(State { .Block = block }) catch unreachable; |
| 253 | 253 | continue; |
| 254 | 254 | }, |
| 255 | 255 | Token.Id.Eof => { |
| ... | ... | @@ -318,14 +318,14 @@ pub const Parser = struct { |
| 318 | 318 | // TODO shouldn't need these casts |
| 319 | 319 | const var_decl_node = try self.createAttachVarDecl(arena, ctx.decls, ctx.visib_token, |
| 320 | 320 | token, (?Token)(null), ctx.extern_token, ctx.lib_name); |
| 321 | | try stack.append(State { .VarDecl = var_decl_node }); |
| 321 | stack.append(State { .VarDecl = var_decl_node }) catch unreachable; |
| 322 | 322 | continue; |
| 323 | 323 | }, |
| 324 | 324 | Token.Id.Keyword_fn => { |
| 325 | 325 | // TODO shouldn't need these casts |
| 326 | 326 | const fn_proto = try self.createAttachFnProto(arena, ctx.decls, token, |
| 327 | 327 | ctx.extern_token, ctx.lib_name, (?Token)(null), ctx.visib_token, (?Token)(null)); |
| 328 | | try stack.append(State { .FnDef = fn_proto }); |
| 328 | stack.append(State { .FnDef = fn_proto }) catch unreachable; |
| 329 | 329 | try stack.append(State { .FnProto = fn_proto }); |
| 330 | 330 | continue; |
| 331 | 331 | }, |
| ... | ... | @@ -333,7 +333,7 @@ pub const Parser = struct { |
| 333 | 333 | // TODO shouldn't need this cast |
| 334 | 334 | const fn_proto = try self.createAttachFnProto(arena, ctx.decls, undefined, |
| 335 | 335 | ctx.extern_token, ctx.lib_name, (?Token)(token), (?Token)(null), (?Token)(null)); |
| 336 | | try stack.append(State { .FnDef = fn_proto }); |
| 336 | stack.append(State { .FnDef = fn_proto }) catch unreachable; |
| 337 | 337 | try stack.append(State { .FnProto = fn_proto }); |
| 338 | 338 | try stack.append(State { |
| 339 | 339 | .ExpectTokenSave = ExpectTokenSave { |
| ... | ... | @@ -425,7 +425,7 @@ pub const Parser = struct { |
| 425 | 425 | }; |
| 426 | 426 | ctx.dest_ptr.store(&node.base); |
| 427 | 427 | |
| 428 | | try stack.append(State { .ContainerDecl = node }); |
| 428 | stack.append(State { .ContainerDecl = node }) catch unreachable; |
| 429 | 429 | try stack.append(State { .ExpectToken = Token.Id.LBrace }); |
| 430 | 430 | |
| 431 | 431 | const lparen = self.getNextToken(); |
| ... | ... | @@ -470,7 +470,7 @@ pub const Parser = struct { |
| 470 | 470 | }; |
| 471 | 471 | try container_decl.fields_and_decls.append(&node.base); |
| 472 | 472 | |
| 473 | | try stack.append(State { .FieldListCommaOrEnd = container_decl }); |
| 473 | stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable; |
| 474 | 474 | try stack.append(State { .Expression = DestPtr { .Field = &node.type_expr } }); |
| 475 | 475 | try stack.append(State { .ExpectToken = Token.Id.Colon }); |
| 476 | 476 | continue; |
| ... | ... | @@ -484,7 +484,7 @@ pub const Parser = struct { |
| 484 | 484 | }; |
| 485 | 485 | try container_decl.fields_and_decls.append(&node.base); |
| 486 | 486 | |
| 487 | | try stack.append(State { .FieldListCommaOrEnd = container_decl }); |
| 487 | stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable; |
| 488 | 488 | |
| 489 | 489 | const next = self.getNextToken(); |
| 490 | 490 | if (next.id != Token.Id.Colon) { |
| ... | ... | @@ -504,7 +504,7 @@ pub const Parser = struct { |
| 504 | 504 | }; |
| 505 | 505 | try container_decl.fields_and_decls.append(&node.base); |
| 506 | 506 | |
| 507 | | try stack.append(State { .FieldListCommaOrEnd = container_decl }); |
| 507 | stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable; |
| 508 | 508 | |
| 509 | 509 | const next = self.getNextToken(); |
| 510 | 510 | if (next.id != Token.Id.Equal) { |
| ... | ... | @@ -629,8 +629,8 @@ pub const Parser = struct { |
| 629 | 629 | }, |
| 630 | 630 | |
| 631 | 631 | State.AssignmentExpressionBegin => |dest_ptr| { |
| 632 | | try stack.append(State { .AssignmentExpressionEnd = dest_ptr }); |
| 633 | | stack.append(State { .UnwrapExpressionBegin = dest_ptr }) catch unreachable; |
| 632 | stack.append(State { .AssignmentExpressionEnd = dest_ptr }) catch unreachable; |
| 633 | try stack.append(State { .UnwrapExpressionBegin = dest_ptr }); |
| 634 | 634 | continue; |
| 635 | 635 | }, |
| 636 | 636 | |
| ... | ... | @@ -926,7 +926,6 @@ pub const Parser = struct { |
| 926 | 926 | } |
| 927 | 927 | |
| 928 | 928 | const next = self.getNextToken(); |
| 929 | | self.putBackToken(token); |
| 930 | 929 | switch (next.id) { |
| 931 | 930 | Token.Id.Period => { |
| 932 | 931 | const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp { |
| ... | ... | @@ -943,6 +942,7 @@ pub const Parser = struct { |
| 943 | 942 | .ptr = &node.rtoken, |
| 944 | 943 | } |
| 945 | 944 | }); |
| 945 | self.putBackToken(next); |
| 946 | 946 | continue; |
| 947 | 947 | }, |
| 948 | 948 | else => { |
| ... | ... | @@ -960,6 +960,7 @@ pub const Parser = struct { |
| 960 | 960 | .ptr = &node.rtoken, |
| 961 | 961 | } |
| 962 | 962 | }); |
| 963 | self.putBackToken(next); |
| 963 | 964 | continue; |
| 964 | 965 | }, |
| 965 | 966 | } |
| ... | ... | @@ -1180,12 +1181,12 @@ pub const Parser = struct { |
| 1180 | 1181 | .rparen = undefined, |
| 1181 | 1182 | }; |
| 1182 | 1183 | dest_ptr.store(&node.base); |
| 1183 | | try stack.append(State { |
| 1184 | stack.append(State { |
| 1184 | 1185 | .ExpectTokenSave = ExpectTokenSave { |
| 1185 | 1186 | .id = Token.Id.RParen, |
| 1186 | 1187 | .ptr = &node.rparen, |
| 1187 | 1188 | } |
| 1188 | | }); |
| 1189 | }) catch unreachable; |
| 1189 | 1190 | try stack.append(State { .Expression = DestPtr { .Field = &node.expr } }); |
| 1190 | 1191 | continue; |
| 1191 | 1192 | }, |
| ... | ... | @@ -1202,17 +1203,18 @@ pub const Parser = struct { |
| 1202 | 1203 | .rparen_token = undefined, |
| 1203 | 1204 | }; |
| 1204 | 1205 | dest_ptr.store(&node.base); |
| 1205 | | try stack.append(State { |
| 1206 | stack.append(State { |
| 1206 | 1207 | .ExprListItemOrEnd = ListState(&ast.Node) { |
| 1207 | 1208 | .list = &node.params, |
| 1208 | 1209 | .end = Token.Id.RParen, |
| 1209 | 1210 | .ptr = &node.rparen_token, |
| 1210 | 1211 | } |
| 1211 | | }); |
| 1212 | }) catch unreachable; |
| 1212 | 1213 | try stack.append(State { .ExpectToken = Token.Id.LParen, }); |
| 1213 | 1214 | continue; |
| 1214 | 1215 | }, |
| 1215 | 1216 | Token.Id.LBracket => { |
| 1217 | // TODO: option("align" "(" Expression option(":" Integer ":" Integer) ")")) option("const") option("volatile") |
| 1216 | 1218 | const rbracket_token = self.getNextToken(); |
| 1217 | 1219 | if (rbracket_token.id == Token.Id.RBracket) { |
| 1218 | 1220 | const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{ |
| ... | ... | @@ -1225,7 +1227,8 @@ pub const Parser = struct { |
| 1225 | 1227 | } |
| 1226 | 1228 | }); |
| 1227 | 1229 | dest_ptr.store(&node.base); |
| 1228 | | try stack.append(State { .AddrOfModifiers = &node.op.AddrOf }); |
| 1230 | stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable; |
| 1231 | try stack.append(State { .AddrOfModifiers = &node.op.SliceType }); |
| 1229 | 1232 | continue; |
| 1230 | 1233 | } |
| 1231 | 1234 | |
| ... | ... | @@ -1235,6 +1238,7 @@ pub const Parser = struct { |
| 1235 | 1238 | .ArrayType = undefined, |
| 1236 | 1239 | }); |
| 1237 | 1240 | dest_ptr.store(&node.base); |
| 1241 | stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable; |
| 1238 | 1242 | try stack.append(State { .ExpectToken = Token.Id.RBracket }); |
| 1239 | 1243 | try stack.append(State { .Expression = DestPtr { .Field = &node.op.ArrayType } }); |
| 1240 | 1244 | |
| ... | ... | @@ -1302,32 +1306,32 @@ pub const Parser = struct { |
| 1302 | 1306 | continue; |
| 1303 | 1307 | }, |
| 1304 | 1308 | Token.Id.Keyword_packed => { |
| 1305 | | try stack.append(State { |
| 1309 | stack.append(State { |
| 1306 | 1310 | .ContainerExtern = ContainerExternCtx { |
| 1307 | 1311 | .dest_ptr = dest_ptr, |
| 1308 | 1312 | .ltoken = token, |
| 1309 | 1313 | .layout = ast.NodeContainerDecl.Layout.Packed, |
| 1310 | 1314 | }, |
| 1311 | | }); |
| 1315 | }) catch unreachable; |
| 1312 | 1316 | }, |
| 1313 | 1317 | Token.Id.Keyword_extern => { |
| 1314 | | try stack.append(State { |
| 1318 | stack.append(State { |
| 1315 | 1319 | .ContainerExtern = ContainerExternCtx { |
| 1316 | 1320 | .dest_ptr = dest_ptr, |
| 1317 | 1321 | .ltoken = token, |
| 1318 | 1322 | .layout = ast.NodeContainerDecl.Layout.Extern, |
| 1319 | 1323 | }, |
| 1320 | | }); |
| 1324 | }) catch unreachable; |
| 1321 | 1325 | }, |
| 1322 | 1326 | Token.Id.Keyword_struct, Token.Id.Keyword_union, Token.Id.Keyword_enum => { |
| 1323 | 1327 | self.putBackToken(token); |
| 1324 | | try stack.append(State { |
| 1328 | stack.append(State { |
| 1325 | 1329 | .ContainerExtern = ContainerExternCtx { |
| 1326 | 1330 | .dest_ptr = dest_ptr, |
| 1327 | 1331 | .ltoken = token, |
| 1328 | 1332 | .layout = ast.NodeContainerDecl.Layout.Auto, |
| 1329 | 1333 | }, |
| 1330 | | }); |
| 1334 | }) catch unreachable; |
| 1331 | 1335 | }, |
| 1332 | 1336 | Token.Id.LBrace => { |
| 1333 | 1337 | @panic("TODO: Block expr"); |
| ... | ... | @@ -1361,12 +1365,12 @@ pub const Parser = struct { |
| 1361 | 1365 | const rbracket_token = self.getNextToken(); |
| 1362 | 1366 | if (rbracket_token.id != Token.Id.RBracket) { |
| 1363 | 1367 | self.putBackToken(rbracket_token); |
| 1364 | | try stack.append(State { |
| 1368 | stack.append(State { |
| 1365 | 1369 | .ExpectTokenSave = ExpectTokenSave { |
| 1366 | 1370 | .id = Token.Id.RBracket, |
| 1367 | 1371 | .ptr = &node.rtoken, |
| 1368 | 1372 | } |
| 1369 | | }); |
| 1373 | }) catch unreachable; |
| 1370 | 1374 | try stack.append(State { .Expression = DestPtr { .NullableField = &node.op.Slice.end } }); |
| 1371 | 1375 | } else { |
| 1372 | 1376 | node.rtoken = rbracket_token; |
| ... | ... | @@ -1638,7 +1642,7 @@ pub const Parser = struct { |
| 1638 | 1642 | // TODO shouldn't need these casts |
| 1639 | 1643 | const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null), |
| 1640 | 1644 | mut_token, (?Token)(comptime_token), (?Token)(null), null); |
| 1641 | | try stack.append(State { .VarDecl = var_decl }); |
| 1645 | stack.append(State { .VarDecl = var_decl }) catch unreachable; |
| 1642 | 1646 | continue; |
| 1643 | 1647 | } |
| 1644 | 1648 | self.putBackToken(mut_token); |
| ... | ... | @@ -1652,7 +1656,7 @@ pub const Parser = struct { |
| 1652 | 1656 | // TODO shouldn't need these casts |
| 1653 | 1657 | const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null), |
| 1654 | 1658 | mut_token, (?Token)(null), (?Token)(null), null); |
| 1655 | | try stack.append(State { .VarDecl = var_decl }); |
| 1659 | stack.append(State { .VarDecl = var_decl }) catch unreachable; |
| 1656 | 1660 | continue; |
| 1657 | 1661 | } |
| 1658 | 1662 | self.putBackToken(mut_token); |
| ... | ... | @@ -2132,6 +2136,7 @@ pub const Parser = struct { |
| 2132 | 2136 | Expression: &ast.Node, |
| 2133 | 2137 | VarDecl: &ast.NodeVarDecl, |
| 2134 | 2138 | Statement: &ast.Node, |
| 2139 | FieldInitializer: &ast.NodeFieldInitializer, |
| 2135 | 2140 | PrintIndent, |
| 2136 | 2141 | Indent: usize, |
| 2137 | 2142 | }; |
| ... | ... | @@ -2246,6 +2251,12 @@ pub const Parser = struct { |
| 2246 | 2251 | } |
| 2247 | 2252 | }, |
| 2248 | 2253 | |
| 2254 | RenderState.FieldInitializer => |field_init| { |
| 2255 | try stream.print(".{}", self.tokenizer.getTokenSlice(field_init.name_token)); |
| 2256 | try stream.print(" = "); |
| 2257 | try stack.append(RenderState { .Expression = field_init.expr }); |
| 2258 | }, |
| 2259 | |
| 2249 | 2260 | RenderState.VarDecl => |var_decl| { |
| 2250 | 2261 | try stack.append(RenderState { .Text = ";" }); |
| 2251 | 2262 | if (var_decl.init_node) |init_node| { |
| ... | ... | @@ -2481,8 +2492,34 @@ pub const Parser = struct { |
| 2481 | 2492 | try stack.append(RenderState { .Expression = range.start}); |
| 2482 | 2493 | try stack.append(RenderState { .Text = "["}); |
| 2483 | 2494 | }, |
| 2484 | | ast.NodeSuffixOp.SuffixOp.StructInitializer => @panic("TODO: StructInitializer"), |
| 2485 | | ast.NodeSuffixOp.SuffixOp.ArrayInitializer => @panic("TODO: ArrayInitializer"), |
| 2495 | ast.NodeSuffixOp.SuffixOp.StructInitializer => |field_inits| { |
| 2496 | try stack.append(RenderState { .Text = " }"}); |
| 2497 | var i = field_inits.len; |
| 2498 | while (i != 0) { |
| 2499 | i -= 1; |
| 2500 | const field_init = field_inits.at(i); |
| 2501 | try stack.append(RenderState { .FieldInitializer = field_init }); |
| 2502 | try stack.append(RenderState { .Text = " " }); |
| 2503 | if (i != 0) { |
| 2504 | try stack.append(RenderState { .Text = "," }); |
| 2505 | } |
| 2506 | } |
| 2507 | try stack.append(RenderState { .Text = "{"}); |
| 2508 | }, |
| 2509 | ast.NodeSuffixOp.SuffixOp.ArrayInitializer => |exprs| { |
| 2510 | try stack.append(RenderState { .Text = " }"}); |
| 2511 | var i = exprs.len; |
| 2512 | while (i != 0) { |
| 2513 | i -= 1; |
| 2514 | const expr = exprs.at(i); |
| 2515 | try stack.append(RenderState { .Expression = expr }); |
| 2516 | try stack.append(RenderState { .Text = " " }); |
| 2517 | if (i != 0) { |
| 2518 | try stack.append(RenderState { .Text = "," }); |
| 2519 | } |
| 2520 | } |
| 2521 | try stack.append(RenderState { .Text = "{"}); |
| 2522 | }, |
| 2486 | 2523 | } |
| 2487 | 2524 | |
| 2488 | 2525 | try stack.append(RenderState { .Expression = suffix_op.lhs }); |
| ... | ... | @@ -3011,6 +3048,10 @@ test "zig fmt: precedence" { |
| 3011 | 3048 | \\ (a!b)(); |
| 3012 | 3049 | \\ !a!b; |
| 3013 | 3050 | \\ !(a!b); |
| 3051 | \\ !a{ }; |
| 3052 | \\ !(a{ }); |
| 3053 | \\ a + b{ }; |
| 3054 | \\ (a + b){ }; |
| 3014 | 3055 | \\ a << b + c; |
| 3015 | 3056 | \\ (a << b) + c; |
| 3016 | 3057 | \\ a & b << c; |
| ... | ... | @@ -3030,10 +3071,6 @@ test "zig fmt: precedence" { |
| 3030 | 3071 | \\ (a = b) or c; |
| 3031 | 3072 | \\} |
| 3032 | 3073 | \\ |
| 3033 | | //\\ !a{}; |
| 3034 | | //\\ !(a{}); |
| 3035 | | //\\ a + b{}; |
| 3036 | | //\\ (a + b){}; |
| 3037 | 3074 | ); |
| 3038 | 3075 | } |
| 3039 | 3076 | |
| ... | ... | @@ -3233,23 +3270,12 @@ test "zig fmt: error set declaration" { |
| 3233 | 3270 | ); |
| 3234 | 3271 | } |
| 3235 | 3272 | |
| 3236 | | test "zig fmt: catch" { |
| 3237 | | try testCanonical( |
| 3238 | | \\test "catch" { |
| 3239 | | \\ const a: error!u8 = 0; |
| 3240 | | \\ _ = a catch return; |
| 3241 | | \\ _ = a catch |err| return; |
| 3242 | | \\} |
| 3243 | | \\ |
| 3244 | | ); |
| 3245 | | } |
| 3246 | | |
| 3247 | 3273 | test "zig fmt: arrays" { |
| 3248 | 3274 | try testCanonical( |
| 3249 | 3275 | \\test "test array" { |
| 3250 | 3276 | \\ const a: [2]u8 = [2]u8{ 1, 2 }; |
| 3251 | 3277 | \\ const a: [2]u8 = []u8{ 1, 2 }; |
| 3252 | | \\ const a: [0]u8 = []u8{}; |
| 3278 | \\ const a: [0]u8 = []u8{ }; |
| 3253 | 3279 | \\} |
| 3254 | 3280 | \\ |
| 3255 | 3281 | ); |
| ... | ... | @@ -3260,7 +3286,18 @@ test "zig fmt: container initializers" { |
| 3260 | 3286 | \\const a1 = []u8{ }; |
| 3261 | 3287 | \\const a2 = []u8{ 1, 2, 3, 4 }; |
| 3262 | 3288 | \\const s1 = S{ }; |
| 3263 | | \\const s2 = S{ .a = 1, .b = 2, }; |
| 3289 | \\const s2 = S{ .a = 1, .b = 2 }; |
| 3290 | \\ |
| 3291 | ); |
| 3292 | } |
| 3293 | |
| 3294 | test "zig fmt: catch" { |
| 3295 | try testCanonical( |
| 3296 | \\test "catch" { |
| 3297 | \\ const a: error!u8 = 0; |
| 3298 | \\ _ = a catch return; |
| 3299 | \\ _ = a catch |err| return; |
| 3300 | \\} |
| 3264 | 3301 | \\ |
| 3265 | 3302 | ); |
| 3266 | 3303 | } |