feat: store grammar state in weakmap #804
Merged
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.
In #712, we introduced GrammarState to resume the highlighting from the middle way. It solves the problem of customizing grammar context, but wasn't very useful for passable highlighting (for example, in a text editor, instead of highlighting the full context again over again, we can reuse the result from the previously highlighted lines) - because users need to run the parsing twice to get the
GrammarState
object. The existing API wasn't designed to be able to return extra property, making it hard to return theGrammarState
in one-go, without breaking changes.This PR overcharges the
shiki.getLastGrammarState()
function to be able to accept the return HastRoot
orThemedToken[][]
to retrieve theGrammarState
stored in a internal WeakMap. Make the usage more performent.Along the way, we also made
GrammarState
work with multiple themes by storing multiple internal state for each theme.The usage would be like:
close #803