| author | |
| committer | |
| log | b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22 |
| tree | d268fccb56981f6f060d46f73680af77e57e1af9 |
| parent | a00fd6e25469a9929defea95425a1c312a68cf0e |
| signature |
4 files changed, 24 insertions(+), 11 deletions(-)
doc/langref.html.in+5-5| ... | ... | @@ -10090,7 +10090,7 @@ FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? Link |
| 10090 | 10090 | |
| 10091 | 10091 | VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON |
| 10092 | 10092 | |
| 10093 | ContainerField <- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)? | |
| 10093 | ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)? | |
| 10094 | 10094 | |
| 10095 | 10095 | # *** Block Level *** |
| 10096 | 10096 | Statement |
| ... | ... | @@ -10204,7 +10204,7 @@ PrimaryTypeExpr |
| 10204 | 10204 | / KEYWORD_error DOT IDENTIFIER |
| 10205 | 10205 | / KEYWORD_false |
| 10206 | 10206 | / KEYWORD_null |
| 10207 | / KEYWORD_promise | |
| 10207 | / KEYWORD_anyframe | |
| 10208 | 10208 | / KEYWORD_true |
| 10209 | 10209 | / KEYWORD_undefined |
| 10210 | 10210 | / KEYWORD_unreachable |
| ... | ... | @@ -10348,7 +10348,7 @@ PrefixOp |
| 10348 | 10348 | |
| 10349 | 10349 | PrefixTypeOp |
| 10350 | 10350 | <- QUESTIONMARK |
| 10351 | / KEYWORD_promise MINUSRARROW | |
| 10351 | / KEYWORD_anyframe MINUSRARROW | |
| 10352 | 10352 | / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* |
| 10353 | 10353 | / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* |
| 10354 | 10354 | |
| ... | ... | @@ -10495,6 +10495,7 @@ end_of_word <- ![a-zA-Z0-9_] skip |
| 10495 | 10495 | KEYWORD_align <- 'align' end_of_word |
| 10496 | 10496 | KEYWORD_allowzero <- 'allowzero' end_of_word |
| 10497 | 10497 | KEYWORD_and <- 'and' end_of_word |
| 10498 | KEYWORD_anyframe <- 'anyframe' end_of_word | |
| 10498 | 10499 | KEYWORD_asm <- 'asm' end_of_word |
| 10499 | 10500 | KEYWORD_async <- 'async' end_of_word |
| 10500 | 10501 | KEYWORD_await <- 'await' end_of_word |
| ... | ... | @@ -10521,7 +10522,6 @@ KEYWORD_null <- 'null' end_of_word |
| 10521 | 10522 | KEYWORD_or <- 'or' end_of_word |
| 10522 | 10523 | KEYWORD_orelse <- 'orelse' end_of_word |
| 10523 | 10524 | KEYWORD_packed <- 'packed' end_of_word |
| 10524 | KEYWORD_promise <- 'promise' end_of_word | |
| 10525 | 10525 | KEYWORD_pub <- 'pub' end_of_word |
| 10526 | 10526 | KEYWORD_resume <- 'resume' end_of_word |
| 10527 | 10527 | KEYWORD_return <- 'return' end_of_word |
| ... | ... | @@ -10548,7 +10548,7 @@ keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_allowzero / KEYWORD_asm |
| 10548 | 10548 | / KEYWORD_error / KEYWORD_export / KEYWORD_extern / KEYWORD_false |
| 10549 | 10549 | / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline |
| 10550 | 10550 | / KEYWORD_noalias / KEYWORD_null / KEYWORD_or |
| 10551 | / KEYWORD_orelse / KEYWORD_packed / KEYWORD_promise / KEYWORD_pub | |
| 10551 | / KEYWORD_orelse / KEYWORD_packed / KEYWORD_anyframe / KEYWORD_pub | |
| 10552 | 10552 | / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection |
| 10553 | 10553 | / KEYWORD_struct / KEYWORD_suspend |
| 10554 | 10554 | / KEYWORD_switch / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_true / KEYWORD_try |
lib/std/zig/parse.zig+6-3| ... | ... | @@ -69,8 +69,8 @@ fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error |
| 69 | 69 | /// <- TestDecl ContainerMembers |
| 70 | 70 | /// / TopLevelComptime ContainerMembers |
| 71 | 71 | /// / KEYWORD_pub? TopLevelDecl ContainerMembers |
| 72 | /// / KEYWORD_pub? ContainerField COMMA ContainerMembers | |
| 73 | /// / KEYWORD_pub? ContainerField | |
| 72 | /// / ContainerField COMMA ContainerMembers | |
| 73 | /// / ContainerField | |
| 74 | 74 | /// / |
| 75 | 75 | fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree, top_level: bool) !Node.Root.DeclList { |
| 76 | 76 | var list = Node.Root.DeclList.init(arena); |
| ... | ... | @@ -284,7 +284,10 @@ fn findNextContainerMember(it: *TokenIterator) void { |
| 284 | 284 | } |
| 285 | 285 | }, |
| 286 | 286 | .LParen, .LBracket, .LBrace => level += 1, |
| 287 | .RParen, .RBracket, .RBrace => { | |
| 287 | .RParen, .RBracket => { | |
| 288 | if (level != 0) level -= 1; | |
| 289 | }, | |
| 290 | .RBrace => { | |
| 288 | 291 | if (level == 0) { |
| 289 | 292 | // end of container, exit |
| 290 | 293 | putBackToken(it, tok.index); |
lib/std/zig/parser_test.zig+10| ... | ... | @@ -162,6 +162,16 @@ test "recovery: extra '}' at top level" { |
| 162 | 162 | }); |
| 163 | 163 | } |
| 164 | 164 | |
| 165 | test "recovery: mismatched bracket at top level" { | |
| 166 | try testError( | |
| 167 | \\const S = struct { | |
| 168 | \\ arr: 128]?G | |
| 169 | \\}; | |
| 170 | , &[_]Error{ | |
| 171 | .ExpectedToken, | |
| 172 | }); | |
| 173 | } | |
| 174 | ||
| 165 | 175 | test "zig fmt: top-level fields" { |
| 166 | 176 | try testCanonical( |
| 167 | 177 | \\a: did_you_know, |
src/parser.cpp+3-3| ... | ... | @@ -538,8 +538,8 @@ enum ContainerFieldState { |
| 538 | 538 | // <- TestDecl ContainerMembers |
| 539 | 539 | // / TopLevelComptime ContainerMembers |
| 540 | 540 | // / KEYWORD_pub? TopLevelDecl ContainerMembers |
| 541 | // / KEYWORD_comptime? ContainerField COMMA ContainerMembers | |
| 542 | // / KEYWORD_comptime? ContainerField | |
| 541 | // / ContainerField COMMA ContainerMembers | |
| 542 | // / ContainerField | |
| 543 | 543 | // / |
| 544 | 544 | static AstNodeContainerDecl ast_parse_container_members(ParseContext *pc) { |
| 545 | 545 | AstNodeContainerDecl res = {}; |
| ... | ... | @@ -862,7 +862,7 @@ static AstNode *ast_parse_var_decl(ParseContext *pc) { |
| 862 | 862 | return res; |
| 863 | 863 | } |
| 864 | 864 | |
| 865 | // ContainerField <- IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)? | |
| 865 | // ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)? | |
| 866 | 866 | static AstNode *ast_parse_container_field(ParseContext *pc) { |
| 867 | 867 | Token *identifier = eat_token_if(pc, TokenIdSymbol); |
| 868 | 868 | if (identifier == nullptr) |