From 4676cd42004465bb22ab66efe4e582ca3317b74e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 15 Mar 2024 16:55:21 -0700 Subject: [PATCH] Defer creation of external scanner until the beginning of parse --- lib/src/parser.c | 49 ++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/lib/src/parser.c b/lib/src/parser.c index 6421edd2..9d74c1ae 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -1827,6 +1827,7 @@ static unsigned ts_parser__condense_stack(TSParser *self) { static bool ts_parser_has_outstanding_parse(TSParser *self) { return ( + self->external_scanner_payload || ts_stack_state(self->stack, 0) != 1 || ts_stack_node_count_since_error(self->stack, 0) != 0 ); @@ -1889,7 +1890,7 @@ const TSLanguage *ts_parser_language(const TSParser *self) { } bool ts_parser_set_language(TSParser *self, const TSLanguage *language) { - ts_parser__external_scanner_destroy(self); + ts_parser_reset(self); ts_language_delete(self->language); self->language = NULL; @@ -1908,8 +1909,6 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) { } self->language = ts_language_copy(language); - ts_parser__external_scanner_create(self); - ts_parser_reset(self); return true; } @@ -1966,8 +1965,9 @@ const TSRange *ts_parser_included_ranges(const TSParser *self, uint32_t *count) } void ts_parser_reset(TSParser *self) { - if (self->language && self->language->external_scanner.deserialize) { - self->language->external_scanner.deserialize(self->external_scanner_payload, NULL, 0); + ts_parser__external_scanner_destroy(self); + if (self->wasm_store) { + ts_wasm_store_reset(self->wasm_store); } if (self->old_tree.ptr) { @@ -2006,24 +2006,29 @@ TSTree *ts_parser_parse( if (ts_parser_has_outstanding_parse(self)) { LOG("resume_parsing"); - } else if (old_tree) { - ts_subtree_retain(old_tree->root); - self->old_tree = old_tree->root; - ts_range_array_get_changed_ranges( - old_tree->included_ranges, old_tree->included_range_count, - self->lexer.included_ranges, self->lexer.included_range_count, - &self->included_range_differences - ); - reusable_node_reset(&self->reusable_node, old_tree->root); - LOG("parse_after_edit"); - LOG_TREE(self->old_tree); - for (unsigned i = 0; i < self->included_range_differences.size; i++) { - TSRange *range = &self->included_range_differences.contents[i]; - LOG("different_included_range %u - %u", range->start_byte, range->end_byte); - } } else { - reusable_node_clear(&self->reusable_node); - LOG("new_parse"); + ts_parser__external_scanner_create(self); + if (self->has_scanner_error) goto exit; + + if (old_tree) { + ts_subtree_retain(old_tree->root); + self->old_tree = old_tree->root; + ts_range_array_get_changed_ranges( + old_tree->included_ranges, old_tree->included_range_count, + self->lexer.included_ranges, self->lexer.included_range_count, + &self->included_range_differences + ); + reusable_node_reset(&self->reusable_node, old_tree->root); + LOG("parse_after_edit"); + LOG_TREE(self->old_tree); + for (unsigned i = 0; i < self->included_range_differences.size; i++) { + TSRange *range = &self->included_range_differences.contents[i]; + LOG("different_included_range %u - %u", range->start_byte, range->end_byte); + } + } else { + reusable_node_clear(&self->reusable_node); + LOG("new_parse"); + } } self->operation_count = 0;