| ... | ... | @@ -914,12 +914,19 @@ const Parser = struct { |
| 914 | 914 | continue; |
| 915 | 915 | }, |
| 916 | 916 | State.VarDeclEq => |var_decl| { |
| 917 | | var_decl.eq_token = %return self.eatToken(Token.Id.Equal); |
| 918 | | stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable; |
| 919 | | %return stack.append(State { |
| 920 | | .Expression = removeNullCast(&var_decl.init_node), |
| 921 | | }); |
| 922 | | continue; |
| 917 | const token = self.getNextToken(); |
| 918 | if (token.id == Token.Id.Equal) { |
| 919 | var_decl.eq_token = token; |
| 920 | stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable; |
| 921 | %return stack.append(State { |
| 922 | .Expression = removeNullCast(&var_decl.init_node), |
| 923 | }); |
| 924 | continue; |
| 925 | } |
| 926 | if (token.id == Token.Id.Semicolon) { |
| 927 | continue; |
| 928 | } |
| 929 | return self.parseError(token, "expected '=' or ';', found {}", @tagName(token.id)); |
| 923 | 930 | }, |
| 924 | 931 | State.ExpectToken => |token_id| { |
| 925 | 932 | _ = %return self.eatToken(token_id); |
| ... | ... | @@ -1345,6 +1352,7 @@ const Parser = struct { |
| 1345 | 1352 | Text: []const u8, |
| 1346 | 1353 | Expression: &AstNode, |
| 1347 | 1354 | AddrOfExprBit: &AstNodeAddrOfExpr, |
| 1355 | VarDeclAlign: &AstNodeVarDecl, |
| 1348 | 1356 | }; |
| 1349 | 1357 | |
| 1350 | 1358 | pub fn renderSource(self: &Parser, stream: &std.io.OutStream, root_node: &AstNodeRoot) -> %void { |
| ... | ... | @@ -1417,16 +1425,27 @@ const Parser = struct { |
| 1417 | 1425 | %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token)); |
| 1418 | 1426 | %return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token)); |
| 1419 | 1427 | |
| 1420 | | %return stream.print(" = "); |
| 1421 | | |
| 1422 | | %return stack.append(RenderState { .Text = ";\n" }); |
| 1423 | | if (var_decl.init_node) |init_node| { |
| 1424 | | %return stack.append(RenderState { .Expression = init_node }); |
| 1428 | %return stack.append(RenderState { .VarDeclAlign = var_decl }); |
| 1429 | if (var_decl.type_node) |type_node| { |
| 1430 | %return stream.print(": "); |
| 1431 | %return stack.append(RenderState { .Expression = type_node }); |
| 1425 | 1432 | } |
| 1426 | 1433 | }, |
| 1427 | 1434 | else => unreachable, |
| 1428 | 1435 | } |
| 1429 | 1436 | }, |
| 1437 | |
| 1438 | RenderState.VarDeclAlign => |var_decl| { |
| 1439 | if (var_decl.align_node != null) { |
| 1440 | @panic("TODO"); |
| 1441 | } |
| 1442 | %return stack.append(RenderState { .Text = ";\n" }); |
| 1443 | if (var_decl.init_node) |init_node| { |
| 1444 | %return stream.print(" = "); |
| 1445 | %return stack.append(RenderState { .Expression = init_node }); |
| 1446 | } |
| 1447 | }, |
| 1448 | |
| 1430 | 1449 | RenderState.ParamDecl => |base| { |
| 1431 | 1450 | const param_decl = @fieldParentPtr(AstNodeParamDecl, "base", base); |
| 1432 | 1451 | if (param_decl.comptime_token) |comptime_token| { |
| ... | ... | @@ -1597,6 +1616,15 @@ test "zig fmt" { |
| 1597 | 1616 | \\pub const a = b; |
| 1598 | 1617 | \\var a = b; |
| 1599 | 1618 | \\pub var a = b; |
| 1619 | \\const a: i32 = b; |
| 1620 | \\pub const a: i32 = b; |
| 1621 | \\var a: i32 = b; |
| 1622 | \\pub var a: i32 = b; |
| 1623 | \\ |
| 1624 | ); |
| 1625 | |
| 1626 | testCanonical( |
| 1627 | \\extern var foo: c_int; |
| 1600 | 1628 | \\ |
| 1601 | 1629 | ); |
| 1602 | 1630 | } |