authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-06 08:56:28+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-06 08:56:28+02:00
loge45de607d6437428d82f69711a8cc8f338d019c8
treea68bbc0aa4cf7f4a764de858314d490c48e70798
parent779247ba114492a28287bc2026719091b7022e1d

std.zig.parser: Initializers are now parsed and fmt correctly


1 files changed, 82 insertions(+), 45 deletions(-)

std/zig/parser.zig+82-45
......@@ -249,7 +249,7 @@ pub const Parser = struct {
249249 const name = try self.createStringLiteral(arena, name_token);
250250 const block = try self.createBlock(arena, token);
251251 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;
253253 continue;
254254 },
255255 Token.Id.Eof => {
......@@ -318,14 +318,14 @@ pub const Parser = struct {
318318 // TODO shouldn't need these casts
319319 const var_decl_node = try self.createAttachVarDecl(arena, ctx.decls, ctx.visib_token,
320320 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;
322322 continue;
323323 },
324324 Token.Id.Keyword_fn => {
325325 // TODO shouldn't need these casts
326326 const fn_proto = try self.createAttachFnProto(arena, ctx.decls, token,
327327 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;
329329 try stack.append(State { .FnProto = fn_proto });
330330 continue;
331331 },
......@@ -333,7 +333,7 @@ pub const Parser = struct {
333333 // TODO shouldn't need this cast
334334 const fn_proto = try self.createAttachFnProto(arena, ctx.decls, undefined,
335335 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;
337337 try stack.append(State { .FnProto = fn_proto });
338338 try stack.append(State {
339339 .ExpectTokenSave = ExpectTokenSave {
......@@ -425,7 +425,7 @@ pub const Parser = struct {
425425 };
426426 ctx.dest_ptr.store(&node.base);
427427
428 try stack.append(State { .ContainerDecl = node });
428 stack.append(State { .ContainerDecl = node }) catch unreachable;
429429 try stack.append(State { .ExpectToken = Token.Id.LBrace });
430430
431431 const lparen = self.getNextToken();
......@@ -470,7 +470,7 @@ pub const Parser = struct {
470470 };
471471 try container_decl.fields_and_decls.append(&node.base);
472472
473 try stack.append(State { .FieldListCommaOrEnd = container_decl });
473 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
474474 try stack.append(State { .Expression = DestPtr { .Field = &node.type_expr } });
475475 try stack.append(State { .ExpectToken = Token.Id.Colon });
476476 continue;
......@@ -484,7 +484,7 @@ pub const Parser = struct {
484484 };
485485 try container_decl.fields_and_decls.append(&node.base);
486486
487 try stack.append(State { .FieldListCommaOrEnd = container_decl });
487 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
488488
489489 const next = self.getNextToken();
490490 if (next.id != Token.Id.Colon) {
......@@ -504,7 +504,7 @@ pub const Parser = struct {
504504 };
505505 try container_decl.fields_and_decls.append(&node.base);
506506
507 try stack.append(State { .FieldListCommaOrEnd = container_decl });
507 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
508508
509509 const next = self.getNextToken();
510510 if (next.id != Token.Id.Equal) {
......@@ -629,8 +629,8 @@ pub const Parser = struct {
629629 },
630630
631631 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 });
634634 continue;
635635 },
636636
......@@ -926,7 +926,6 @@ pub const Parser = struct {
926926 }
927927
928928 const next = self.getNextToken();
929 self.putBackToken(token);
930929 switch (next.id) {
931930 Token.Id.Period => {
932931 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
......@@ -943,6 +942,7 @@ pub const Parser = struct {
943942 .ptr = &node.rtoken,
944943 }
945944 });
945 self.putBackToken(next);
946946 continue;
947947 },
948948 else => {
......@@ -960,6 +960,7 @@ pub const Parser = struct {
960960 .ptr = &node.rtoken,
961961 }
962962 });
963 self.putBackToken(next);
963964 continue;
964965 },
965966 }
......@@ -1180,12 +1181,12 @@ pub const Parser = struct {
11801181 .rparen = undefined,
11811182 };
11821183 dest_ptr.store(&node.base);
1183 try stack.append(State {
1184 stack.append(State {
11841185 .ExpectTokenSave = ExpectTokenSave {
11851186 .id = Token.Id.RParen,
11861187 .ptr = &node.rparen,
11871188 }
1188 });
1189 }) catch unreachable;
11891190 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
11901191 continue;
11911192 },
......@@ -1202,17 +1203,18 @@ pub const Parser = struct {
12021203 .rparen_token = undefined,
12031204 };
12041205 dest_ptr.store(&node.base);
1205 try stack.append(State {
1206 stack.append(State {
12061207 .ExprListItemOrEnd = ListState(&ast.Node) {
12071208 .list = &node.params,
12081209 .end = Token.Id.RParen,
12091210 .ptr = &node.rparen_token,
12101211 }
1211 });
1212 }) catch unreachable;
12121213 try stack.append(State { .ExpectToken = Token.Id.LParen, });
12131214 continue;
12141215 },
12151216 Token.Id.LBracket => {
1217 // TODO: option("align" "(" Expression option(":" Integer ":" Integer) ")")) option("const") option("volatile")
12161218 const rbracket_token = self.getNextToken();
12171219 if (rbracket_token.id == Token.Id.RBracket) {
12181220 const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
......@@ -1225,7 +1227,8 @@ pub const Parser = struct {
12251227 }
12261228 });
12271229 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 });
12291232 continue;
12301233 }
12311234
......@@ -1235,6 +1238,7 @@ pub const Parser = struct {
12351238 .ArrayType = undefined,
12361239 });
12371240 dest_ptr.store(&node.base);
1241 stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
12381242 try stack.append(State { .ExpectToken = Token.Id.RBracket });
12391243 try stack.append(State { .Expression = DestPtr { .Field = &node.op.ArrayType } });
12401244
......@@ -1302,32 +1306,32 @@ pub const Parser = struct {
13021306 continue;
13031307 },
13041308 Token.Id.Keyword_packed => {
1305 try stack.append(State {
1309 stack.append(State {
13061310 .ContainerExtern = ContainerExternCtx {
13071311 .dest_ptr = dest_ptr,
13081312 .ltoken = token,
13091313 .layout = ast.NodeContainerDecl.Layout.Packed,
13101314 },
1311 });
1315 }) catch unreachable;
13121316 },
13131317 Token.Id.Keyword_extern => {
1314 try stack.append(State {
1318 stack.append(State {
13151319 .ContainerExtern = ContainerExternCtx {
13161320 .dest_ptr = dest_ptr,
13171321 .ltoken = token,
13181322 .layout = ast.NodeContainerDecl.Layout.Extern,
13191323 },
1320 });
1324 }) catch unreachable;
13211325 },
13221326 Token.Id.Keyword_struct, Token.Id.Keyword_union, Token.Id.Keyword_enum => {
13231327 self.putBackToken(token);
1324 try stack.append(State {
1328 stack.append(State {
13251329 .ContainerExtern = ContainerExternCtx {
13261330 .dest_ptr = dest_ptr,
13271331 .ltoken = token,
13281332 .layout = ast.NodeContainerDecl.Layout.Auto,
13291333 },
1330 });
1334 }) catch unreachable;
13311335 },
13321336 Token.Id.LBrace => {
13331337 @panic("TODO: Block expr");
......@@ -1361,12 +1365,12 @@ pub const Parser = struct {
13611365 const rbracket_token = self.getNextToken();
13621366 if (rbracket_token.id != Token.Id.RBracket) {
13631367 self.putBackToken(rbracket_token);
1364 try stack.append(State {
1368 stack.append(State {
13651369 .ExpectTokenSave = ExpectTokenSave {
13661370 .id = Token.Id.RBracket,
13671371 .ptr = &node.rtoken,
13681372 }
1369 });
1373 }) catch unreachable;
13701374 try stack.append(State { .Expression = DestPtr { .NullableField = &node.op.Slice.end } });
13711375 } else {
13721376 node.rtoken = rbracket_token;
......@@ -1638,7 +1642,7 @@ pub const Parser = struct {
16381642 // TODO shouldn't need these casts
16391643 const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null),
16401644 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;
16421646 continue;
16431647 }
16441648 self.putBackToken(mut_token);
......@@ -1652,7 +1656,7 @@ pub const Parser = struct {
16521656 // TODO shouldn't need these casts
16531657 const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null),
16541658 mut_token, (?Token)(null), (?Token)(null), null);
1655 try stack.append(State { .VarDecl = var_decl });
1659 stack.append(State { .VarDecl = var_decl }) catch unreachable;
16561660 continue;
16571661 }
16581662 self.putBackToken(mut_token);
......@@ -2132,6 +2136,7 @@ pub const Parser = struct {
21322136 Expression: &ast.Node,
21332137 VarDecl: &ast.NodeVarDecl,
21342138 Statement: &ast.Node,
2139 FieldInitializer: &ast.NodeFieldInitializer,
21352140 PrintIndent,
21362141 Indent: usize,
21372142 };
......@@ -2246,6 +2251,12 @@ pub const Parser = struct {
22462251 }
22472252 },
22482253
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
22492260 RenderState.VarDecl => |var_decl| {
22502261 try stack.append(RenderState { .Text = ";" });
22512262 if (var_decl.init_node) |init_node| {
......@@ -2481,8 +2492,34 @@ pub const Parser = struct {
24812492 try stack.append(RenderState { .Expression = range.start});
24822493 try stack.append(RenderState { .Text = "["});
24832494 },
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 },
24862523 }
24872524
24882525 try stack.append(RenderState { .Expression = suffix_op.lhs });
......@@ -3011,6 +3048,10 @@ test "zig fmt: precedence" {
30113048 \\ (a!b)();
30123049 \\ !a!b;
30133050 \\ !(a!b);
3051 \\ !a{ };
3052 \\ !(a{ });
3053 \\ a + b{ };
3054 \\ (a + b){ };
30143055 \\ a << b + c;
30153056 \\ (a << b) + c;
30163057 \\ a & b << c;
......@@ -3030,10 +3071,6 @@ test "zig fmt: precedence" {
30303071 \\ (a = b) or c;
30313072 \\}
30323073 \\
3033 //\\ !a{};
3034 //\\ !(a{});
3035 //\\ a + b{};
3036 //\\ (a + b){};
30373074 );
30383075}
30393076
......@@ -3233,23 +3270,12 @@ test "zig fmt: error set declaration" {
32333270 );
32343271}
32353272
3236test "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
32473273test "zig fmt: arrays" {
32483274 try testCanonical(
32493275 \\test "test array" {
32503276 \\ const a: [2]u8 = [2]u8{ 1, 2 };
32513277 \\ const a: [2]u8 = []u8{ 1, 2 };
3252 \\ const a: [0]u8 = []u8{};
3278 \\ const a: [0]u8 = []u8{ };
32533279 \\}
32543280 \\
32553281 );
......@@ -3260,7 +3286,18 @@ test "zig fmt: container initializers" {
32603286 \\const a1 = []u8{ };
32613287 \\const a2 = []u8{ 1, 2, 3, 4 };
32623288 \\const s1 = S{ };
3263 \\const s2 = S{ .a = 1, .b = 2, };
3289 \\const s2 = S{ .a = 1, .b = 2 };
3290 \\
3291 );
3292}
3293
3294test "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 \\}
32643301 \\
32653302 );
32663303}