Add ability to edit multiple times between parses
This commit is contained in:
parent
6254f45c1b
commit
f37f73f92f
13 changed files with 135 additions and 119 deletions
|
|
@ -19,24 +19,13 @@ void ts_document_free(TSDocument *document) {
|
|||
free(document);
|
||||
}
|
||||
|
||||
static void ts_document__reparse(TSDocument *document) {
|
||||
if (document->input.read_fn && document->parser.language) {
|
||||
TSTree *tree = ts_parser_parse(&document->parser, document->input);
|
||||
if (document->tree)
|
||||
ts_tree_release(document->tree);
|
||||
document->tree = tree;
|
||||
ts_tree_retain(tree);
|
||||
document->parse_count++;
|
||||
}
|
||||
}
|
||||
|
||||
const TSLanguage *ts_document_language(TSDocument *document) {
|
||||
return document->parser.language;
|
||||
}
|
||||
|
||||
void ts_document_set_language(TSDocument *document, const TSLanguage *language) {
|
||||
document->parser.language = language;
|
||||
ts_document__reparse(document);
|
||||
document->tree = NULL;
|
||||
}
|
||||
|
||||
TSDebugger ts_document_debugger(const TSDocument *document) {
|
||||
|
|
@ -53,7 +42,10 @@ TSInput ts_document_input(TSDocument *document) {
|
|||
|
||||
void ts_document_set_input(TSDocument *document, TSInput input) {
|
||||
document->input = input;
|
||||
ts_document__reparse(document);
|
||||
}
|
||||
|
||||
void ts_document_set_input_string(TSDocument *document, const char *text) {
|
||||
ts_document_set_input(document, ts_string_input_make(text));
|
||||
}
|
||||
|
||||
void ts_document_edit(TSDocument *document, TSInputEdit edit) {
|
||||
|
|
@ -64,16 +56,18 @@ void ts_document_edit(TSDocument *document, TSInputEdit edit) {
|
|||
edit.chars_removed = max_chars - edit.position;
|
||||
|
||||
ts_tree_edit(document->tree, edit);
|
||||
ts_document__reparse(document);
|
||||
}
|
||||
|
||||
const char *ts_document_symbol_name(const TSDocument *document,
|
||||
const TSTree *tree) {
|
||||
return document->parser.language->symbol_names[tree->symbol];
|
||||
}
|
||||
|
||||
void ts_document_set_input_string(TSDocument *document, const char *text) {
|
||||
ts_document_set_input(document, ts_string_input_make(text));
|
||||
void ts_document_parse(TSDocument *document) {
|
||||
if (document->input.read_fn && document->parser.language) {
|
||||
TSTree *tree =
|
||||
ts_parser_parse(&document->parser, document->input, document->tree);
|
||||
if (document->tree)
|
||||
ts_tree_release(document->tree);
|
||||
document->tree = tree;
|
||||
ts_tree_retain(tree);
|
||||
document->parse_count++;
|
||||
}
|
||||
}
|
||||
|
||||
TSNode ts_document_root_node(const TSDocument *document) {
|
||||
|
|
|
|||
|
|
@ -178,6 +178,10 @@ bool ts_node_is_named(TSNode this) {
|
|||
return ts_node__tree(this)->options.type == TSNodeTypeNamed;
|
||||
}
|
||||
|
||||
bool ts_node_has_changes(TSNode this) {
|
||||
return ts_node__tree(this)->options.has_changes;
|
||||
}
|
||||
|
||||
TSNode ts_node_parent(TSNode this) {
|
||||
const TSTree *tree = ts_node__tree(this);
|
||||
TSLength position = ts_node__offset(this);
|
||||
|
|
|
|||
|
|
@ -255,22 +255,21 @@ static bool ts_parser__handle_error(TSParser *parser, int head) {
|
|||
}
|
||||
}
|
||||
|
||||
static void ts_parser__start(TSParser *parser, TSInput input) {
|
||||
parser->lexer.input = input;
|
||||
ts_lexer_reset(&parser->lexer, ts_length_zero());
|
||||
|
||||
parser->previous_tree = ts_stack_top_tree(parser->stack, 0);
|
||||
if (parser->previous_tree) {
|
||||
static void ts_parser__start(TSParser *parser, TSInput input,
|
||||
TSTree *previous_tree) {
|
||||
if (previous_tree) {
|
||||
DEBUG("parse_after_edit");
|
||||
ts_tree_retain(parser->previous_tree);
|
||||
} else {
|
||||
DEBUG("new_parse");
|
||||
}
|
||||
parser->reusable_subtree = parser->previous_tree;
|
||||
|
||||
parser->lexer.input = input;
|
||||
ts_lexer_reset(&parser->lexer, ts_length_zero());
|
||||
ts_stack_clear(parser->stack);
|
||||
|
||||
parser->reusable_subtree = previous_tree;
|
||||
parser->reusable_subtree_pos = 0;
|
||||
parser->lookahead = NULL;
|
||||
parser->is_verifying = false;
|
||||
ts_stack_clear(parser->stack);
|
||||
}
|
||||
|
||||
static TSTree *ts_parser__finish(TSParser *parser) {
|
||||
|
|
@ -282,7 +281,6 @@ static TSTree *ts_parser__finish(TSParser *parser) {
|
|||
TSTree *root = trees[extra_count];
|
||||
|
||||
ts_tree_prepend_children(root, extra_count, trees);
|
||||
ts_stack_push(parser->stack, 0, 0, root);
|
||||
return root;
|
||||
}
|
||||
|
||||
|
|
@ -389,7 +387,6 @@ TSParser ts_parser_make() {
|
|||
NULL, ts_parser__select_tree,
|
||||
}),
|
||||
.lookahead = NULL,
|
||||
.is_verifying = false,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -407,8 +404,8 @@ void ts_parser_set_debugger(TSParser *parser, TSDebugger debugger) {
|
|||
parser->lexer.debugger = debugger;
|
||||
}
|
||||
|
||||
TSTree *ts_parser_parse(TSParser *parser, TSInput input) {
|
||||
ts_parser__start(parser, input);
|
||||
TSTree *ts_parser_parse(TSParser *parser, TSInput input, TSTree *previous_tree) {
|
||||
ts_parser__start(parser, input, previous_tree);
|
||||
|
||||
for (;;) {
|
||||
ts_parser__get_next_lookahead(parser, false);
|
||||
|
|
|
|||
|
|
@ -11,10 +11,8 @@ typedef struct {
|
|||
TSLexer lexer;
|
||||
Stack *stack;
|
||||
TSTree *lookahead;
|
||||
TSTree *previous_tree;
|
||||
TSTree *reusable_subtree;
|
||||
size_t reusable_subtree_pos;
|
||||
bool is_verifying;
|
||||
const TSLanguage *language;
|
||||
} TSParser;
|
||||
|
||||
|
|
@ -22,7 +20,7 @@ TSParser ts_parser_make();
|
|||
void ts_parser_destroy(TSParser *);
|
||||
TSDebugger ts_parser_debugger(const TSParser *);
|
||||
void ts_parser_set_debugger(TSParser *, TSDebugger);
|
||||
TSTree *ts_parser_parse(TSParser *, TSInput);
|
||||
TSTree *ts_parser_parse(TSParser *, TSInput, TSTree *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue