Attempts to find next container member by searching for certain tokens
fn findNextContainerMember(p: *Parse) void
fn findNextContainerMember(p: *Parse) void {
if (!p.recover) {
while (p.tokenTag(p.tok_i) != .eof) {
p.tok_i += 1;
}
return;
}
var level: u32 = 0;
while (true) {
const tok = p.nextToken();
switch (p.tokenTag(tok)) {
// Any of these can start a new top level declaration.
.keyword_test,
.keyword_comptime,
.keyword_pub,
.keyword_export,
.keyword_extern,
.keyword_inline,
.keyword_noinline,
.keyword_threadlocal,
.keyword_const,
.keyword_var,
.keyword_fn,
=> {
if (level == 0) {
p.tok_i -= 1;
return;
}
},
.identifier => {
if (p.tokenTag(tok + 1) == .comma and level == 0) {
p.tok_i -= 1;
return;
}
},
.comma, .semicolon => {
// this decl was likely meant to end here
if (level == 0) {
return;
}
},
.l_paren, .l_bracket, .l_brace => level += 1,
.r_paren, .r_bracket => {
if (level != 0) level -= 1;
},
.r_brace => {
if (level == 0) {
// end of container, exit
p.tok_i -= 1;
return;
}
level -= 1;
},
.eof => {
p.tok_i -= 1;
return;
},
else => {},
}
}
}