Skip to content

Commit 8decec3

Browse files
committed
Properly incorporate lookahead bytes when recovering via missing token
1 parent 7170ec7 commit 8decec3

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

lib/src/parser.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,9 +1307,11 @@ static void ts_parser__handle_error(
13071307
for (StackVersion v = version; v < version_count;) {
13081308
if (!did_insert_missing_token) {
13091309
TSStateId state = ts_stack_state(self->stack, v);
1310-
for (TSSymbol missing_symbol = 1;
1311-
missing_symbol < self->language->token_count;
1312-
missing_symbol++) {
1310+
for (
1311+
TSSymbol missing_symbol = 1;
1312+
missing_symbol < self->language->token_count;
1313+
missing_symbol++
1314+
) {
13131315
TSStateId state_after_missing_symbol = ts_language_next_state(
13141316
self->language, state, missing_symbol
13151317
);
@@ -1328,10 +1330,13 @@ static void ts_parser__handle_error(
13281330
ts_lexer_reset(&self->lexer, position);
13291331
ts_lexer_mark_end(&self->lexer);
13301332
Length padding = length_sub(self->lexer.token_end_position, position);
1333+
uint32_t lookahead_bytes = ts_subtree_total_bytes(lookahead) + ts_subtree_lookahead_bytes(lookahead);
13311334

13321335
StackVersion version_with_missing_tree = ts_stack_copy_version(self->stack, v);
13331336
Subtree missing_tree = ts_subtree_new_missing_leaf(
1334-
&self->tree_pool, missing_symbol, padding, self->language
1337+
&self->tree_pool, missing_symbol,
1338+
padding, lookahead_bytes,
1339+
self->language
13351340
);
13361341
ts_stack_push(
13371342
self->stack, version_with_missing_tree,

lib/src/subtree.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,11 @@ Subtree ts_subtree_new_missing_leaf(
559559
SubtreePool *pool,
560560
TSSymbol symbol,
561561
Length padding,
562+
uint32_t lookahead_bytes,
562563
const TSLanguage *language
563564
) {
564565
Subtree result = ts_subtree_new_leaf(
565-
pool, symbol, padding, length_zero(), 0,
566+
pool, symbol, padding, length_zero(), lookahead_bytes,
566567
0, false, false, false, language
567568
);
568569
if (result.data.is_inline) {

lib/src/subtree.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ Subtree ts_subtree_new_error(
193193
);
194194
MutableSubtree ts_subtree_new_node(TSSymbol, SubtreeArray *, unsigned, const TSLanguage *);
195195
Subtree ts_subtree_new_error_node(SubtreeArray *, bool, const TSLanguage *);
196-
Subtree ts_subtree_new_missing_leaf(SubtreePool *, TSSymbol, Length, const TSLanguage *);
196+
Subtree ts_subtree_new_missing_leaf(SubtreePool *, TSSymbol, Length, uint32_t, const TSLanguage *);
197197
MutableSubtree ts_subtree_make_mut(SubtreePool *, Subtree);
198198
void ts_subtree_retain(Subtree);
199199
void ts_subtree_release(SubtreePool *, Subtree);

0 commit comments

Comments
 (0)