diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 9081fdb0..afdf2aa7 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -221,6 +221,9 @@ static bool ts_parser__shift(TSParser *self, int head, static bool ts_parser__shift_extra(TSParser *self, int head, TSStateId state, TSTree *lookahead) { + TSSymbolMetadata metadata = self->language->symbol_metadata[lookahead->symbol]; + if (!metadata.extra && ts_stack_head_count(self->stack) > 1) + lookahead = ts_tree_make_copy(lookahead); ts_tree_set_extra(lookahead); return ts_parser__shift(self, head, state, lookahead); } diff --git a/src/runtime/tree.c b/src/runtime/tree.c index c6891684..6616335f 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -41,6 +41,12 @@ TSTree *ts_tree_make_error(TSLength size, TSLength padding, char lookahead_char) return result; } +TSTree *ts_tree_make_copy(TSTree *self) { + TSTree *result = malloc(sizeof(TSTree)); + *result = *self; + return result; +} + void ts_tree_assign_parents(TSTree *self) { TSLength offset = ts_length_zero(); for (size_t i = 0; i < self->child_count; i++) { diff --git a/src/runtime/tree.h b/src/runtime/tree.h index cba95741..d78a914b 100644 --- a/src/runtime/tree.h +++ b/src/runtime/tree.h @@ -40,6 +40,7 @@ struct TSTree { TSTree *ts_tree_make_leaf(TSSymbol, TSLength, TSLength, TSSymbolMetadata); TSTree *ts_tree_make_node(TSSymbol, size_t, TSTree **, TSSymbolMetadata); +TSTree *ts_tree_make_copy(TSTree *child); TSTree *ts_tree_make_error(TSLength, TSLength, char); void ts_tree_retain(TSTree *tree); void ts_tree_release(TSTree *tree);