astgen: fix lastToken for BREAK/CONTINUE and ERROR_VALUE
- BREAK/CONTINUE: lhs is opt_token (null=UINT32_MAX), not opt_node (null=0). Check nd.lhs != UINT32_MAX instead of != 0. - ERROR_VALUE: last token is main_token + 2 (error.name has 3 tokens), not main_token. - advanceSourceCursor: replace silent return on backward movement with assert, matching upstream behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
14
astgen.c
14
astgen.c
@@ -580,9 +580,7 @@ static void advanceSourceCursor(AstGenCtx* ag, uint32_t end) {
|
|||||||
uint32_t i = ag->source_offset;
|
uint32_t i = ag->source_offset;
|
||||||
uint32_t line = ag->source_line;
|
uint32_t line = ag->source_line;
|
||||||
uint32_t column = ag->source_column;
|
uint32_t column = ag->source_column;
|
||||||
if (i > end) {
|
assert(i <= end);
|
||||||
return; // Cursor already past target; skip (cursor ordering issue).
|
|
||||||
}
|
|
||||||
while (i < end) {
|
while (i < end) {
|
||||||
if (source[i] == '\n') {
|
if (source[i] == '\n') {
|
||||||
line++;
|
line++;
|
||||||
@@ -7017,6 +7015,11 @@ static uint32_t lastToken(const Ast* tree, uint32_t node) {
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// error_value: main_token is `error`, last token is name (+2)
|
||||||
|
// (Ast.zig:986).
|
||||||
|
case AST_NODE_ERROR_VALUE:
|
||||||
|
return tree->nodes.main_tokens[n] + 2 + end_offset;
|
||||||
|
|
||||||
// Terminals: return main_token + end_offset (Ast.zig:988-996).
|
// Terminals: return main_token + end_offset (Ast.zig:988-996).
|
||||||
case AST_NODE_NUMBER_LITERAL:
|
case AST_NODE_NUMBER_LITERAL:
|
||||||
case AST_NODE_STRING_LITERAL:
|
case AST_NODE_STRING_LITERAL:
|
||||||
@@ -7025,7 +7028,6 @@ static uint32_t lastToken(const Ast* tree, uint32_t node) {
|
|||||||
case AST_NODE_CHAR_LITERAL:
|
case AST_NODE_CHAR_LITERAL:
|
||||||
case AST_NODE_UNREACHABLE_LITERAL:
|
case AST_NODE_UNREACHABLE_LITERAL:
|
||||||
case AST_NODE_ANYFRAME_LITERAL:
|
case AST_NODE_ANYFRAME_LITERAL:
|
||||||
case AST_NODE_ERROR_VALUE:
|
|
||||||
return tree->nodes.main_tokens[n] + end_offset;
|
return tree->nodes.main_tokens[n] + end_offset;
|
||||||
|
|
||||||
// call_one: recurse into lhs, +1 for ')'.
|
// call_one: recurse into lhs, +1 for ')'.
|
||||||
@@ -7354,11 +7356,13 @@ static uint32_t lastToken(const Ast* tree, uint32_t node) {
|
|||||||
return nd.rhs + end_offset;
|
return nd.rhs + end_offset;
|
||||||
|
|
||||||
// break/continue (Ast.zig:1275-1283).
|
// break/continue (Ast.zig:1275-1283).
|
||||||
|
// lhs is opt_token (null_token = UINT32_MAX), rhs is opt_node (0 =
|
||||||
|
// none).
|
||||||
case AST_NODE_BREAK:
|
case AST_NODE_BREAK:
|
||||||
case AST_NODE_CONTINUE:
|
case AST_NODE_CONTINUE:
|
||||||
if (nd.rhs != 0) {
|
if (nd.rhs != 0) {
|
||||||
n = nd.rhs; // optional rhs expression
|
n = nd.rhs; // optional rhs expression
|
||||||
} else if (nd.lhs != 0) {
|
} else if (nd.lhs != UINT32_MAX) {
|
||||||
return nd.lhs + end_offset; // label token
|
return nd.lhs + end_offset; // label token
|
||||||
} else {
|
} else {
|
||||||
return tree->nodes.main_tokens[n] + end_offset;
|
return tree->nodes.main_tokens[n] + end_offset;
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ test "astgen: corpus tokenizer_test.zig" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "astgen: corpus astgen_test.zig" {
|
test "astgen: corpus astgen_test.zig" {
|
||||||
if (true) return error.SkipZigTest; // TODO: dbg_stmt cursor backward at inst 1557
|
if (true) return error.SkipZigTest; // TODO: store_node ref off-by-1 at inst 1764
|
||||||
const gpa = std.testing.allocator;
|
const gpa = std.testing.allocator;
|
||||||
try corpusCheck(gpa, @embedFile("astgen_test.zig"));
|
try corpusCheck(gpa, @embedFile("astgen_test.zig"));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user