SynEdit: PascalHighlighter, refactor - reduce code duplication, group tokens of the same kind

This commit is contained in:
Martin 2025-04-12 18:04:59 +02:00
parent 266a8bffbf
commit d58545a684

View File

@ -807,6 +807,23 @@ type
function Func181: TtkTokenKind; function Func181: TtkTokenKind;
function Func191: TtkTokenKind; function Func191: TtkTokenKind;
function Func220: TtkTokenKind; function Func220: TtkTokenKind;
function IsCallingConventionModifier(tfb: TPascalCodeFoldBlockType): Boolean; inline;
function IsCallingConventionModifier(const AnUpperKey: string): Boolean; inline;
function IsCallingConventionModifier(const AnUpperKey: string; tfb: TPascalCodeFoldBlockType): Boolean; inline;
function DoCallingConventionModifier: TtkTokenKind; inline;
function IsHintModifier(tfb: TPascalCodeFoldBlockType): Boolean; inline;
function IsHintModifier(const AnUpperKey: string): Boolean; inline;
function IsHintModifier(const AnUpperKey: string; tfb: TPascalCodeFoldBlockType): Boolean; inline;
function DoHintModifier: TtkTokenKind; inline;
function IsClassSection: Boolean; inline;
function IsClassSection(const AnUpperKey: string): Boolean; inline;
function DoClassSection: TtkTokenKind; inline;
function IsVirtualityModifier: Boolean; inline;
function IsVirtualityModifier(const AnUpperKey: string): Boolean; inline;
function DoVirtualityModifier: TtkTokenKind; inline;
function IsPropertyDefinitionKey: Boolean; inline;
function IsPropertyDefinitionKey(const AnUpperKey: string): Boolean; inline;
function DoPropertyDefinitionKey: TtkTokenKind; inline;
function AltFunc: TtkTokenKind; function AltFunc: TtkTokenKind;
procedure InitIdent; procedure InitIdent;
function IdentKind(p: integer): TtkTokenKind; function IdentKind(p: integer): TtkTokenKind;
@ -866,6 +883,7 @@ type
procedure DestroyDividerDrawConfig; procedure DestroyDividerDrawConfig;
protected protected
function KeyComp(const aKey: string): Boolean; function KeyComp(const aKey: string): Boolean;
function KeyCompU(const AnUpperKey: string): Boolean; // Only a..z / Key must be already uppercase
function KeyCompEx(AText1, AText2: pchar; ALen: Integer): Boolean; function KeyCompEx(AText1, AText2: pchar; ALen: Integer): Boolean;
function GetIdentChars: TSynIdentChars; override; function GetIdentChars: TSynIdentChars; override;
function IsFilterStored: boolean; override; //mh 2000-10-08 function IsFilterStored: boolean; override; //mh 2000-10-08
@ -1404,6 +1422,26 @@ begin
end else Result := False; end else Result := False;
end; { KeyComp } end; { KeyComp }
function TSynPasSyn.KeyCompU(const AnUpperKey: string): Boolean;
var
Temp, Temp2: PChar;
k: Byte;
begin
Result := Length(AnUpperKey) = fStringLen;
if Result then begin
Temp := fLine + fToIdent;
Temp2 := PChar(AnUpperKey);
k := byte(Temp2^);
while k <> 0 do begin
Result := (byte(Temp^) and $DF) = byte(Temp2^);
if not Result then break;
inc(Temp);
inc(Temp2);
k := byte(Temp2^);
end;
end;
end;
function TSynPasSyn.KeyCompEx(AText1, AText2: pchar; ALen: Integer): Boolean; function TSynPasSyn.KeyCompEx(AText1, AText2: pchar; ALen: Integer): Boolean;
begin begin
Result := False; Result := False;
@ -1886,27 +1924,16 @@ end;
function TSynPasSyn.Func25: TtkTokenKind; function TSynPasSyn.Func25: TtkTokenKind;
begin begin
if (PasCodeFoldRange.BracketNestLevel = 0) and if IsCallingConventionModifier('FAR') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed) and else
KeyComp('Far') Result := tkIdentifier;
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func27: TtkTokenKind; function TSynPasSyn.Func27: TtkTokenKind;
begin begin
if KeyComp('Cdecl') and if IsCallingConventionModifier('CDECL') then
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -1925,14 +1952,8 @@ begin
DoAfterOperator; DoAfterOperator;
end end
else else
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and if IsPropertyDefinitionKey('READ') then begin
(PasCodeFoldRange.BracketNestLevel = 0) and Result := DoPropertyDefinitionKey;
KeyComp('Read')
then begin
Result := tkKey;
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification];
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
end end
else if KeyComp('Case') then begin else if KeyComp('Case') then begin
if TopPascalCodeFoldBlockType in PascalStatementBlocks + [cfbtUnitSection] then begin if TopPascalCodeFoldBlockType in PascalStatementBlocks + [cfbtUnitSection] then begin
@ -2083,15 +2104,10 @@ end;
function TSynPasSyn.Func38: TtkTokenKind; function TSynPasSyn.Func38: TtkTokenKind;
begin begin
if (PasCodeFoldRange.BracketNestLevel = 0) and if IsCallingConventionModifier('NEAR') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed) and else
KeyComp('Near') Result := tkIdentifier;
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func39: TtkTokenKind; function TSynPasSyn.Func39: TtkTokenKind;
@ -2182,14 +2198,8 @@ begin
FRange := FRange + [rsInProcHeader]; FRange := FRange + [rsInProcHeader];
end end
else else
if KeyComp('Final') and if IsVirtualityModifier('FINAL') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and Result := DoVirtualityModifier
(tfb in [cfbtClass, cfbtClassSection]) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2275,14 +2285,8 @@ end;
function TSynPasSyn.Func52: TtkTokenKind; function TSynPasSyn.Func52: TtkTokenKind;
begin begin
if KeyComp('Pascal') and if IsCallingConventionModifier('PASCAL') then
(PasCodeFoldRange.BracketNestLevel in [0,1]) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
if KeyComp('Raise') then begin if KeyComp('Raise') then begin
Result := tkKey; Result := tkKey;
@ -2327,21 +2331,13 @@ end;
function TSynPasSyn.Func56: TtkTokenKind; function TSynPasSyn.Func56: TtkTokenKind;
begin begin
if KeyComp('Index') then if IsPropertyDefinitionKey('INDEX') then
begin Result := DoPropertyDefinitionKey
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and else
(PasCodeFoldRange.BracketNestLevel = 0) if KeyCompU('OUT') then
then begin Result := tkKey
Result := tkKey;
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification];
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end
else
if KeyComp('Out') then Result := tkKey else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func57: TtkTokenKind; function TSynPasSyn.Func57: TtkTokenKind;
@ -2373,14 +2369,10 @@ end;
function TSynPasSyn.Func59: TtkTokenKind; function TSynPasSyn.Func59: TtkTokenKind;
begin begin
if (KeyComp('Safecall') or KeyComp('cppdecl')) and if IsCallingConventionModifier(TopPascalCodeFoldBlockType) and
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and ( KeyCompU('SAFECALL') or KeyCompU('CPPDECL') )
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and then
(TopPascalCodeFoldBlockType in ProcModifierAllowed) Result := DoCallingConventionModifier
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2426,20 +2418,10 @@ function TSynPasSyn.Func63: TtkTokenKind;
var var
tfb: TPascalCodeFoldBlockType; tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Public') then begin if KeyCompU('PUBLIC') then begin
tfb := TopPascalCodeFoldBlockType; tfb := TopPascalCodeFoldBlockType;
if (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]) and if IsClassSection then begin
(PasCodeFoldRange.BracketNestLevel = 0) and Result := DoClassSection;
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) )
then begin
Result := tkKey;
FNextTokenState := tsAtBeginOfStatement;
fRange := fRange - [rsAfterClassMembers, rsVarTypeInSpecification];
tfb := CloseFolds(tfb, [cfbtClassConstBlock, cfbtClassTypeBlock]);
if (tfb=cfbtClassSection) then
EndPascalCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtClassSection);
end end
else else
// outside class: procedure foo; public name 'abc'; // outside class: procedure foo; public name 'abc';
@ -2597,10 +2579,7 @@ begin
) )
then begin then begin
if rsProperty in fRange then begin if rsProperty in fRange then begin
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification]; Result := DoPropertyDefinitionKey;
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
Result := tkKey
end end
else else
Result := tkModifier; Result := tkModifier;
@ -2608,15 +2587,11 @@ begin
else else
Result := tkIdentifier; Result := tkIdentifier;
end else end else
if (PasCodeFoldRange.BracketNestLevel = 0) and if IsVirtualityModifier('DYNAMIC') then begin
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and Result := DoVirtualityModifier;
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
KeyComp('Dynamic')
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end end
else else
// currently same check as IsVirtualityModifier
if KeyComp('Message') and if KeyComp('Message') and
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and (TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
@ -2633,17 +2608,11 @@ function TSynPasSyn.Func71: TtkTokenKind;
var var
tfb: TPascalCodeFoldBlockType; tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Stdcall') and tfb := TopPascalCodeFoldBlockType;
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and if IsCallingConventionModifier('STDCALL', tfb) then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else if KeyComp('Const') then begin else if KeyComp('Const') then begin
if (PasCodeFoldRange.BracketNestLevel = 0) then begin if (PasCodeFoldRange.BracketNestLevel = 0) then begin
tfb := TopPascalCodeFoldBlockType;
// If already in cfbtClassTypeBlock, then keep block going / save the close, open // If already in cfbtClassTypeBlock, then keep block going / save the close, open
if tfb in cfbtVarConstTypeLabelExt - [cfbtClassConstBlock] then begin if tfb in cfbtVarConstTypeLabelExt - [cfbtClassConstBlock] then begin
EndPascalCodeFoldBlockLastLine; EndPascalCodeFoldBlockLastLine;
@ -2697,15 +2666,8 @@ end;
function TSynPasSyn.Func75: TtkTokenKind; function TSynPasSyn.Func75: TtkTokenKind;
begin begin
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and if IsPropertyDefinitionKey('WRITE') then
(PasCodeFoldRange.BracketNestLevel = 0) and Result := DoPropertyDefinitionKey
KeyComp('Write') then
begin
Result := tkKey;
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification];
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2736,17 +2698,9 @@ begin
end; end;
function TSynPasSyn.Func81: TtkTokenKind; function TSynPasSyn.Func81: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and if IsPropertyDefinitionKey('STORED') then begin
(PasCodeFoldRange.BracketNestLevel = 0) and Result := DoPropertyDefinitionKey;
KeyComp('Stored')
then begin
Result := tkKey;
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification];
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
end end
else if KeyComp('Interface') then begin else if KeyComp('Interface') then begin
if (rsAfterEqual in fRange) and (PasCodeFoldRange.BracketNestLevel = 0) if (rsAfterEqual in fRange) and (PasCodeFoldRange.BracketNestLevel = 0)
@ -2771,33 +2725,8 @@ begin
end; end;
Result := tkKey Result := tkKey
end end
else if KeyComp('Deprecated') then begin else if IsHintModifier('DEPRECATED') then
tfb := TopPascalCodeFoldBlockType; Result := DoHintModifier
if ( ( (tfb in cfbtVarConstType) and
(FTokenState <> tsAfterAbsolute) and
(fRange * [rsVarTypeInSpecification, rsAfterEqualOrColon] = [rsVarTypeInSpecification]) ) or
( (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtRecordCase, cfbtRecordCaseSection, cfbtClassConstBlock, cfbtClassTypeBlock]) and
( (fRange * [rsAfterClassMembers, rsInProcHeader] = [rsAfterClassMembers]) or
(fRange * [rsAfterClassMembers, rsAfterEqualOrColon, rsVarTypeInSpecification] = [rsVarTypeInSpecification])
) ) or
( (tfb in [cfbtUnitSection, cfbtProgram, cfbtProcedure]) and
(fRange * [rsInProcHeader] = []) ) or
( (tfb in [cfbtUnit, cfbtNone]) and
(fRange * [rsInProcHeader] = []) and (FTokenState = tsAfterProcName) )
) and
( fRange *[rsAfterEqualOrColon, rsProperty] = [] ) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkModifier;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
(CompilerMode = pcmDelphi)
then
FRange := FRange + [rsInProcHeader]; // virtual reintroduce overload can be after virtual
end
else
Result := tkIdentifier;
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2806,7 +2735,7 @@ function TSynPasSyn.Func84: TtkTokenKind;
begin begin
if (PasCodeFoldRange.BracketNestLevel = 0) and if (PasCodeFoldRange.BracketNestLevel = 0) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and (TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
KeyComp('Abstract') KeyCompu('ABSTRACT')
then begin then begin
Result := tkModifier; Result := tkModifier;
// type foo = class abstract // type foo = class abstract
@ -2816,8 +2745,8 @@ begin
end end
else else
// procedure foo; virtual; abstract; // procedure foo; virtual; abstract;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) then if IsVirtualityModifier('ABSTRACT') then
FRange := FRange + [rsInProcHeader] Result := DoVirtualityModifier
else else
Result := tkIdentifier; Result := tkIdentifier;
end end
@ -2833,14 +2762,9 @@ begin
StartPascalCodeFoldBlock(cfbtClass); StartPascalCodeFoldBlock(cfbtClass);
end; end;
end end
else if KeyComp('oldfpccall') and else
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and if IsCallingConventionModifier('OLDFPCCALL') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2870,15 +2794,10 @@ end;
function TSynPasSyn.Func86: TtkTokenKind; function TSynPasSyn.Func86: TtkTokenKind;
begin begin
if (PasCodeFoldRange.BracketNestLevel in [0, 1]) and if IsCallingConventionModifier('VARARGS') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed) and else
KeyComp('VarArgs') Result := tkIdentifier;
then begin
Result := tkKey;
FRange := FRange + [rsInProcHeader];
end
else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func87: TtkTokenKind; function TSynPasSyn.Func87: TtkTokenKind;
@ -2899,14 +2818,9 @@ begin
StartPascalCodeFoldBlock(cfbtProgram); StartPascalCodeFoldBlock(cfbtProgram);
Result := tkKey; Result := tkKey;
end end
else if KeyComp('Mwpascal') and else
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and if IsCallingConventionModifier('MWPASCAL') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -2937,11 +2851,7 @@ begin
end; end;
end end
else else
if KeyComp('strict') and if IsClassSection('STRICT') and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]) and
(PasCodeFoldRange.BracketNestLevel = 0) and
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) ) and
ScanForClassSection ScanForClassSection
then begin then begin
CloseFolds(TopPascalCodeFoldBlockType, [cfbtClassConstBlock, cfbtClassTypeBlock]); CloseFolds(TopPascalCodeFoldBlockType, [cfbtClassConstBlock, cfbtClassTypeBlock]);
@ -2953,26 +2863,12 @@ begin
end; end;
function TSynPasSyn.Func91: TtkTokenKind; function TSynPasSyn.Func91: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Downto') then if KeyComp('Downto') then
Result := tkKey Result := tkKey
else else
if KeyComp('Private') and if IsClassSection('PRIVATE') then
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]) and Result := DoClassSection
(PasCodeFoldRange.BracketNestLevel = 0) and
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) )
then begin
Result := tkKey;
FNextTokenState := tsAtBeginOfStatement;
fRange := fRange - [rsAfterClassMembers, rsVarTypeInSpecification];
tfb := CloseFolds(TopPascalCodeFoldBlockType(), [cfbtClassConstBlock, cfbtClassTypeBlock]);
if (tfb=cfbtClassSection) then
EndPascalCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtClassSection);
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3008,11 +2904,8 @@ begin
FRange := FRange + [rsInProcHeader]; FRange := FRange + [rsInProcHeader];
end end
else else
if KeyComp('Readonly') then if IsPropertyDefinitionKey('READONLY') then
begin begin
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkKey; Result := tkKey;
FOldRange := FOldRange - [rsAtPropertyOrReadWrite]; FOldRange := FOldRange - [rsAtPropertyOrReadWrite];
if FTokenState = tsAfterProperty then if FTokenState = tsAfterProperty then
@ -3020,7 +2913,6 @@ begin
end end
else else
Result := tkIdentifier; Result := tkIdentifier;
end else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func95: TtkTokenKind; function TSynPasSyn.Func95: TtkTokenKind;
@ -3044,32 +2936,13 @@ begin
end; end;
function TSynPasSyn.Func96: TtkTokenKind; function TSynPasSyn.Func96: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Published') and if IsClassSection('PUBLISHED') then begin
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]) and Result := DoClassSection;
(PasCodeFoldRange.BracketNestLevel = 0) and
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) )
then begin
Result := tkKey;
FNextTokenState := tsAtBeginOfStatement;
fRange := fRange - [rsAfterClassMembers, rsVarTypeInSpecification];
tfb := CloseFolds(TopPascalCodeFoldBlockType(), [cfbtClassConstBlock, cfbtClassTypeBlock]);
if (tfb=cfbtClassSection) then
EndPascalCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtClassSection);
end end
else else
if (PasCodeFoldRange.BracketNestLevel = 0) and if IsVirtualityModifier('OVERRIDE') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and Result := DoVirtualityModifier
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
KeyComp('Override')
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3157,14 +3030,13 @@ end;
function TSynPasSyn.Func100: TtkTokenKind; function TSynPasSyn.Func100: TtkTokenKind;
begin begin
if KeyComp('Automated') and // in old times: class section (* TODO: The delpi compiler has an "Automated" class section. But FPC does not have it.
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord]) and So even in "$mode delphi" this is not available.
(PasCodeFoldRange.BracketNestLevel = 0) and If this is needed, then we need a "property compiler"
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and *)
( (FTokenState in [tsAtBeginOfStatement, tsAfterTypedConst, tsAfterClass]) or (fRange * [rsInClassHeader, rsAfterIdentifierOrValue] <> []) ) //if (CompilerMode = pcmDelphi) and IsClassSection('AUTOMATED') then
then // Result := DoClassSection
Result := tkKey //else
else
if (rsInProcHeader in fRange) and KeyComp('constref') and if (rsInProcHeader in fRange) and KeyComp('constref') and
(PasCodeFoldRange.BracketNestLevel = 1) (PasCodeFoldRange.BracketNestLevel = 1)
then then
@ -3174,48 +3046,17 @@ begin
end; end;
function TSynPasSyn.Func101: TtkTokenKind; function TSynPasSyn.Func101: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
tfb := TopPascalCodeFoldBlockType; if IsCallingConventionModifier('REGISTER') then begin
if KeyComp('Register') and Result := DoCallingConventionModifier;
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(tfb in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end end
else else
if KeyComp('Platform') then begin if IsHintModifier('PLATFORM') then begin
if ( ( (tfb in cfbtVarConstType) and Result := DoHintModifier;
(FTokenState <> tsAfterAbsolute) and
(fRange * [rsVarTypeInSpecification, rsAfterEqualOrColon] = [rsVarTypeInSpecification]) ) or
( (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtRecordCase, cfbtRecordCaseSection, cfbtClassConstBlock, cfbtClassTypeBlock]) and
( (fRange * [rsAfterClassMembers, rsInProcHeader] = [rsAfterClassMembers]) or
(fRange * [rsAfterClassMembers, rsAfterEqualOrColon, rsVarTypeInSpecification] = [rsVarTypeInSpecification])
) ) or
( (tfb in [cfbtUnitSection, cfbtProgram, cfbtProcedure]) and
(fRange * [rsInProcHeader] = []) ) or
( (tfb in [cfbtUnit, cfbtNone]) and
(fRange * [rsInProcHeader] = []) and (FTokenState = tsAfterProcName) )
) and
( fRange *[rsAfterEqualOrColon, rsProperty] = [] ) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkModifier;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(tfb in [cfbtClass, cfbtClassSection]) and
(CompilerMode = pcmDelphi)
then
FRange := FRange + [rsInProcHeader]; // virtual reintroduce overload can be after virtual
end
else
Result := tkIdentifier;
end end
else else
if FExtendedKeywordsMode and KeyComp('Continue') and if FExtendedKeywordsMode and KeyComp('Continue') and
(tfb in PascalStatementBlocks) and (fRange * [rsAfterEqualOrColon] = []) and (TopPascalCodeFoldBlockType in PascalStatementBlocks) and (fRange * [rsAfterEqualOrColon] = []) and
(PasCodeFoldRange.BracketNestLevel = 0) (PasCodeFoldRange.BracketNestLevel = 0)
then then
Result := tkKey Result := tkKey
@ -3271,15 +3112,10 @@ end;
function TSynPasSyn.Func103: TtkTokenKind; function TSynPasSyn.Func103: TtkTokenKind;
begin begin
if (PasCodeFoldRange.BracketNestLevel = 0) and if IsVirtualityModifier('VIRTUAL') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and Result := DoVirtualityModifier
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and else
KeyComp('Virtual') Result := tkIdentifier;
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func105: TtkTokenKind; function TSynPasSyn.Func105: TtkTokenKind;
@ -3330,24 +3166,11 @@ begin
end; end;
function TSynPasSyn.Func106: TtkTokenKind; function TSynPasSyn.Func106: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Protected') and if IsClassSection('PROTECTED') then
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]) and Result := DoClassSection
(PasCodeFoldRange.BracketNestLevel = 0) and else
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and Result := tkIdentifier;
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) )
then begin
Result := tkKey;
FNextTokenState := tsAtBeginOfStatement;
fRange := fRange - [rsAfterClassMembers, rsVarTypeInSpecification];
tfb := CloseFolds(TopPascalCodeFoldBlockType(), [cfbtClassConstBlock, cfbtClassTypeBlock]);
if (tfb=cfbtClassSection) then
EndPascalCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtClassSection);
end
else Result := tkIdentifier;
end; end;
function TSynPasSyn.Func108: TtkTokenKind; function TSynPasSyn.Func108: TtkTokenKind;
@ -3429,23 +3252,10 @@ end;
function TSynPasSyn.Func125: TtkTokenKind; function TSynPasSyn.Func125: TtkTokenKind;
begin begin
if KeyComp('NoReturn') and if IsCallingConventionModifier(TopPascalCodeFoldBlockType) and
(PasCodeFoldRange.BracketNestLevel = 0) and ( KeyCompU('NORETURN') or KeyCompU('MS_ABI_CDECL') )
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and then
(TopPascalCodeFoldBlockType in ProcModifierAllowed) Result := DoCallingConventionModifier
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else
if KeyComp('Ms_abi_cdecl') and
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3457,14 +3267,8 @@ begin
if rsProperty in fRange then Result := tkKey else Result := tkIdentifier; if rsProperty in fRange then Result := tkKey else Result := tkIdentifier;
end end
else else
if (PasCodeFoldRange.BracketNestLevel in [0, 1]) and if IsCallingConventionModifier('NOSTACKFRAME') then
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and Result := DoCallingConventionModifier
(TopPascalCodeFoldBlockType in ProcModifierAllowed) and
KeyComp('NoStackFrame')
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3520,14 +3324,9 @@ end;
function TSynPasSyn.Func132: TtkTokenKind; function TSynPasSyn.Func132: TtkTokenKind;
begin begin
if D4syntax and if D4syntax and
(PasCodeFoldRange.BracketNestLevel = 0) and IsVirtualityModifier('REINTRODUCE')
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and then
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and Result := DoVirtualityModifier
KeyComp('Reintroduce')
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3589,36 +3388,9 @@ begin
end; end;
function TSynPasSyn.Func142: TtkTokenKind; function TSynPasSyn.Func142: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
if KeyComp('Experimental') then begin if IsHintModifier('EXPERIMENTAL') then
tfb := TopPascalCodeFoldBlockType; Result := DoHintModifier
if ( ( (tfb in cfbtVarConstType) and
(FTokenState <> tsAfterAbsolute) and
(fRange * [rsVarTypeInSpecification, rsAfterEqualOrColon] = [rsVarTypeInSpecification]) ) or
( (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtRecordCase, cfbtRecordCaseSection, cfbtClassConstBlock, cfbtClassTypeBlock]) and
( (fRange * [rsAfterClassMembers, rsInProcHeader] = [rsAfterClassMembers]) or
(fRange * [rsAfterClassMembers, rsAfterEqualOrColon, rsVarTypeInSpecification] = [rsVarTypeInSpecification])
) ) or
( (tfb in [cfbtUnitSection, cfbtProgram, cfbtProcedure]) and
(fRange * [rsInProcHeader] = []) ) or
( (tfb in [cfbtUnit, cfbtNone]) and
(fRange * [rsInProcHeader] = []) and (FTokenState = tsAfterProcName) )
) and
( fRange *[rsAfterEqualOrColon, rsProperty] = [] ) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkModifier;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
(CompilerMode = pcmDelphi)
then
FRange := FRange + [rsInProcHeader]; // virtual reintroduce overload can be after virtual
end
else
Result := tkIdentifier;
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3680,36 +3452,9 @@ begin
end; end;
function TSynPasSyn.Func151: TtkTokenKind; function TSynPasSyn.Func151: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin begin
tfb := TopPascalCodeFoldBlockType; if IsHintModifier('UNIMPLEMENTED') then
if KeyComp('Unimplemented') then begin Result := DoHintModifier
if ( ( (tfb in cfbtVarConstType) and
(FTokenState <> tsAfterAbsolute) and
(fRange * [rsVarTypeInSpecification, rsAfterEqualOrColon] = [rsVarTypeInSpecification]) ) or
( (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtRecordCase, cfbtRecordCaseSection, cfbtClassConstBlock, cfbtClassTypeBlock]) and
( (fRange * [rsAfterClassMembers, rsInProcHeader] = [rsAfterClassMembers]) or
(fRange * [rsAfterClassMembers, rsAfterEqualOrColon, rsVarTypeInSpecification] = [rsVarTypeInSpecification])
) ) or
( (tfb in [cfbtUnitSection, cfbtProgram, cfbtProcedure]) and
(fRange * [rsInProcHeader] = []) ) or
( (tfb in [cfbtUnit, cfbtNone]) and
(fRange * [rsInProcHeader] = []) and (FTokenState = tsAfterProcName) )
) and
( fRange *[rsAfterEqualOrColon, rsProperty] = [] ) and
(PasCodeFoldRange.BracketNestLevel = 0)
then begin
Result := tkModifier;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
(CompilerMode = pcmDelphi)
then
FRange := FRange + [rsInProcHeader]; // virtual reintroduce overload can be after virtual
end
else
Result := tkIdentifier;
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3770,14 +3515,8 @@ begin
FTokenIsValueOrTypeName := True; FTokenIsValueOrTypeName := True;
end end
else else
if KeyComp('Ms_abi_default') and if IsCallingConventionModifier('MS_ABI_DEFAULT') then
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
@ -3831,46 +3570,167 @@ end;
function TSynPasSyn.Func111: TtkTokenKind; function TSynPasSyn.Func111: TtkTokenKind;
begin begin
if KeyComp('vectorcall') and if IsCallingConventionModifier('VECTORCALL') then
(PasCodeFoldRange.BracketNestLevel = 0) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
function TSynPasSyn.Func178: TtkTokenKind; function TSynPasSyn.Func178: TtkTokenKind;
begin begin
if KeyComp('Sysv_abi_cdecl') and if IsCallingConventionModifier('SYSV_ABI_CDECL') then
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
function TSynPasSyn.Func220: TtkTokenKind; function TSynPasSyn.Func220: TtkTokenKind;
begin begin
if KeyComp('Sysv_abi_default') and if IsCallingConventionModifier('SYSV_ABI_DEFAULT') then
(PasCodeFoldRange.BracketNestLevel in [0, 1]) and Result := DoCallingConventionModifier
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(TopPascalCodeFoldBlockType in ProcModifierAllowed)
then begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end; end;
function TSynPasSyn.IsCallingConventionModifier(tfb: TPascalCodeFoldBlockType): Boolean;
begin
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader] = [rsWasInProcHeader]) and
(PasCodeFoldRange.RoundBracketNestLevel = 0) and
(PasCodeFoldRange.BracketNestLevel <= 1) and // can be: [cdecl]
(tfb in ProcModifierAllowed)
then
Result := True
else
Result := False;
end;
function TSynPasSyn.IsCallingConventionModifier(const AnUpperKey: string): Boolean;
begin
Result := IsCallingConventionModifier(TopPascalCodeFoldBlockType) and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.IsCallingConventionModifier(const AnUpperKey: string;
tfb: TPascalCodeFoldBlockType): Boolean;
begin
Result := IsCallingConventionModifier(tfb) and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.DoCallingConventionModifier: TtkTokenKind;
begin
FRange := FRange + [rsInProcHeader] - [rsWasInProcHeader];
Result := tkModifier;
end;
function TSynPasSyn.IsHintModifier(tfb: TPascalCodeFoldBlockType): Boolean;
begin
tfb := TopPascalCodeFoldBlockType;
if (fRange *[rsAfterEqualOrColon, rsProperty] = []) and
(PasCodeFoldRange.BracketNestLevel = 0) and
( ( (tfb in cfbtVarConstType) and
(FTokenState <> tsAfterAbsolute) and
(fRange * [rsVarTypeInSpecification, rsAfterEqualOrColon] = [rsVarTypeInSpecification]) ) or
( (tfb in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtRecordCase, cfbtRecordCaseSection, cfbtClassConstBlock, cfbtClassTypeBlock]) and
( (fRange * [rsAfterClassMembers, rsInProcHeader] = [rsAfterClassMembers]) or
(fRange * [rsAfterClassMembers, rsAfterEqualOrColon, rsVarTypeInSpecification] = [rsVarTypeInSpecification])
) ) or
( (tfb in [cfbtUnitSection, cfbtProgram, cfbtProcedure]) and
(fRange * [rsInProcHeader] = []) ) or
( (tfb in [cfbtUnit, cfbtNone]) and
(fRange * [rsInProcHeader] = []) and (FTokenState = tsAfterProcName) )
)
then
Result := True
else
Result := False;
end;
function TSynPasSyn.IsHintModifier(const AnUpperKey: string): Boolean;
begin
Result := IsHintModifier(TopPascalCodeFoldBlockType) and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.IsHintModifier(const AnUpperKey: string; tfb: TPascalCodeFoldBlockType
): Boolean;
begin
Result := IsHintModifier(tfb) and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.DoHintModifier: TtkTokenKind;
begin
Result := tkModifier;
if (fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]) and
(CompilerMode = pcmDelphi)
then
FRange := FRange + [rsInProcHeader]; // virtual reintroduce overload can be after virtual
end;
function TSynPasSyn.IsClassSection: Boolean;
begin
Result :=
(fRange * [rsInProcHeader, rsAfterEqualOrColon] = []) and
( (FTokenState in [tsAtBeginOfStatement, tsAfterVarConstType, tsAfterClass, tsAfterTypedConst]) or (fRange * [rsInClassHeader, rsInObjcProtocol, rsAfterIdentifierOrValue] <> []) ) and
(PasCodeFoldRange.BracketNestLevel = 0) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord, cfbtClassConstBlock, cfbtClassTypeBlock]);
end;
function TSynPasSyn.IsClassSection(const AnUpperKey: string): Boolean;
begin
Result := IsClassSection() and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.DoClassSection: TtkTokenKind;
var
tfb: TPascalCodeFoldBlockType;
begin
Result := tkKey;
FNextTokenState := tsAtBeginOfStatement;
fRange := fRange - [rsAfterClassMembers, rsVarTypeInSpecification];
tfb := CloseFolds(TopPascalCodeFoldBlockType(), [cfbtClassConstBlock, cfbtClassTypeBlock]);
if (tfb=cfbtClassSection) then
EndPascalCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtClassSection);
end;
function TSynPasSyn.IsVirtualityModifier: Boolean;
begin
Result :=
(fRange * [rsInProcHeader, rsProperty, rsAfterEqualOrColon, rsWasInProcHeader, rsAfterClassMembers] = [rsWasInProcHeader, rsAfterClassMembers]) and
(PasCodeFoldRange.BracketNestLevel = 0) and
(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]);
end;
function TSynPasSyn.IsVirtualityModifier(const AnUpperKey: string): Boolean;
begin
Result := IsVirtualityModifier() and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.DoVirtualityModifier: TtkTokenKind;
begin
Result := tkModifier;
FRange := FRange + [rsInProcHeader];
end;
function TSynPasSyn.IsPropertyDefinitionKey: Boolean;
begin
Result :=
(fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and
(PasCodeFoldRange.BracketNestLevel = 0);
end;
function TSynPasSyn.IsPropertyDefinitionKey(const AnUpperKey: string): Boolean;
begin
Result := IsPropertyDefinitionKey() and KeyCompU(AnUpperKey);
end;
function TSynPasSyn.DoPropertyDefinitionKey: TtkTokenKind;
begin
Result := tkKey;
fRange := fRange + [rsAtPropertyOrReadWrite] - [rsVarTypeInSpecification];
if FTokenState = tsAfterProperty then
FTokenState := tsNone;
end;
function TSynPasSyn.AltFunc: TtkTokenKind; function TSynPasSyn.AltFunc: TtkTokenKind;
begin begin
Result := tkIdentifier; Result := tkIdentifier;