mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 13:09:39 +02:00
SynEdit: PasHighLighter, fix class sections (private/public/...). Issue #40614 / broken in commit cbf59cc75a
This commit is contained in:
parent
fb3002163e
commit
b9f865d16d
@ -92,10 +92,10 @@ type
|
|||||||
rsAtClass,
|
rsAtClass,
|
||||||
rsInObjcProtocol,
|
rsInObjcProtocol,
|
||||||
rsAfterClass,
|
rsAfterClass,
|
||||||
|
rsInTypeHelper,
|
||||||
rsAfterIdentifierOrValue, // anywhere where a ^ deref can happen "foo^", "foo^^", "foo()^", "foo[]^"
|
rsAfterIdentifierOrValue, // anywhere where a ^ deref can happen "foo^", "foo^^", "foo()^", "foo[]^"
|
||||||
rsAfterIdentifierOrValueAdd,
|
rsAfterIdentifierOrValueAdd,
|
||||||
|
|
||||||
rsAtClosingBracket, // ')'
|
|
||||||
rsAtCaseLabel,
|
rsAtCaseLabel,
|
||||||
rsAtProcName, // after a procedure/function/... keyword, when the name is expected (not for types)
|
rsAtProcName, // after a procedure/function/... keyword, when the name is expected (not for types)
|
||||||
// also after "unit unitname" to detect "deprecated"
|
// also after "unit unitname" to detect "deprecated"
|
||||||
@ -1417,7 +1417,12 @@ begin
|
|||||||
if KeyComp('For') then begin
|
if KeyComp('For') then begin
|
||||||
Result := tkKey;
|
Result := tkKey;
|
||||||
if TopPascalCodeFoldBlockType in PascalStatementBlocks then
|
if TopPascalCodeFoldBlockType in PascalStatementBlocks then
|
||||||
StartPascalCodeFoldBlock(cfbtForDo);
|
StartPascalCodeFoldBlock(cfbtForDo)
|
||||||
|
else
|
||||||
|
if rsInTypeHelper in FOldRange then begin
|
||||||
|
fRange := fRange + [rsInTypeHelper];
|
||||||
|
FOldRange := FOldRange - [rsInTypeHelper];
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if KeyComp('Shl') then begin
|
if KeyComp('Shl') then begin
|
||||||
@ -1722,9 +1727,10 @@ begin
|
|||||||
end
|
end
|
||||||
else if KeyComp('Record') then begin
|
else if KeyComp('Record') then begin
|
||||||
StartPascalCodeFoldBlock(cfbtRecord);
|
StartPascalCodeFoldBlock(cfbtRecord);
|
||||||
fRange := fRange - [rsVarTypeInSpecification];
|
fRange := fRange - [rsVarTypeInSpecification, rsAfterEqual, rsAfterEqualOrColon] + [rsAfterSemiColon];
|
||||||
|
FOldRange := FOldRange - [rsAfterSemiColon];
|
||||||
if CompilerMode = pcmDelphi then
|
if CompilerMode = pcmDelphi then
|
||||||
fRange := fRange + [rsAtClass] - [rsAfterEqual, rsAfterEqualOrColon]; // highlight helper
|
fRange := fRange + [rsAtClass]; // highlight helper
|
||||||
Result := tkKey;
|
Result := tkKey;
|
||||||
end
|
end
|
||||||
else if KeyComp('Array') then Result := tkKey
|
else if KeyComp('Array') then Result := tkKey
|
||||||
@ -1763,12 +1769,14 @@ begin
|
|||||||
// TODO: "class helper" fold at "class", but "type helper" fold at "helper"
|
// TODO: "class helper" fold at "class", but "type helper" fold at "helper"
|
||||||
else if KeyComp('helper') then begin
|
else if KeyComp('helper') then begin
|
||||||
if (rsAtClass in fRange) and (PasCodeFoldRange.BracketNestLevel = 0)
|
if (rsAtClass in fRange) and (PasCodeFoldRange.BracketNestLevel = 0)
|
||||||
then
|
then begin
|
||||||
Result := tkKey
|
Result := tkKey;
|
||||||
|
fRange := fRange - [rsVarTypeInSpecification, rsAfterEqual] + [rsInTypeHelper];
|
||||||
|
end
|
||||||
else
|
else
|
||||||
if (rsAfterEqualThenType in fRange) and TypeHelpers then begin
|
if (rsAfterEqualThenType in fRange) and TypeHelpers then begin
|
||||||
Result := tkKey;
|
Result := tkKey;
|
||||||
fRange := fRange - [rsVarTypeInSpecification, rsAfterEqual];
|
fRange := fRange - [rsVarTypeInSpecification, rsAfterEqual] + [rsInTypeHelper];
|
||||||
StartPascalCodeFoldBlock(cfbtClass); // type helper
|
StartPascalCodeFoldBlock(cfbtClass); // type helper
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -3712,10 +3720,6 @@ begin
|
|||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
fRange := fRange + [rsAfterIdentifierOrValueAdd];
|
fRange := fRange + [rsAfterIdentifierOrValueAdd];
|
||||||
PasCodeFoldRange.DecBracketNestLevel;
|
PasCodeFoldRange.DecBracketNestLevel;
|
||||||
if (PasCodeFoldRange.BracketNestLevel = 0) then begin
|
|
||||||
if (fRange * [rsAfterClass] <> []) then
|
|
||||||
fRange := fRange + [rsAtClosingBracket];
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.SquareOpenProc;
|
procedure TSynPasSyn.SquareOpenProc;
|
||||||
@ -3960,6 +3964,7 @@ end;
|
|||||||
procedure TSynPasSyn.Next;
|
procedure TSynPasSyn.Next;
|
||||||
var
|
var
|
||||||
IsAtCaseLabel: Boolean;
|
IsAtCaseLabel: Boolean;
|
||||||
|
OldNestLevel: Integer;
|
||||||
begin
|
begin
|
||||||
fAsmStart := False;
|
fAsmStart := False;
|
||||||
FIsPasDocKey := False;
|
FIsPasDocKey := False;
|
||||||
@ -3989,6 +3994,7 @@ begin
|
|||||||
SlashContinueProc
|
SlashContinueProc
|
||||||
else begin
|
else begin
|
||||||
FOldRange := fRange;
|
FOldRange := fRange;
|
||||||
|
OldNestLevel := PasCodeFoldRange.BracketNestLevel;
|
||||||
if (PasCodeFoldRange.BracketNestLevel = 1) then // procedure foo; [attr...]
|
if (PasCodeFoldRange.BracketNestLevel = 1) then // procedure foo; [attr...]
|
||||||
FOldRange := FOldRange - [rsWasInProcHeader];
|
FOldRange := FOldRange - [rsWasInProcHeader];
|
||||||
FTokenFlags := [];
|
FTokenFlags := [];
|
||||||
@ -4014,17 +4020,24 @@ begin
|
|||||||
|
|
||||||
if not (FTokenID in [tkSpace, tkComment, tkIDEDirective, tkDirective]) then begin
|
if not (FTokenID in [tkSpace, tkComment, tkIDEDirective, tkDirective]) then begin
|
||||||
if (PasCodeFoldRange.BracketNestLevel = 0) and
|
if (PasCodeFoldRange.BracketNestLevel = 0) and
|
||||||
not(rsAtClosingBracket in fRange)
|
(OldNestLevel = 0)
|
||||||
then
|
then
|
||||||
fRange := fRange - [rsAfterClass];
|
fRange := fRange - [rsAfterClass];
|
||||||
|
if (PasCodeFoldRange.BracketNestLevel > 0) or
|
||||||
|
(OldNestLevel > 0)
|
||||||
|
then
|
||||||
|
FOldRange := FOldRange - [rsInTypeHelper];
|
||||||
|
|
||||||
fRange := fRange -
|
fRange := fRange -
|
||||||
(FOldRange * [rsAfterEqualOrColon, rsAfterSemiColon,
|
(FOldRange * [rsAfterEqualOrColon, rsAfterSemiColon,
|
||||||
rsAtPropertyOrReadWrite, rsAfterClassField,
|
rsAtPropertyOrReadWrite, rsAfterClassField,
|
||||||
rsAfterIdentifierOrValue, rsAfterEqualThenType,
|
rsAfterIdentifierOrValue, rsAfterEqualThenType,
|
||||||
rsWasInProcHeader, rsAtProcName, rsAfterProcName]
|
rsWasInProcHeader, rsAtProcName, rsAfterProcName,
|
||||||
) -
|
rsInTypeHelper]
|
||||||
[rsAtClosingBracket];
|
);
|
||||||
|
|
||||||
|
if (FTokenID = tkIdentifier) and (rsInTypeHelper in FOldRange) then
|
||||||
|
fRange := fRange + [rsAfterSemiColon];
|
||||||
|
|
||||||
if rsAtClass in fRange then begin
|
if rsAtClass in fRange then begin
|
||||||
if FOldRange * [rsAtClass, rsAfterClass] <> [] then
|
if FOldRange * [rsAtClass, rsAfterClass] <> [] then
|
||||||
@ -4034,7 +4047,6 @@ begin
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
fRange := fRange - [rsAtClosingBracket];
|
|
||||||
if rsAtClass in fRange then
|
if rsAtClass in fRange then
|
||||||
fRange := fRange + [rsAfterClass];
|
fRange := fRange + [rsAfterClass];
|
||||||
end;
|
end;
|
||||||
|
@ -1715,9 +1715,12 @@ begin
|
|||||||
([ 'Unit A; interface',
|
([ 'Unit A; interface',
|
||||||
'type',
|
'type',
|
||||||
'TFoo = class helper for TBar',
|
'TFoo = class helper for TBar',
|
||||||
'helper, sealed, abstract: Integer;',
|
'helper, sealed, abstract, public: Integer;',
|
||||||
'procedure Foo; abstract;',
|
'procedure Foo; abstract;',
|
||||||
'end;',
|
'end;',
|
||||||
|
'TFoo = class helper for TBar',
|
||||||
|
'protected',
|
||||||
|
'end;',
|
||||||
''
|
''
|
||||||
]);
|
]);
|
||||||
CheckTokensForLine('class declaration"', 2,
|
CheckTokensForLine('class declaration"', 2,
|
||||||
@ -1726,11 +1729,21 @@ begin
|
|||||||
tkSpace, tkIdentifier
|
tkSpace, tkIdentifier
|
||||||
]);
|
]);
|
||||||
CheckTokensForLine('var in class "', 3,
|
CheckTokensForLine('var in class "', 3,
|
||||||
[ tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol,
|
[ tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol, tkSpace,
|
||||||
|
tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol,
|
||||||
tkSpace, tkIdentifier, tkSymbol
|
tkSpace, tkIdentifier, tkSymbol
|
||||||
]);
|
]);
|
||||||
CheckTokensForLine('procedure in class "', 4,
|
CheckTokensForLine('procedure in class "', 4,
|
||||||
[ tkKey, tkSpace, tkIdentifier + FAttrProcName, tkSymbol, tkSpace, tkKey, tkSymbol ]);
|
[ tkKey, tkSpace, tkIdentifier + FAttrProcName, tkSymbol, tkSpace, tkKey, tkSymbol ]);
|
||||||
|
CheckTokensForLine('end', 5,
|
||||||
|
[ tkKey, tkSymbol ]);
|
||||||
|
CheckTokensForLine('class declaration"', 6,
|
||||||
|
[ tkIdentifier, tkSpace, tkSymbol, tkSpace,
|
||||||
|
tkKey {class}, tkSpace, tkKey {helper}, tkSpace, tkKey {for},
|
||||||
|
tkSpace, tkIdentifier
|
||||||
|
]);
|
||||||
|
CheckTokensForLine('class section', 7,
|
||||||
|
[ tkKey ]);
|
||||||
|
|
||||||
|
|
||||||
ReCreateEdit;
|
ReCreateEdit;
|
||||||
@ -1742,6 +1755,8 @@ begin
|
|||||||
'helper, sealed, abstract: Integer;',
|
'helper, sealed, abstract: Integer;',
|
||||||
'procedure Foo; abstract;',
|
'procedure Foo; abstract;',
|
||||||
'end;',
|
'end;',
|
||||||
|
'TFoo = class helper(helper) for helper',
|
||||||
|
'protected',
|
||||||
''
|
''
|
||||||
]);
|
]);
|
||||||
CheckTokensForLine('class declaration"', 2,
|
CheckTokensForLine('class declaration"', 2,
|
||||||
@ -1756,6 +1771,8 @@ begin
|
|||||||
]);
|
]);
|
||||||
CheckTokensForLine('procedure in class "', 4,
|
CheckTokensForLine('procedure in class "', 4,
|
||||||
[ tkKey, tkSpace, tkIdentifier + FAttrProcName, tkSymbol, tkSpace, tkKey, tkSymbol ]);
|
[ tkKey, tkSpace, tkIdentifier + FAttrProcName, tkSymbol, tkSpace, tkKey, tkSymbol ]);
|
||||||
|
CheckTokensForLine('class section', 7,
|
||||||
|
[ tkKey ]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1785,6 +1802,11 @@ procedure TTestHighlighterPas.TestContextForTypeHelper;
|
|||||||
tkKey {type}, tkSpace, tkIdentifier {helper}, tkSpace, tkKey {for}, tkSpace, tkIdentifier, tkSymbol
|
tkKey {type}, tkSpace, tkIdentifier {helper}, tkSpace, tkKey {for}, tkSpace, tkIdentifier, tkSymbol
|
||||||
]);
|
]);
|
||||||
AssertEquals('not a helper, switched off / no fold', 0, PasHighLighter.FoldOpenCount(11));
|
AssertEquals('not a helper, switched off / no fold', 0, PasHighLighter.FoldOpenCount(11));
|
||||||
|
|
||||||
|
CheckTokensForLine('class section', 14,
|
||||||
|
[ tkKey ]);
|
||||||
|
CheckTokensForLine('NOT class section', 18,
|
||||||
|
[ tkIdentifier ]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -1813,6 +1835,13 @@ begin
|
|||||||
'{$modeswitch typehelpers-}',
|
'{$modeswitch typehelpers-}',
|
||||||
'helper = type helper for helper;',
|
'helper = type helper for helper;',
|
||||||
'{$modeswitch typehelpers}',
|
'{$modeswitch typehelpers}',
|
||||||
|
'helper = type helper for helper',
|
||||||
|
'protected',
|
||||||
|
'end;',
|
||||||
|
'{$modeswitch typehelpers-}',
|
||||||
|
'helper = type helper for helper',
|
||||||
|
'protected',
|
||||||
|
'{$modeswitch typehelpers}',
|
||||||
''
|
''
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -1884,6 +1913,9 @@ begin
|
|||||||
'TFoo = record helper for TBar',
|
'TFoo = record helper for TBar',
|
||||||
'helper, sealed, abstract: Integer;',
|
'helper, sealed, abstract: Integer;',
|
||||||
'end;',
|
'end;',
|
||||||
|
'TFoo = record helper for TBar',
|
||||||
|
'protected;',
|
||||||
|
'end;',
|
||||||
''
|
''
|
||||||
]);
|
]);
|
||||||
CheckTokensForLine('record declaration"', 2,
|
CheckTokensForLine('record declaration"', 2,
|
||||||
@ -1895,6 +1927,8 @@ begin
|
|||||||
[ tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol,
|
[ tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol, tkSpace, tkIdentifier, tkSymbol,
|
||||||
tkSpace, tkIdentifier, tkSymbol
|
tkSpace, tkIdentifier, tkSymbol
|
||||||
]);
|
]);
|
||||||
|
CheckTokensForLine('class section', 6,
|
||||||
|
[ tkKey ]);
|
||||||
|
|
||||||
|
|
||||||
ReCreateEdit;
|
ReCreateEdit;
|
||||||
|
Loading…
Reference in New Issue
Block a user