From d488f046267789a31425b5b587dd3e35c380fb5f Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 28 Sep 2021 00:07:54 +0200 Subject: [PATCH] SynEdit: Highlighter, make sure to call SendHighlightChanged (even if lines where deleted, instead of scanned / HL still changed back to valid/"no scan needed") (cherry picked from commit 031eb666565b64561162b5acd36becfb5a094e8f) --- components/synedit/lazsynedittext.pas | 1 + components/synedit/synedithighlighter.pp | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/components/synedit/lazsynedittext.pas b/components/synedit/lazsynedittext.pas index 81409009bb..11fcba591c 100644 --- a/components/synedit/lazsynedittext.pas +++ b/components/synedit/lazsynedittext.pas @@ -52,6 +52,7 @@ type senrLineChange, // Lines modified (also triggered by senrEditAction) senrLinesModified, //TStringListLinesModifiedEvent: Send once in "EndUpdate". Modified, inserted or deleted senrHighlightChanged, // used by Highlighter (invalidate and fold checks needed) + // SynEdit.SetHighlighter sends the special (-1,-1) notification senrLineMappingChanged, // folds added/removed - virtual X/Y changed. (ACount is not used) // TStringListLineEditEvent senrEditAction, // EditInsert, EditDelete, EditLineBreak, ... diff --git a/components/synedit/synedithighlighter.pp b/components/synedit/synedithighlighter.pp index 3d59a38f2e..8dd821da86 100644 --- a/components/synedit/synedithighlighter.pp +++ b/components/synedit/synedithighlighter.pp @@ -1673,8 +1673,9 @@ var StartIndex, EndIndex: Integer; begin StartIndex := CurrentRanges.NeedsReScanStartIndex; - if (StartIndex < 0) or (StartIndex >= CurrentRanges.Count) then + if (StartIndex < 0) then exit; + EndIndex := CurrentRanges.NeedsReScanEndIndex + 1; //debugln(['=== scan ',StartIndex,' - ',EndIndex]); FIsScanning := True; @@ -1683,10 +1684,14 @@ begin finally FIsScanning := False; end; + assert(CurrentRanges.NeedsReScanRealStartIndex <= StartIndex, 'TSynCustomHighlighter.ScanRanges: CurrentRanges.NeedsReScanRealStartIndex <= StartIndex'); StartIndex := CurrentRanges.NeedsReScanRealStartIndex; // include idle scanned CurrentRanges.ClearReScanNeeded; // Invalidate one line above, since folds can change depending on next line // TODO: only classes with end-fold-last-line + if (StartIndex >= CurrentRanges.Count) + then CurrentLines.SendHighlightChanged(CurrentRanges.Count, 0) // No lines scanned, validate because lines are gone / Do not need the extra line + else if StartIndex > 0 then CurrentLines.SendHighlightChanged(StartIndex - 1, EndIndex - StartIndex + 1) else CurrentLines.SendHighlightChanged(StartIndex, EndIndex - StartIndex ); @@ -1699,7 +1704,7 @@ begin Result := False; StartIndex := CurrentRanges.NeedsReScanStartIndex; if (StartIndex < 0) or (StartIndex >= CurrentRanges.Count) then - exit; + exit; // If StartIndex > 0 then ScanRanges will send the notification EndIndex := CurrentRanges.NeedsReScanEndIndex + 1; RealEndIndex := EndIndex;