Restucture wasm module, return a normal TSLanguage from load_language

This commit is contained in:
Max Brunsfeld 2022-09-06 22:41:05 -07:00
parent 3f1a7f9cd4
commit 042e6f9d57
26 changed files with 3068 additions and 317 deletions

View file

@ -89,7 +89,6 @@ struct TSParser {
Stack *stack;
SubtreePool tree_pool;
const TSLanguage *language;
const TSWasmLanguage *wasm_language;
TSWasmStore *wasm_store;
ReduceActionSet reduce_actions;
Subtree finished_tree;
@ -487,7 +486,7 @@ static Subtree ts_parser__lex(
);
ts_lexer_start(&self->lexer);
found_token = false;
if (self->wasm_language) {
if (ts_language_is_wasm(self->language)) {
found_token = ts_wasm_store_run_main_lex_function(self->wasm_store, lex_mode.lex_state);
} else {
found_token = self->language->lex_fn(&self->lexer.data, lex_mode.lex_state);
@ -553,7 +552,7 @@ static Subtree ts_parser__lex(
ts_lexer_reset(&self->lexer, self->lexer.token_start_position);
ts_lexer_start(&self->lexer);
if (self->wasm_language) {
if (ts_language_is_wasm(self->language)) {
is_keyword = ts_wasm_store_run_keyword_lex_function(self->wasm_store, 0);
} else {
is_keyword = self->language->keyword_lex_fn(&self->lexer.data, 0);
@ -1812,14 +1811,6 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
}
self->language = language;
#ifdef TREE_SITTER_FEATURE_WASM
if (self->wasm_language) {
ts_wasm_language_delete(self->wasm_language);
self->wasm_language = NULL;
}
#endif
ts_parser_reset(self);
return true;
}
@ -1900,8 +1891,12 @@ TSTree *ts_parser_parse(
) {
if (!self->language || !input.read) return NULL;
if (self->wasm_store) {
ts_wasm_store_start(self->wasm_store, &self->lexer.data, self->wasm_language);
if (ts_language_is_wasm(self->language)) {
if (self->wasm_store) {
ts_wasm_store_start(self->wasm_store, &self->lexer.data, self->language);
} else {
return NULL;
}
}
ts_lexer_set_input(&self->lexer, input);
@ -2023,28 +2018,8 @@ TSTree *ts_parser_parse_string_encoding(
});
}
#ifdef TREE_SITTER_FEATURE_WASM
void ts_parser_set_wasm_language(TSParser *self, const TSWasmLanguage *language) {
if (language) {
self->language = language->language;
ts_wasm_language_retain(language);
}
self->wasm_language = language;
ts_parser_reset(self);
}
const TSWasmLanguage *ts_parser_wasm_language(TSParser *self) {
if (self->wasm_language) {
ts_wasm_language_retain(self->wasm_language);
}
return self->wasm_language;
}
void ts_parser_set_wasm_store(TSParser *self, TSWasmStore *store) {
self->wasm_store = store;
}
#endif // TREE_SITTER_FEATURE_WASM
#undef LOG