Immutable parser (Tokenize borrow strings cont)#2098
Merged
iffyio merged 1 commit intoapache:reduce-string-copyingfrom Dec 18, 2025
Merged
Immutable parser (Tokenize borrow strings cont)#2098iffyio merged 1 commit intoapache:reduce-string-copyingfrom
iffyio merged 1 commit intoapache:reduce-string-copyingfrom
Conversation
1dab0d0 to
3d7f677
Compare
3d7f677 to
26b4a46
Compare
26b4a46 to
7f89ca4
Compare
31adc0e to
e9fb987
Compare
Changed all parsing methods to take '&self' instead of '\&mut self'. Mutable parser state (token index and parser state) now uses for interior mutability. This refactoring is preparation for the borrowed tokenizer work. When holding borrowed tokens from the parser (with lifetime tied to '\&self'), we cannot call methods requiring '\&mut self' due to Rust's borrowing rules. Using interior mutability resolves this conflict by allowing state mutations through shared references.
e9fb987 to
650b1ca
Compare
Contributor
Author
iffyio
approved these changes
Dec 18, 2025
Contributor
iffyio
left a comment
There was a problem hiding this comment.
LGTM! Thanks @eyalleshem!
alamb
reviewed
Dec 24, 2025
| @@ -331,9 +332,9 @@ pub struct Parser<'a> { | |||
| /// The tokens | |||
| tokens: Vec<TokenWithSpan>, | |||
| /// The index of the first unprocessed token in [`Parser::tokens`]. | |||
| index: usize, | |||
| index: Cell<usize>, | |||
Contributor
There was a problem hiding this comment.
This is a clever way to go about reducing the need for mutable borrows. Thank you @eyalleshem
One thing that might be worth doing (perhaps as a follow on PR) is documenting how this works (notable that Parser has interior mutability so functions like next_token() actually do change state, even though they are immutable
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
refactor: Make Parser methods immutable using interior mutability
Changed all parsing methods to take
&selfinstead of&mut self.Mutable parser state (token index and parser state) now uses
Cellfor interior mutability.
This refactoring is preparation for the borrowed tokenizer work. When
holding borrowed tokens from the parser (with lifetime tied to
&self),we cannot call methods requiring
&mut selfdue to Rust's borrowingrules. Using interior mutability resolves this conflict by allowing
state mutations through shared references.