| ... | ... | @@ -213,7 +213,7 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All |
| 213 | 213 | .ExpectedToken = .{ .token = index, .expected_id = .Comma }, |
| 214 | 214 | }); |
| 215 | 215 | continue; |
| 216 | | } |
| 216 | }, |
| 217 | 217 | } |
| 218 | 218 | }; |
| 219 | 219 | if (try parseAppendedDocComment(arena, it, tree, comma)) |appended_comment| |
| ... | ... | @@ -245,6 +245,7 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All |
| 245 | 245 | return list; |
| 246 | 246 | } |
| 247 | 247 | |
| 248 | /// Attempts to find next container member by searching for certain tokens |
| 248 | 249 | fn findNextContainerMember(it: *TokenIterator) void { |
| 249 | 250 | var level: u32 = 0; |
| 250 | 251 | while (true) { |
| ... | ... | @@ -294,27 +295,30 @@ fn findNextContainerMember(it: *TokenIterator) void { |
| 294 | 295 | } |
| 295 | 296 | } |
| 296 | 297 | |
| 297 | | /// Attempts to find `wanted` token, keeps track of parentheses. |
| 298 | | fn findToken(it: *TokenIterator, wanted: Token.Id) void { |
| 299 | | var count: u32 = 0; |
| 298 | /// Attempts to find the next statement by searching for a semicolon |
| 299 | fn findNextStmt(it: *TokenIterator) void { |
| 300 | var level: u32 = 0; |
| 300 | 301 | while (true) { |
| 301 | 302 | const tok = nextToken(it); |
| 302 | 303 | switch (tok.ptr.id) { |
| 303 | | .LParen, .LBracket, .LBrace => count += 1, |
| 304 | | .RParen, .RBracket, .RBrace => { |
| 305 | | if (count == 0) { |
| 304 | .LBrace => level += 1, |
| 305 | .RBrace => { |
| 306 | if (level == 0) { |
| 306 | 307 | putBackToken(it, tok.index); |
| 307 | 308 | return; |
| 308 | 309 | } |
| 309 | | count -= 1; |
| 310 | level -= 1; |
| 311 | }, |
| 312 | .Semicolon => { |
| 313 | if (level == 0) { |
| 314 | return; |
| 315 | } |
| 310 | 316 | }, |
| 311 | 317 | .Eof => { |
| 312 | 318 | putBackToken(it, tok.index); |
| 313 | 319 | return; |
| 314 | 320 | }, |
| 315 | | else => { |
| 316 | | if (tok.ptr.id == wanted and count == 0) return; |
| 317 | | }, |
| 321 | else => {}, |
| 318 | 322 | } |
| 319 | 323 | } |
| 320 | 324 | } |
| ... | ... | @@ -1186,7 +1190,7 @@ fn parseBlock(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 1186 | 1190 | error.OutOfMemory => return error.OutOfMemory, |
| 1187 | 1191 | error.ParseError => { |
| 1188 | 1192 | // try to skip to the next statement |
| 1189 | | findToken(it, .Semicolon); |
| 1193 | findNextStmt(it); |
| 1190 | 1194 | continue; |
| 1191 | 1195 | }, |
| 1192 | 1196 | }) orelse break; |