Defer creation of external scanner until the beginning of parse
This commit is contained in:
parent
fed9b98d6c
commit
4676cd4200
1 changed files with 27 additions and 22 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue