diff --git a/components/synedit/syneditfoldedview.pp b/components/synedit/syneditfoldedview.pp index 7f105f8b0f..e48fe542ea 100644 --- a/components/synedit/syneditfoldedview.pp +++ b/components/synedit/syneditfoldedview.pp @@ -810,7 +810,7 @@ begin case FLineState of 0: begin Result := inherited GetNextHighlighterToken(ATokenInfo); - if (not Result) and + if ( (not Result) or (ATokenInfo.TokenStart = nil)) and (FFoldView.FoldType[CurrentTokenLine + 1 - FFoldView.TopLine] * [cfCollapsedFold, cfCollapsedHide] <> []) then begin inc(FLineState); @@ -838,7 +838,7 @@ begin Result := True; end; else - Result := False; + Result := inherited GetNextHighlighterToken(ATokenInfo); end; end; diff --git a/components/synedit/synedithighlighter.pp b/components/synedit/synedithighlighter.pp index 09f0317074..62ca32b782 100644 --- a/components/synedit/synedithighlighter.pp +++ b/components/synedit/synedithighlighter.pp @@ -372,7 +372,7 @@ type function GetRange: Pointer; virtual; function GetToken: String; virtual; abstract; procedure GetTokenEx(out TokenStart: PChar; out TokenLength: integer); virtual; abstract; - function GetEndOfLineAttribute: TSynHighlighterAttributes; virtual; + function GetEndOfLineAttribute: TSynHighlighterAttributes; virtual; // valid after line was scanned to EOL function GetTokenAttribute: TSynHighlighterAttributes; virtual; abstract; function GetTokenKind: integer; virtual; abstract; function GetTokenPos: Integer; virtual; abstract; // 0-based diff --git a/components/synedit/synedittextbuffer.pp b/components/synedit/synedittextbuffer.pp index 49da698433..80e5ab3c89 100644 --- a/components/synedit/synedittextbuffer.pp +++ b/components/synedit/synedittextbuffer.pp @@ -372,7 +372,13 @@ begin FAtLineStart := False; Result := not CurrentTokenHighlighter.GetEol; - if not Result then exit; + if not Result then begin + ATokenInfo.TokenStart := nil; + ATokenInfo.TokenLength := 0; + ATokenInfo.TokenAttr := CurrentTokenHighlighter.GetEndOfLineAttribute; + Result := ATokenInfo.TokenAttr <> nil; + exit; + end; CurrentTokenHighlighter.GetTokenEx(ATokenInfo.TokenStart, ATokenInfo.TokenLength); ATokenInfo.TokenAttr := CurrentTokenHighlighter.GetTokenAttribute; diff --git a/components/synedit/synhighlighterpas.pp b/components/synedit/synhighlighterpas.pp index 62535f4f9c..807854c712 100644 --- a/components/synedit/synhighlighterpas.pp +++ b/components/synedit/synhighlighterpas.pp @@ -533,6 +533,7 @@ type procedure SetLine(const NewValue: string; LineNumber: Integer); override; procedure SetRange(Value: Pointer); override; procedure StartAtLineIndex(LineNumber:Integer); override; // 0 based + function GetEndOfLineAttribute: TSynHighlighterAttributes; override; function UseUserSettings(settingIndex: integer): boolean; override; procedure EnumUserSettings(settings: TStrings); override; @@ -3133,6 +3134,14 @@ begin inherited StartAtLineIndex(LineNumber); end; +function TSynPasSyn.GetEndOfLineAttribute: TSynHighlighterAttributes; +begin + if fRange * [rsAnsi, rsBor] <> [] then + Result := fCommentAttri + else + Result := inherited GetEndOfLineAttribute; +end; + procedure TSynPasSyn.ResetRange; begin fRange := []; diff --git a/components/synedit/test/testfoldedview.pas b/components/synedit/test/testfoldedview.pas index c2678d7233..afcab55657 100644 --- a/components/synedit/test/testfoldedview.pas +++ b/components/synedit/test/testfoldedview.pas @@ -1499,6 +1499,26 @@ begin {%endregion} + TstSetText('Simple: fold Prc', TestTextBug21473); + FoldedView.FoldAtTextIndex(7); + FoldedView.FoldAtTextIndex(11); + FoldedView.FoldAtTextIndex(6); + FoldedView.FoldAtTextIndex(10); + FoldedView.FoldAtTextIndex(4); + + FoldedView.FoldAtTextIndex(22); + FoldedView.FoldAtTextIndex(26); + FoldedView.FoldAtTextIndex(21); + FoldedView.FoldAtTextIndex(25); + FoldedView.FoldAtTextIndex(19); + +//FoldedView.debug; + + SynEdit.TextBetweenPoints[point(1,3), point(1,31)] := ''; + + DebugLn('#############################'); +//FoldedView.debug; + end;