Repository navigation
Fix ArgumentOutOfRangeException in TextModificationService.ColorizeLine - #403
Merged
Merged
Conversation
ColorizeLine clamped multi-line segments by mutating them. Setting TextSegment.StartOffset moves the segment (keeping its length), so the end offset was pushed past the line end and ChangeLinePart threw. The mutation also permanently corrupted the stored segments. Clamp into local offsets instead, and preserve the end offset when trimming overlapping segments in SetModification. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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.
Fixes a crash during editor rendering:
Root cause
ColorizeLineclamped highlights that span several lines to the current line by changing the stored highlight itself. In AvaloniaEdit, settingTextSegment.StartOffsetmoves the highlight (its length stays the same). So after the end was clamped, moving the start pushedEndOffsetpast the line end again. For example, a highlight at 419–430 on line 421–429 ended at 431. The clamping also permanently changed stored highlights such as semantic tokens and caret highlights, so the next lines they covered drew them in the wrong place.Changes
ColorizeLinecomputes the clamped start and end in local variables (TryClampToLine) and no longer changes the highlight. Empty ranges are skipped.SetModificationkeeps a highlight's end offset when it trims the start of overlapping highlights, and skips highlights that end up empty.InternalsVisibleTosoOneWare.Essentials.UnitTestscan call the internal helper.TextModificationServiceTests.Testing
dotnet test tests/OneWare.Essentials.UnitTestspasses (98/98). Tested running the App