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.
The Naga project uses a Handle-Arena approach to AST management rather than a Box-Ownership model. I'm fond of this for a few reasons, including performance and ease of AST mutation (especially with a visitor pattern, where you might first visit immutably and collect handles and then perform modifications).
This PR adds the option to generate an Arena-based grammar. It doesn't change any public signatures of existing generated code, but upon declaration of a grammar with a least one
Handle<T>
field therust_sitter::language
macro additionally requires arust_sitter::arena
type somewhere in the declaration:Then,
parse
returns both the rootExpression
and an instance ofMyArena
which the handles point in to.As a note, while this improves the performance of AST transformations it currently this doesn't change the performance of parsing (about a 1-2% speedup). I'd anticipate that a preliminary traversal of the tree for an arena pre-allocation would unlock more performance, so if that's a requirement to get this merged then let me know and I'll give it a go. Otherwise, as it stands, this allows for a new paradigm with associated performance characteristics without changing much else.