Core: Fixed greedy rematching reach bug #2705
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.
The bug fixed by this PR caused Prism to stop rematching too early which caused incorrect results (see #2694).
The bug was caused by rematching reach. Rematching reach was introduced in #2032 and one of its main features is that the area (=reach) in which Prism will redo the tokenization can be extended. Extending the reach is necessary for correctness but may degrade performance a little.
The cause of this bug is that nested rematching did not extend the caller's reach. Rematching is done recursively and if a recursive call extends the reach, the caller's reach has to be extended as well. The fix is the do exactly that.
Performance impact:
None, surprisingly. I expected that the fixed version would be slower since we might do more rematching but that wasn't the case. I don't know why thou.
Benchmark:
(
local
refers to the fixed version in this branch.)This fixes #2694.