Skip to content

Commit 4676cd4

Browse files
committed
Defer creation of external scanner until the beginning of parse
1 parent fed9b98 commit 4676cd4

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

lib/src/parser.c

+27-22
Original file line numberDiff line numberDiff line change
@@ -1827,6 +1827,7 @@ static unsigned ts_parser__condense_stack(TSParser *self) {
18271827

18281828
static bool ts_parser_has_outstanding_parse(TSParser *self) {
18291829
return (
1830+
self->external_scanner_payload ||
18301831
ts_stack_state(self->stack, 0) != 1 ||
18311832
ts_stack_node_count_since_error(self->stack, 0) != 0
18321833
);
@@ -1889,7 +1890,7 @@ const TSLanguage *ts_parser_language(const TSParser *self) {
18891890
}
18901891

18911892
bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
1892-
ts_parser__external_scanner_destroy(self);
1893+
ts_parser_reset(self);
18931894
ts_language_delete(self->language);
18941895
self->language = NULL;
18951896

@@ -1908,8 +1909,6 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
19081909
}
19091910

19101911
self->language = ts_language_copy(language);
1911-
ts_parser__external_scanner_create(self);
1912-
ts_parser_reset(self);
19131912
return true;
19141913
}
19151914

@@ -1966,8 +1965,9 @@ const TSRange *ts_parser_included_ranges(const TSParser *self, uint32_t *count)
19661965
}
19671966

19681967
void ts_parser_reset(TSParser *self) {
1969-
if (self->language && self->language->external_scanner.deserialize) {
1970-
self->language->external_scanner.deserialize(self->external_scanner_payload, NULL, 0);
1968+
ts_parser__external_scanner_destroy(self);
1969+
if (self->wasm_store) {
1970+
ts_wasm_store_reset(self->wasm_store);
19711971
}
19721972

19731973
if (self->old_tree.ptr) {
@@ -2006,24 +2006,29 @@ TSTree *ts_parser_parse(
20062006

20072007
if (ts_parser_has_outstanding_parse(self)) {
20082008
LOG("resume_parsing");
2009-
} else if (old_tree) {
2010-
ts_subtree_retain(old_tree->root);
2011-
self->old_tree = old_tree->root;
2012-
ts_range_array_get_changed_ranges(
2013-
old_tree->included_ranges, old_tree->included_range_count,
2014-
self->lexer.included_ranges, self->lexer.included_range_count,
2015-
&self->included_range_differences
2016-
);
2017-
reusable_node_reset(&self->reusable_node, old_tree->root);
2018-
LOG("parse_after_edit");
2019-
LOG_TREE(self->old_tree);
2020-
for (unsigned i = 0; i < self->included_range_differences.size; i++) {
2021-
TSRange *range = &self->included_range_differences.contents[i];
2022-
LOG("different_included_range %u - %u", range->start_byte, range->end_byte);
2023-
}
20242009
} else {
2025-
reusable_node_clear(&self->reusable_node);
2026-
LOG("new_parse");
2010+
ts_parser__external_scanner_create(self);
2011+
if (self->has_scanner_error) goto exit;
2012+
2013+
if (old_tree) {
2014+
ts_subtree_retain(old_tree->root);
2015+
self->old_tree = old_tree->root;
2016+
ts_range_array_get_changed_ranges(
2017+
old_tree->included_ranges, old_tree->included_range_count,
2018+
self->lexer.included_ranges, self->lexer.included_range_count,
2019+
&self->included_range_differences
2020+
);
2021+
reusable_node_reset(&self->reusable_node, old_tree->root);
2022+
LOG("parse_after_edit");
2023+
LOG_TREE(self->old_tree);
2024+
for (unsigned i = 0; i < self->included_range_differences.size; i++) {
2025+
TSRange *range = &self->included_range_differences.contents[i];
2026+
LOG("different_included_range %u - %u", range->start_byte, range->end_byte);
2027+
}
2028+
} else {
2029+
reusable_node_clear(&self->reusable_node);
2030+
LOG("new_parse");
2031+
}
20272032
}
20282033

20292034
self->operation_count = 0;

0 commit comments

Comments
 (0)