mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 05:19:28 +02:00
SynEdit: fix PasHighLighter for "default" modifier after property. (fix false matches). Issue #39726
This commit is contained in:
parent
abad276cd4
commit
db98b76076
@ -1350,8 +1350,12 @@ begin
|
|||||||
begin
|
begin
|
||||||
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and
|
if (fRange * [rsProperty, rsAtPropertyOrReadWrite, rsAfterEqualOrColon] = [rsProperty]) and
|
||||||
(PasCodeFoldRange.BracketNestLevel = 0)
|
(PasCodeFoldRange.BracketNestLevel = 0)
|
||||||
then
|
then begin
|
||||||
Result := tkKey else Result := tkIdentifier;
|
Result := tkKey;
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := tkIdentifier;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if KeyComp('Out') then Result := tkKey else Result := tkIdentifier;
|
if KeyComp('Out') then Result := tkKey else Result := tkIdentifier;
|
||||||
@ -1496,8 +1500,18 @@ end;
|
|||||||
function TSynPasSyn.Func69: TtkTokenKind;
|
function TSynPasSyn.Func69: TtkTokenKind;
|
||||||
begin
|
begin
|
||||||
if KeyComp('Default') then begin
|
if KeyComp('Default') then begin
|
||||||
if (TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord]) then
|
if (PasCodeFoldRange.BracketNestLevel = 0) and
|
||||||
Result := tkKey
|
(fRange * [rsAtPropertyOrReadWrite, rsAfterEqualOrColon, rsInProcHeader] = []) and
|
||||||
|
( ( (TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection, cfbtRecord]) and
|
||||||
|
(rsAfterClassMembers in fRange)
|
||||||
|
) or
|
||||||
|
(rsProperty in fRange)
|
||||||
|
)
|
||||||
|
then begin
|
||||||
|
Result := tkKey;
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
|
end
|
||||||
else
|
else
|
||||||
Result := tkIdentifier;
|
Result := tkIdentifier;
|
||||||
end else
|
end else
|
||||||
@ -2869,7 +2883,9 @@ begin
|
|||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
inc(Run);
|
inc(Run);
|
||||||
if fLine[Run] = '=' then
|
if fLine[Run] = '=' then
|
||||||
inc(Run)
|
inc(Run);
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.CRProc;
|
procedure TSynPasSyn.CRProc;
|
||||||
@ -2936,6 +2952,8 @@ begin
|
|||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
inc(Run);
|
inc(Run);
|
||||||
if fLine[Run] in ['=', '>'] then inc(Run);
|
if fLine[Run] in ['=', '>'] then inc(Run);
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.CaretProc;
|
procedure TSynPasSyn.CaretProc;
|
||||||
@ -3001,7 +3019,11 @@ procedure TSynPasSyn.PointProc;
|
|||||||
begin
|
begin
|
||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
inc(Run);
|
inc(Run);
|
||||||
if fLine[Run] in ['.', ')'] then inc(Run);
|
if fLine[Run] in ['.', ')'] then
|
||||||
|
inc(Run)
|
||||||
|
else
|
||||||
|
if fRange * [rsProperty, rsAfterClassMembers] <> [] then // Also happens for result-type of functions (if they have a dot)
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.AnsiProc;
|
procedure TSynPasSyn.AnsiProc;
|
||||||
@ -3106,6 +3128,8 @@ begin
|
|||||||
not(rsAfterClassMembers in fRange)
|
not(rsAfterClassMembers in fRange)
|
||||||
then
|
then
|
||||||
fRange := fRange + [rsVarTypeInSpecification];
|
fRange := fRange + [rsVarTypeInSpecification];
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPasSyn.SemicolonProc;
|
procedure TSynPasSyn.SemicolonProc;
|
||||||
@ -3163,6 +3187,8 @@ begin
|
|||||||
end else begin
|
end else begin
|
||||||
Inc(Run);
|
Inc(Run);
|
||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3218,6 +3244,8 @@ procedure TSynPasSyn.SymbolProc;
|
|||||||
begin
|
begin
|
||||||
inc(Run);
|
inc(Run);
|
||||||
fTokenID := tkSymbol;
|
fTokenID := tkSymbol;
|
||||||
|
if rsProperty in fRange then
|
||||||
|
fRange := fRange + [rsAtPropertyOrReadWrite];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynPasSyn.TypeHelpersIsStored: Boolean;
|
function TSynPasSyn.TypeHelpersIsStored: Boolean;
|
||||||
|
@ -213,9 +213,9 @@ begin
|
|||||||
e := ExpTokens[c];
|
e := ExpTokens[c];
|
||||||
//DebugLn([FTheHighLighter.GetToken,' (',FTheHighLighter.GetTokenKind ,') at ', FTheHighLighter.GetTokenPos]);
|
//DebugLn([FTheHighLighter.GetToken,' (',FTheHighLighter.GetTokenKind ,') at ', FTheHighLighter.GetTokenPos]);
|
||||||
if etiKind in e.Flags then
|
if etiKind in e.Flags then
|
||||||
AssertEquals(Name + ' Kind @ TokenId Line='+IntToStr(LineIdx)+' pos='+IntToStr(c), e.ExpKind, FTheHighLighter.GetTokenKind);
|
AssertEquals(Name + ' Kind @ TokenId Line='+IntToStr(LineIdx)+' pos='+IntToStr(c)+'Src='+FTheHighLighter.GetToken+' @'+IntToStr(FTheHighLighter.GetTokenPos), e.ExpKind, FTheHighLighter.GetTokenKind);
|
||||||
if etiAttr in e.Flags then
|
if etiAttr in e.Flags then
|
||||||
AssertEquals(Name + ' Attr @ TokenId Line='+IntToStr(LineIdx)+' pos='+IntToStr(c), AttrVal(e.ExpAttr), AttrVal(FTheHighLighter.GetTokenAttribute));
|
AssertEquals(Name + ' Attr @ TokenId Line='+IntToStr(LineIdx)+' pos='+IntToStr(c)+'Src='+FTheHighLighter.GetToken+' @'+IntToStr(FTheHighLighter.GetTokenPos), AttrVal(e.ExpAttr), AttrVal(FTheHighLighter.GetTokenAttribute));
|
||||||
|
|
||||||
FTheHighLighter.Next;
|
FTheHighLighter.Next;
|
||||||
inc(c);
|
inc(c);
|
||||||
|
@ -68,6 +68,14 @@ type
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
const
|
||||||
|
TK_Comma = tkSymbol;
|
||||||
|
TK_Semi = tkSymbol;
|
||||||
|
TK_Dot = tkSymbol;
|
||||||
|
TK_Colon = tkSymbol;
|
||||||
|
TK_Equal = tkSymbol;
|
||||||
|
TK_Bracket = tkSymbol;
|
||||||
|
|
||||||
operator := (a: TtkTokenKind) : TExpTokenInfo;
|
operator := (a: TtkTokenKind) : TExpTokenInfo;
|
||||||
begin
|
begin
|
||||||
result := default(TExpTokenInfo);
|
result := default(TExpTokenInfo);
|
||||||
@ -660,6 +668,88 @@ begin
|
|||||||
tkSymbol
|
tkSymbol
|
||||||
]);
|
]);
|
||||||
{%endregion}
|
{%endregion}
|
||||||
|
|
||||||
|
{%region property and default}
|
||||||
|
ReCreateEdit;
|
||||||
|
SetLines
|
||||||
|
([ 'Unit A; interface',
|
||||||
|
'type TFoo = class',
|
||||||
|
'default,default:default;',
|
||||||
|
'private type',
|
||||||
|
'default=integer;',
|
||||||
|
'private',
|
||||||
|
'a: default;',
|
||||||
|
'default:default.default;',
|
||||||
|
{8} 'function default(default:default):default;',
|
||||||
|
{9} 'function default(default:default.default):default.default;',
|
||||||
|
{10} 'property default[default:default]:default read default write default; default;',
|
||||||
|
{11} 'property default:default read default default default;',
|
||||||
|
{12} 'property default:default index default read default default default-default+default;',
|
||||||
|
// property could read a field inside an embedded record
|
||||||
|
{13} 'property default:default.default index {C} default.default read {C} default.default {C} default default.default * default.default;',
|
||||||
|
''
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('FIELD: default,default:default;', 2,
|
||||||
|
[ tkIdentifier, TK_Comma, tkIdentifier, // default , default
|
||||||
|
TK_Colon, tkIdentifier, TK_Semi // : default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('TYPE: default=integer;', 4,
|
||||||
|
[ tkIdentifier, TK_Equal, tkIdentifier, TK_Semi // default = integer ;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('FIELD: default:default.default;', 7,
|
||||||
|
[ tkIdentifier, TK_Colon, tkIdentifier, TK_Dot, tkIdentifier, TK_Semi // default : default . default ;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('function default(default:default):default;', 8,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, // function default
|
||||||
|
TK_Bracket, tkIdentifier, TK_Colon, tkIdentifier, TK_Bracket, // ( default : default )
|
||||||
|
TK_Colon, tkIdentifier, TK_Semi // : default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('function default(default:default.default):default.default;', 9,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, // function default
|
||||||
|
TK_Bracket, tkIdentifier, TK_Colon, // ( default :
|
||||||
|
tkIdentifier, TK_Dot, tkIdentifier, TK_Bracket, // default . default )
|
||||||
|
TK_Colon, tkIdentifier, TK_Dot, tkIdentifier, TK_Semi // : default . default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('property default[default:default]:default read default write default; default;', 10,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, TK_Bracket, tkIdentifier, // property default[default
|
||||||
|
TK_Colon, tkIdentifier, TK_Bracket, TK_Colon, tkIdentifier, // :default]:default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // read default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // write default
|
||||||
|
TK_Semi, tkSpace, tkKey, TK_Semi // ; default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('property default:default read default default default;', 11,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, TK_Colon, tkIdentifier, //property default:default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // read default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, TK_Semi // default default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('property default:default index default read default default default-default+default;', 12,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, TK_Colon, tkIdentifier, // property default:default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // index default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // read default
|
||||||
|
tkSpace, tkKey, tkSpace, tkIdentifier, // default default
|
||||||
|
tkSymbol, tkIdentifier, tkSymbol, tkIdentifier, TK_Semi // -default+default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
CheckTokensForLine('property default:default.default index {C} default.default read {C} default.default {C} default default.default * default.default;', 13,
|
||||||
|
[ tkKey, tkSpace, tkIdentifier, TK_Colon, tkIdentifier, TK_Dot, tkIdentifier, // property default:default.default
|
||||||
|
tkSpace, tkKey, tkSpace, tkComment, tkSpace, // index (C}
|
||||||
|
tkIdentifier, TK_Dot, tkIdentifier, tkSpace, // default.default
|
||||||
|
tkKey, tkSpace, tkComment, tkSpace, // read (C}
|
||||||
|
tkIdentifier, TK_Dot, tkIdentifier, tkSpace, // default.default
|
||||||
|
tkComment, tkSpace, // (C}
|
||||||
|
tkKey, tkSpace, tkIdentifier, TK_Dot, tkIdentifier, tkSpace, // default default.default
|
||||||
|
tkSymbol, tkSpace, tkIdentifier, TK_Dot, tkIdentifier, TK_Semi // * default.default;
|
||||||
|
]);
|
||||||
|
|
||||||
|
{%endregion}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestHighlighterPas.TestContextForProcedure;
|
procedure TTestHighlighterPas.TestContextForProcedure;
|
||||||
|
Loading…
Reference in New Issue
Block a user