mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-02 15:42:08 +02:00
implemented freepascal highlighter with nested comments issue #1991
git-svn-id: trunk@9601 -
This commit is contained in:
parent
54775b843e
commit
25cfb2b746
@ -1211,15 +1211,6 @@ begin
|
|||||||
if FMinimumCodeFoldBlockLevel>CodeFoldRange.CodeFoldStackSize then
|
if FMinimumCodeFoldBlockLevel>CodeFoldRange.CodeFoldStackSize then
|
||||||
FMinimumCodeFoldBlockLevel:=CodeFoldRange.CodeFoldStackSize;
|
FMinimumCodeFoldBlockLevel:=CodeFoldRange.CodeFoldStackSize;
|
||||||
end;
|
end;
|
||||||
{$ELSE}
|
|
||||||
procedure TSynCustomHighlighter.SetCodeFoldItem(Lines: TStrings; Line : integer; Folded: boolean;
|
|
||||||
FoldIndex: integer; FoldType: TSynEditCodeFoldType);
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TSynCustomHighlighter.InitCodeFold(Lines: TStrings);
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
{$IFNDEF SYN_CPPB_1}
|
{$IFNDEF SYN_CPPB_1}
|
||||||
@ -1312,9 +1303,9 @@ end;
|
|||||||
|
|
||||||
procedure TSynCustomHighlighterRange.Pop;
|
procedure TSynCustomHighlighterRange.Pop;
|
||||||
// can be called, even if there is no stack
|
// can be called, even if there is no stack
|
||||||
// because it's normal, that sources under development have unclosed blocks
|
// because it's normal that sources under development have unclosed blocks
|
||||||
begin
|
begin
|
||||||
//debugln('TSynCustomHighlighterRange.Pop AAAAAAAAAAAA');
|
//debugln('TSynCustomHighlighterRange.Pop');
|
||||||
if FCodeFoldStackSize>0 then
|
if FCodeFoldStackSize>0 then
|
||||||
dec(FCodeFoldStackSize);
|
dec(FCodeFoldStackSize);
|
||||||
if FCodeFoldStackSize>0 then
|
if FCodeFoldStackSize>0 then
|
||||||
@ -1360,7 +1351,7 @@ begin
|
|||||||
Clear;
|
Clear;
|
||||||
end;
|
end;
|
||||||
if FCodeFoldStackSize>0 then
|
if FCodeFoldStackSize>0 then
|
||||||
FTop:=FCodeFoldStack[0]
|
FTop:=FCodeFoldStack[FCodeFoldStackSize-1]
|
||||||
else
|
else
|
||||||
FTop:=nil;
|
FTop:=nil;
|
||||||
end;
|
end;
|
||||||
|
@ -65,12 +65,26 @@ type
|
|||||||
tkSpace, tkString, tkSymbol, {$IFDEF SYN_LAZARUS}tkDirective, {$ENDIF}
|
tkSpace, tkString, tkSymbol, {$IFDEF SYN_LAZARUS}tkDirective, {$ENDIF}
|
||||||
tkUnknown);
|
tkUnknown);
|
||||||
|
|
||||||
TRangeState = (rsANil, rsAnsi, rsAnsiAsm, rsAsm, rsBor, rsBorAsm,
|
TRangeState = (
|
||||||
{$IFDEF SYN_LAZARUS}rsDirective, rsDirectiveAsm,{$ENDIF}
|
rsANil,
|
||||||
rsProperty, rsUnKnown);
|
rsAnsi, // *) comment
|
||||||
|
rsAnsiAsm,// *) comment in assembler block
|
||||||
|
rsAsm, // assembler block
|
||||||
|
rsBor, // { comment
|
||||||
|
rsBorAsm, // { comment in assembler block
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
rsDirective,
|
||||||
|
rsDirectiveAsm, // directive in assembler block
|
||||||
|
{$ENDIF}
|
||||||
|
rsProperty,
|
||||||
|
rsUnKnown);
|
||||||
|
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
TPascalCodeFoldBlockType = (cfbtNone, cfbtBeginEnd);
|
TPascalCodeFoldBlockType = (
|
||||||
|
cfbtNone,
|
||||||
|
cfbtBeginEnd,
|
||||||
|
cfbtNestedComment
|
||||||
|
);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
TProcTableProc = procedure of object;
|
TProcTableProc = procedure of object;
|
||||||
@ -112,9 +126,11 @@ type
|
|||||||
fSpaceAttri: TSynHighlighterAttributes;
|
fSpaceAttri: TSynHighlighterAttributes;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
fDirectiveAttri: TSynHighlighterAttributes;
|
fDirectiveAttri: TSynHighlighterAttributes;
|
||||||
|
FNestedComments: boolean;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
fD4syntax: boolean;
|
fD4syntax: boolean;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
function TextComp(aText: PChar): Boolean;
|
||||||
function KeyHash: Integer;
|
function KeyHash: Integer;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
function KeyHash(ToHash: PChar): Integer;
|
function KeyHash(ToHash: PChar): Integer;
|
||||||
@ -287,10 +303,19 @@ type
|
|||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
property DirectiveAttri: TSynHighlighterAttributes read fDirectiveAttri
|
property DirectiveAttri: TSynHighlighterAttributes read fDirectiveAttri
|
||||||
write fDirectiveAttri;
|
write fDirectiveAttri;
|
||||||
|
property NestedComments: boolean read FNestedComments write FNestedComments;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
property D4syntax: boolean read FD4syntax write SetD4syntax default true;
|
property D4syntax: boolean read FD4syntax write SetD4syntax default true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TSynFreePascalSyn }
|
||||||
|
|
||||||
|
TSynFreePascalSyn = class(TSynPasSyn)
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -563,6 +588,21 @@ begin
|
|||||||
end else Result := False;
|
end else Result := False;
|
||||||
end; { KeyComp }
|
end; { KeyComp }
|
||||||
|
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
function TSynPasSyn.TextComp(aText: PChar): Boolean;
|
||||||
|
var
|
||||||
|
CurPos: PChar;
|
||||||
|
begin
|
||||||
|
CurPos:=@fLine[Run];
|
||||||
|
while (aText<>#0) do begin
|
||||||
|
if mHashTable[aText^]<>mHashTable[CurPos^] then exit(false);
|
||||||
|
inc(aText);
|
||||||
|
inc(CurPos);
|
||||||
|
end;
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function TSynPasSyn.Func15: TtkTokenKind;
|
function TSynPasSyn.Func15: TtkTokenKind;
|
||||||
begin
|
begin
|
||||||
if KeyComp('If') then Result := tkKey else Result := tkIdentifier;
|
if KeyComp('If') then Result := tkKey else Result := tkIdentifier;
|
||||||
@ -1186,6 +1226,7 @@ end; { Create }
|
|||||||
|
|
||||||
procedure TSynPasSyn.SetLine(const NewValue: string; LineNumber:Integer);
|
procedure TSynPasSyn.SetLine(const NewValue: string; LineNumber:Integer);
|
||||||
begin
|
begin
|
||||||
|
//DebugLn(['TSynPasSyn.SetLine LineNumber=',LineNumber,' Line="',NewValue,'"']);
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
fLine := NewValue;
|
fLine := NewValue;
|
||||||
fLineLen:=length(fLine);
|
fLineLen:=length(fLine);
|
||||||
@ -1223,6 +1264,30 @@ end;
|
|||||||
|
|
||||||
procedure TSynPasSyn.BorProc;
|
procedure TSynPasSyn.BorProc;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
fTokenID := tkComment;
|
||||||
|
repeat
|
||||||
|
case fLine[Run] of
|
||||||
|
#0: break;
|
||||||
|
'}':
|
||||||
|
if TopPascalCodeFoldBlockType=cfbtNestedComment then
|
||||||
|
EndCodeFoldBlock
|
||||||
|
else begin
|
||||||
|
if fRange = rsBorAsm then
|
||||||
|
fRange := rsAsm
|
||||||
|
else
|
||||||
|
fRange := rsUnKnown;
|
||||||
|
Inc(Run);
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
'{':
|
||||||
|
if NestedComments then begin
|
||||||
|
StartPascalCodeFoldBlock(cfbtNestedComment);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Inc(Run);
|
||||||
|
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
||||||
|
{$ELSE}
|
||||||
case fLine[Run] of
|
case fLine[Run] of
|
||||||
#0: NullProc;
|
#0: NullProc;
|
||||||
#10: LFProc;
|
#10: LFProc;
|
||||||
@ -1239,44 +1304,45 @@ begin
|
|||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
Inc(Run);
|
Inc(Run);
|
||||||
{$IFDEF SYN_LAZARUS}
|
|
||||||
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
|
||||||
{$ELSE}
|
|
||||||
until (fLine[Run] in [#0, #10, #13]);
|
until (fLine[Run] in [#0, #10, #13]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
procedure TSynPasSyn.DirectiveProc;
|
procedure TSynPasSyn.DirectiveProc;
|
||||||
begin
|
begin
|
||||||
case fLine[Run] of
|
|
||||||
#0: NullProc;
|
|
||||||
#10: LFProc;
|
|
||||||
#13: CRProc;
|
|
||||||
else begin
|
|
||||||
fTokenID := tkDirective;
|
fTokenID := tkDirective;
|
||||||
repeat
|
repeat
|
||||||
if fLine[Run] = '}' then begin
|
case fLine[Run] of
|
||||||
Inc(Run);
|
#0: break;
|
||||||
|
'}':
|
||||||
|
if TopPascalCodeFoldBlockType=cfbtNestedComment then
|
||||||
|
EndCodeFoldBlock
|
||||||
|
else begin
|
||||||
if fRange = rsDirectiveAsm then
|
if fRange = rsDirectiveAsm then
|
||||||
fRange := rsAsm
|
fRange := rsAsm
|
||||||
else
|
else
|
||||||
fRange := rsUnKnown;
|
fRange := rsUnKnown;
|
||||||
|
Inc(Run);
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
|
'{':
|
||||||
|
if NestedComments then begin
|
||||||
|
StartPascalCodeFoldBlock(cfbtNestedComment);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
Inc(Run);
|
Inc(Run);
|
||||||
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
procedure TSynPasSyn.BraceOpenProc;
|
procedure TSynPasSyn.BraceOpenProc;
|
||||||
begin
|
begin
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
if (Run=fLineLen) or (fLine[Run+1]<>'$') then begin
|
if (Run=fLineLen) or (fLine[Run+1]<>'$') then begin
|
||||||
|
inc(Run);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
if fRange = rsAsm then
|
if fRange = rsAsm then
|
||||||
fRange := rsBorAsm
|
fRange := rsBorAsm
|
||||||
@ -1285,11 +1351,11 @@ begin
|
|||||||
BorProc;
|
BorProc;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
end else begin
|
end else begin
|
||||||
inc(Run);
|
|
||||||
if fRange = rsAsm then
|
if fRange = rsAsm then
|
||||||
fRange := rsDirectiveAsm
|
fRange := rsDirectiveAsm
|
||||||
else
|
else
|
||||||
fRange := rsDirective;
|
fRange := rsDirective;
|
||||||
|
inc(Run,2);
|
||||||
DirectiveProc;
|
DirectiveProc;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -1401,6 +1467,22 @@ end;
|
|||||||
|
|
||||||
procedure TSynPasSyn.AnsiProc;
|
procedure TSynPasSyn.AnsiProc;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
fTokenID := tkComment;
|
||||||
|
repeat
|
||||||
|
if fLine[Run]=#0 then break;
|
||||||
|
if (fLine[Run] = '*') and (Run<fLineLen) and (fLine[Run + 1] = ')') then
|
||||||
|
begin
|
||||||
|
Inc(Run, 2);
|
||||||
|
if fRange = rsAnsiAsm then
|
||||||
|
fRange := rsAsm
|
||||||
|
else
|
||||||
|
fRange := rsUnKnown;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
Inc(Run);
|
||||||
|
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
||||||
|
{$ELSE}
|
||||||
case fLine[Run] of
|
case fLine[Run] of
|
||||||
#0: NullProc;
|
#0: NullProc;
|
||||||
#10: LFProc;
|
#10: LFProc;
|
||||||
@ -1408,12 +1490,7 @@ begin
|
|||||||
else
|
else
|
||||||
fTokenID := tkComment;
|
fTokenID := tkComment;
|
||||||
repeat
|
repeat
|
||||||
{$IFDEF SYN_LAZARUS}
|
|
||||||
if (fLine[Run] = '*') and (Run<fLineLen) and (fLine[Run + 1] = ')') then
|
|
||||||
begin
|
|
||||||
{$ELSE}
|
|
||||||
if (fLine[Run] = '*') and (fLine[Run + 1] = ')') then begin
|
if (fLine[Run] = '*') and (fLine[Run + 1] = ')') then begin
|
||||||
{$ENDIF}
|
|
||||||
Inc(Run, 2);
|
Inc(Run, 2);
|
||||||
if fRange = rsAnsiAsm then
|
if fRange = rsAnsiAsm then
|
||||||
fRange := rsAsm
|
fRange := rsAsm
|
||||||
@ -1424,6 +1501,7 @@ begin
|
|||||||
Inc(Run);
|
Inc(Run);
|
||||||
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
|
||||||
end;
|
end;
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.RoundOpenProc;
|
procedure TSynPasSyn.RoundOpenProc;
|
||||||
@ -1445,12 +1523,13 @@ begin
|
|||||||
fRange := rsAnsi;
|
fRange := rsAnsi;
|
||||||
fTokenID := tkComment;
|
fTokenID := tkComment;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
if (Run<=fLineLen) and not (fLine[Run] in [#0, #10, #13]) then
|
if (Run<=fLineLen) and not (fLine[Run] in [#0, #10, #13]) then begin
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
if not (fLine[Run] in [#0, #10, #13]) then
|
if not (fLine[Run] in [#0, #10, #13]) then begin
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
AnsiProc;
|
AnsiProc;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
'.':
|
'.':
|
||||||
begin
|
begin
|
||||||
inc(Run);
|
inc(Run);
|
||||||
@ -1548,6 +1627,11 @@ begin
|
|||||||
fTokenID := tkNull;
|
fTokenID := tkNull;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
case fLine[Run] of
|
||||||
|
#0: NullProc;
|
||||||
|
#10: LFProc;
|
||||||
|
#13: CRProc;
|
||||||
|
else
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
case fRange of
|
case fRange of
|
||||||
rsAnsi, rsAnsiAsm:
|
rsAnsi, rsAnsiAsm:
|
||||||
@ -1561,6 +1645,9 @@ begin
|
|||||||
else
|
else
|
||||||
fProcTable[fLine[Run]];
|
fProcTable[fLine[Run]];
|
||||||
end;
|
end;
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynPasSyn.GetDefaultAttribute(Index: integer):
|
function TSynPasSyn.GetDefaultAttribute(Index: integer):
|
||||||
@ -1871,6 +1958,14 @@ begin
|
|||||||
FD4syntax := Value;
|
FD4syntax := Value;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TSynFreePascalSyn }
|
||||||
|
|
||||||
|
constructor TSynFreePascalSyn.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
NestedComments:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
MakeIdentTable;
|
MakeIdentTable;
|
||||||
{$IFNDEF SYN_CPPB_1}
|
{$IFNDEF SYN_CPPB_1}
|
||||||
|
@ -80,7 +80,7 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
TPreviewEditor = TSynEdit;
|
TPreviewEditor = TSynEdit;
|
||||||
TPreviewPasSyn = TSynPasSyn;
|
TPreviewPasSyn = TSynFreePascalSyn;
|
||||||
TCustomSyn = TSynCustomHighlighter;
|
TCustomSyn = TSynCustomHighlighter;
|
||||||
TSynHighlightElement = TSynHighlighterAttributes;
|
TSynHighlightElement = TSynHighlighterAttributes;
|
||||||
TCustomSynClass = class of TCustomSyn;
|
TCustomSynClass = class of TCustomSyn;
|
||||||
@ -111,8 +111,8 @@ const
|
|||||||
|
|
||||||
LazSyntaxHighlighterClasses: array[TLazSyntaxHighlighter] of
|
LazSyntaxHighlighterClasses: array[TLazSyntaxHighlighter] of
|
||||||
TCustomSynClass =
|
TCustomSynClass =
|
||||||
(Nil, Nil, TSynPasSyn, TSynPasSyn, TSynLFMSyn, TSynXMLSyn, TSynHTMLSyn,
|
(Nil, Nil, TSynFreePascalSyn, TSynPasSyn, TSynLFMSyn, TSynXMLSyn,
|
||||||
TSynCPPSyn, TSynPerlSyn, TSynJavaSyn, TSynUNIXShellScriptSyn,
|
TSynHTMLSyn, TSynCPPSyn, TSynPerlSyn, TSynJavaSyn, TSynUNIXShellScriptSyn,
|
||||||
TSynPythonSyn, TSynPHPSyn, TSynSQLSyn);
|
TSynPythonSyn, TSynPHPSyn, TSynSQLSyn);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user