Allow tokenizer
to pause and resume in the middle of a line
#1444
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #1212 and #1369.
For now the pause policy is that every 200 tokenized chars, if half a frametime has passed, it "yields".
We might consider allowing the customization of the pause policy.
The yielding behavior is not implemented with coroutines because of performance concerns around creating them. I might test if this is a valid concern.
Only tokenization coroutines are allowed to tokenize whole lines.
Highlighter:get_line
only tokenizes the first 200 characters, plus anything else it can in the allowed time frame.This is done because that function can be called multiple times per frame, which could tank the performance. We might consider adding a parameter to allow resuming the tokenization.
When the tokenizer pauses, the remaining text uses the
incomplete
token type. Suggestions for a different name are welcome.We sadly can't resume the tokenization of a line from where it changed, and need to restart the tokenization from scratch.
This is because the change itself could match with a rule that applies before it.
Testing is very welcome.