SynEdit: PasHighLighter, fixes for "type helper", issue #0034654

git-svn-id: trunk@60556 -
This commit is contained in:
martin 2019-03-02 14:16:45 +00:00
parent 9972af41b2
commit dd2d67f4d4

View File

@ -97,6 +97,7 @@ type
rsVarTypeInSpecification, // between ":"/"=" and ";" in a var or type section (or class members) rsVarTypeInSpecification, // between ":"/"=" and ";" in a var or type section (or class members)
// var a: Integer; type b = Int64; // var a: Integer; type b = Int64;
rsInTypeBlock, rsInTypeBlock,
rsAfterEqualThenType, // TFoo = type ...
rsSkipAllPasBlocks // used for: class of ... ; rsSkipAllPasBlocks // used for: class of ... ;
); );
TRangeStates = set of TRangeState; TRangeStates = set of TRangeState;
@ -288,6 +289,7 @@ type
FBracketNestLevel : Integer; FBracketNestLevel : Integer;
FLastLineCodeFoldLevelFix: integer; FLastLineCodeFoldLevelFix: integer;
FPasFoldFixLevel: Smallint; FPasFoldFixLevel: Smallint;
FTypeHelpers: Boolean;
public public
procedure Clear; override; procedure Clear; override;
function Compare(Range: TSynCustomHighlighterRange): integer; override; function Compare(Range: TSynCustomHighlighterRange): integer; override;
@ -299,6 +301,7 @@ type
procedure DecLastLinePasFoldFix; procedure DecLastLinePasFoldFix;
property Mode: TPascalCompilerMode read FMode write FMode; property Mode: TPascalCompilerMode read FMode write FMode;
property NestedComments: Boolean read FNestedComments write FNestedComments; property NestedComments: Boolean read FNestedComments write FNestedComments;
property TypeHelpers: Boolean read FTypeHelpers write FTypeHelpers;
property BracketNestLevel: integer read FBracketNestLevel write FBracketNestLevel; property BracketNestLevel: integer read FBracketNestLevel write FBracketNestLevel;
property LastLineCodeFoldLevelFix: integer property LastLineCodeFoldLevelFix: integer
read FLastLineCodeFoldLevelFix write FLastLineCodeFoldLevelFix; read FLastLineCodeFoldLevelFix write FLastLineCodeFoldLevelFix;
@ -331,6 +334,7 @@ type
fLineLen: integer; fLineLen: integer;
fLineNumber: Integer; fLineNumber: Integer;
fProcTable: array[#0..#255] of TProcTableProc; fProcTable: array[#0..#255] of TProcTableProc;
FTypeHelpers: boolean;
Run: LongInt;// current parser postion in fLine Run: LongInt;// current parser postion in fLine
fStringLen: Integer;// current length of hash fStringLen: Integer;// current length of hash
fToIdent: integer;// start of current identifier in fLine fToIdent: integer;// start of current identifier in fLine
@ -616,6 +620,7 @@ type
write fDirectiveAttri; write fDirectiveAttri;
property CompilerMode: TPascalCompilerMode read FCompilerMode write SetCompilerMode; property CompilerMode: TPascalCompilerMode read FCompilerMode write SetCompilerMode;
property NestedComments: boolean read FNestedComments write SetNestedComments; property NestedComments: boolean read FNestedComments write SetNestedComments;
property TypeHelpers: boolean read FTypeHelpers write FTypeHelpers;
property D4syntax: boolean read FD4syntax write SetD4syntax default true; property D4syntax: boolean read FD4syntax write SetD4syntax default true;
property ExtendedKeywordsMode: Boolean property ExtendedKeywordsMode: Boolean
read FExtendedKeywordsMode write SetExtendedKeywordsMode default False; read FExtendedKeywordsMode write SetExtendedKeywordsMode default False;
@ -897,6 +902,7 @@ end;
procedure TSynPasSyn.SetCompilerMode(const AValue: TPascalCompilerMode); procedure TSynPasSyn.SetCompilerMode(const AValue: TPascalCompilerMode);
begin begin
NestedComments:=AValue in [pcmFPC,pcmObjFPC]; // NestedComments has to be reset even if CompilerMode doesn't change NestedComments:=AValue in [pcmFPC,pcmObjFPC]; // NestedComments has to be reset even if CompilerMode doesn't change
TypeHelpers := AValue in [pcmDelphi];
if FCompilerMode=AValue then exit; if FCompilerMode=AValue then exit;
FCompilerMode:=AValue; FCompilerMode:=AValue;
PasCodeFoldRange.Mode:=FCompilerMode; PasCodeFoldRange.Mode:=FCompilerMode;
@ -1427,10 +1433,16 @@ begin
end; end;
Result := tkKey; Result := tkKey;
end end
// 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
Result := tkKey Result := tkKey
else
if (rsAfterEqualThenType in fRange) and TypeHelpers then begin
Result := tkKey;
StartPascalCodeFoldBlock(cfbtClass); // type helper
end
else else
Result := tkIdentifier; Result := tkIdentifier;
end end
@ -1452,8 +1464,13 @@ begin
if (PasCodeFoldRange.BracketNestLevel = 0) if (PasCodeFoldRange.BracketNestLevel = 0)
and (TopPascalCodeFoldBlockType in and (TopPascalCodeFoldBlockType in
[cfbtVarType, cfbtLocalVarType, cfbtNone, cfbtProcedure, cfbtProgram, [cfbtVarType, cfbtLocalVarType, cfbtNone, cfbtProcedure, cfbtProgram,
cfbtUnit, cfbtUnitSection]) and not(rsAfterEqualOrColon in fRange) cfbtUnit, cfbtUnitSection])
then begin then begin
if (rsAfterEqualOrColon in fRange) then begin
if TypeHelpers then
fRange := fRange + [rsAfterEqualThenType];
end
else begin
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndPascalCodeFoldBlockLastLine; EndPascalCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtProcedure] if TopPascalCodeFoldBlockType in [cfbtProcedure]
@ -1461,6 +1478,7 @@ begin
else StartPascalCodeFoldBlock(cfbtVarType); else StartPascalCodeFoldBlock(cfbtVarType);
fRange := fRange + [rsInTypeBlock]; fRange := fRange + [rsInTypeBlock];
end; end;
end;
Result := tkKey; Result := tkKey;
end end
else Result := tkIdentifier; else Result := tkIdentifier;
@ -2590,6 +2608,17 @@ begin
if fLine[Run] = '-' then if fLine[Run] = '-' then
NestedComments:=False; NestedComments:=False;
end; end;
if TextComp('typehelpers') then
begin
inc(Run,11);
// skip space
while (fLine[Run] in [' ',#9,#10,#13]) do inc(Run);
if fLine[Run] in ['+', '}'] then
TypeHelpers := True
else
if fLine[Run] = '-' then
TypeHelpers := False;
end;
end; end;
if TextComp('mode') then begin if TextComp('mode') then begin
// $mode directive // $mode directive
@ -3199,7 +3228,7 @@ begin
fRange := fRange - [rsAfterClass]; fRange := fRange - [rsAfterClass];
fRange := fRange - fRange := fRange -
(FOldRange * [rsAfterEqualOrColon, rsAtPropertyOrReadWrite, rsAfterClassField, rsAfterIdentifierOrValue]) - (FOldRange * [rsAfterEqualOrColon, rsAtPropertyOrReadWrite, rsAfterClassField, rsAfterIdentifierOrValue, rsAfterEqualThenType]) -
[rsAtClosingBracket]; [rsAtClosingBracket];
if rsAtClass in fRange then begin if rsAtClass in fRange then begin
@ -3331,6 +3360,7 @@ begin
// For speed reasons, we work with fRange instead of CodeFoldRange.RangeType // For speed reasons, we work with fRange instead of CodeFoldRange.RangeType
// -> update now // -> update now
CodeFoldRange.RangeType:=Pointer(PtrUInt(Integer(fRange))); CodeFoldRange.RangeType:=Pointer(PtrUInt(Integer(fRange)));
PasCodeFoldRange.TypeHelpers := TypeHelpers;
// return a fixed copy of the current CodeFoldRange instance // return a fixed copy of the current CodeFoldRange instance
Result := inherited GetRange; Result := inherited GetRange;
end; end;
@ -3341,6 +3371,7 @@ begin
inherited SetRange(Value); inherited SetRange(Value);
CompilerMode := PasCodeFoldRange.Mode; CompilerMode := PasCodeFoldRange.Mode;
NestedComments := PasCodeFoldRange.NestedComments; NestedComments := PasCodeFoldRange.NestedComments;
TypeHelpers := PasCodeFoldRange.TypeHelpers;
fRange := TRangeStates(Integer(PtrUInt(CodeFoldRange.RangeType))); fRange := TRangeStates(Integer(PtrUInt(CodeFoldRange.RangeType)));
FSynPasRangeInfo := TSynHighlighterPasRangeList(CurrentRanges).PasRangeInfo[LineIndex-1]; FSynPasRangeInfo := TSynHighlighterPasRangeList(CurrentRanges).PasRangeInfo[LineIndex-1];
end; end;
@ -4513,6 +4544,8 @@ begin
if Result<>0 then exit; if Result<>0 then exit;
Result:=ord(FNestedComments)-ord(TSynPasSynRange(Range).FNestedComments); Result:=ord(FNestedComments)-ord(TSynPasSynRange(Range).FNestedComments);
if Result<>0 then exit; if Result<>0 then exit;
Result:=ord(FTypeHelpers)-ord(TSynPasSynRange(Range).FTypeHelpers);
if Result<>0 then exit;
Result := FBracketNestLevel - TSynPasSynRange(Range).FBracketNestLevel; Result := FBracketNestLevel - TSynPasSynRange(Range).FBracketNestLevel;
if Result<>0 then exit; if Result<>0 then exit;
Result := FLastLineCodeFoldLevelFix - TSynPasSynRange(Range).FLastLineCodeFoldLevelFix; Result := FLastLineCodeFoldLevelFix - TSynPasSynRange(Range).FLastLineCodeFoldLevelFix;
@ -4526,6 +4559,7 @@ begin
inherited Assign(Src); inherited Assign(Src);
FMode:=TSynPasSynRange(Src).FMode; FMode:=TSynPasSynRange(Src).FMode;
FNestedComments:=TSynPasSynRange(Src).FNestedComments; FNestedComments:=TSynPasSynRange(Src).FNestedComments;
FTypeHelpers := TSynPasSynRange(Src).FTypeHelpers;
FBracketNestLevel:=TSynPasSynRange(Src).FBracketNestLevel; FBracketNestLevel:=TSynPasSynRange(Src).FBracketNestLevel;
FLastLineCodeFoldLevelFix := TSynPasSynRange(Src).FLastLineCodeFoldLevelFix; FLastLineCodeFoldLevelFix := TSynPasSynRange(Src).FLastLineCodeFoldLevelFix;
FPasFoldFixLevel := TSynPasSynRange(Src).FPasFoldFixLevel; FPasFoldFixLevel := TSynPasSynRange(Src).FPasFoldFixLevel;