synedit: pascal highlighter: implemented mode Delphi/ObjFPC and nested comments

git-svn-id: trunk@15874 -
This commit is contained in:
mattias 2008-07-26 15:11:57 +00:00
parent 2a59caae77
commit cbc57806d7
7 changed files with 119 additions and 18 deletions

View File

@ -651,7 +651,8 @@ begin
FMainSourceFilename:='';
BuildDirectiveFuncList;
FIncludeStack:=TFPList.Create;
FNestedComments:=false;
FPascalCompiler:=pcFPC;
FNestedComments:=true;
end;
procedure TLinkScanner.DecCommentLevel;
@ -1118,11 +1119,11 @@ begin
// nested comments
FNestedComments:=false;
if (PascalCompiler=pcFPC) and (CompilerMode in [cmFPC,cmOBJFPC])
and ((FInitValues.IsDefined(NestedCompilerDefine))
or (CompareFileExt(MainFilename,'pp',false)=0))
if ((PascalCompiler=pcFPC) and (CompilerMode in [cmFPC,cmOBJFPC]))
or FInitValues.IsDefined(NestedCompilerDefine)
then
FNestedComments:=true;
//DebugLn(['TLinkScanner.Scan ',MainFilename,' ',PascalCompilerNames[PascalCompiler],' ',CompilerModeNames[CompilerMode],' ',FInitValues.IsDefined(NestedCompilerDefine),' FNestedComments=',FNestedComments]);
//DebugLn(Values.AsString);
//DebugLn('TLinkScanner.Scan E --------');
@ -2122,7 +2123,6 @@ begin
// undefine all mode macros
for AMode:=Low(TCompilerMode) to High(TCompilerMode) do
Values.Undefine(CompilerModeVars[AMode]);
CompilerMode:=cmFPC;
// define new mode macro
if CompareUpToken('DEFAULT',Src,ValStart,SrcPos) then begin
// set mode to initial mode
@ -2916,6 +2916,7 @@ begin
FCompilerMode:=AValue;
FNestedComments:=(PascalCompiler=pcFPC)
and (FCompilerMode in [cmFPC,cmOBJFPC]);
//DebugLn(['TLinkScanner.SetCompilerMode ',MainFilename,' ',PascalCompilerNames[PascalCompiler],' Mode=',CompilerModeNames[CompilerMode],' FNestedComments=',FNestedComments]);
end;
function TLinkScanner.SkipIfDirective: boolean;

View File

@ -525,6 +525,7 @@ begin
ReadNextAtom;
CurNode.EndPos:=CurPos.StartPos;
EndChildNode;
//DebugLn(['TPascalParserTool.BuildTree ',MainFilename,' ',Scanner.NestedComments]);
if not UpAtomIs('INTERFACE') then
RaiseStringExpectedButAtomFound('"interface"');
CreateChildNode;

View File

@ -4893,7 +4893,7 @@ begin
DebugLn('TCustomSynEdit.SetFont--------------------------------------------');
DebugLn(' TCustomSynEdit.SetFont A1',Value.Name);
DC := GetDC(0);
Save := SelectObject(DC, Value.Handle);
Save := SelectObject(DC, Value.Reference.Handle);
DebugLn(' TCustomSynEdit.SetFont A2',Value.Name);
GetTextMetrics(DC, Metrics);
SelectObject(DC, Save);
@ -6049,10 +6049,12 @@ begin
InvalidateLine(LastIndex);
*)
procedure TCustomSynEdit.ListAdded(Index: integer);
// Index is 0 based
begin
//debugln('TCustomSynEdit.ListAdded ',dbgs(Index),' ',dbgs(Assigned(fHighlighter)));
if Assigned(fHighlighter) then begin
if (Index > 0) then begin
// the current line was added, start scanning from the prior line
fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]);
ScanFrom(Index - 1);
end else begin
@ -6083,9 +6085,11 @@ begin
end;
procedure TCustomSynEdit.ListDeleted(Index: Integer);
// Index is 0 based
begin
if Assigned(fHighlighter) and (Lines.Count >= 1) then
if (Index > 0) then begin
// start scanning from prior line
{begin} //mh 2000-10-10
// fHighlighter.SetRange(Lines.Objects[Index - 1]);
//DebugLn(['TCustomSynEdit.ListDeleted A Index=',Index]);
@ -6105,9 +6109,11 @@ begin
end;
procedure TCustomSynEdit.ListInserted(Index: Integer);
// Index is 0 based
begin
if Assigned(fHighlighter) and (Lines.Count >= 1) then
if (Index > 0) then begin
// start scanning from prior line
{begin} //mh 2000-10-10
// fHighlighter.SetRange(Lines.Objects[Index - 1]);
// the line and the range of the line
@ -6128,6 +6134,7 @@ begin
end;
procedure TCustomSynEdit.ListPutted(Index: Integer);
// Index is 0 based
{$IFDEF SYN_LAZARUS}
var
EndIndex: Integer;
@ -10677,7 +10684,7 @@ begin
if Assigned(Highlighter) and (PosY >= 0) and (PosY < Lines.Count) then
begin
Line := Lines[PosY];
Highlighter.SetRange(TSynEditStringList(Lines).Ranges[PosY ]);
Highlighter.SetRange(TSynEditStringList(Lines).Ranges[PosY]);
Highlighter.SetLine(Line, PosY);
PosX := XY.X;
if (PosX > 0) and (PosX <= Length(Line)) then

View File

@ -1337,6 +1337,8 @@ end;
constructor TSynCustomHighlighterRange.Create(
Template: TSynCustomHighlighterRange);
begin
if (Template<>nil) and (ClassType<>Template.ClassType) then
RaiseGDBException('');
FBlockClass:=TSynCustomCodeFoldBlock;
if Template<>nil then
Assign(Template);
@ -1480,11 +1482,13 @@ function TSynCustomHighlighterRanges.GetEqual(Range: TSynCustomHighlighterRange
var
Node: TAvgLvlTreeNode;
begin
if Range=nil then exit(nil);
Node:=FItems.Find(Range);
if Node<>nil then begin
Result:=TSynCustomHighlighterRange(Node.Data);
end else begin
Result:=TSynCustomHighlighterRange.Create(Range);
// add a copy
Result:=TSynCustomHighlighterRangeClass(Range.ClassType).Create(Range);
FItems.Add(Result);
end;
//debugln('TSynCustomHighlighterRanges.GetEqual A ',dbgs(Node),' ',dbgs(Result.Compare(Range)),' ',dbgs(Result.CodeFoldStackSize));

View File

@ -1097,8 +1097,10 @@ var
StartPos: Integer;
p: Integer;
Len: Integer;
sl: TStringList;
begin
BeginUpdate;
sl:=TStringList.Create;
try
Clear;
p:=1;
@ -1108,7 +1110,7 @@ begin
if not (Value[p] in [#10,#13]) then begin
inc(p);
end else begin
Add(copy(Value,StartPos,p-StartPos));
sl.Add(copy(Value,StartPos,p-StartPos));
inc(p);
if (p<=Len) and (Value[p] in [#10,#13]) and (Value[p-1]<>Value[p]) then
inc(p);
@ -1116,8 +1118,10 @@ begin
end;
end;
if StartPos<=Len then
Add(copy(Value,StartPos,Len-StartPos+1));
sl.Add(copy(Value,StartPos,Len-StartPos+1));
AddStrings(sl);
finally
sl.Free;
EndUpdate;
end;
end;

View File

@ -85,6 +85,25 @@ type
cfbtBeginEnd,
cfbtNestedComment
);
TPascalCompilerMode = (
pcmObjFPC,
pcmDelphi,
pcmFPC,
pcmTP,
pcmGPC,
pcmMacPas
);
{ TSynPasSynRange }
TSynPasSynRange = class(TSynCustomHighlighterRange)
private
FMode: TPascalCompilerMode;
public
function Compare(Range: TSynCustomHighlighterRange): integer; override;
procedure Assign(Src: TSynCustomHighlighterRange); override;
property Mode: TPascalCompilerMode read FMode write FMode;
end;
{$ENDIF}
TProcTableProc = procedure of object;
@ -97,6 +116,7 @@ type
TSynPasSyn = class(TSynCustomHighlighter)
private
fAsmStart: Boolean;
FNestedComments: boolean;
fRange: TRangeState;
{$IFDEF SYN_LAZARUS}
fLineStr: string;
@ -127,10 +147,11 @@ type
fSpaceAttri: TSynHighlighterAttributes;
{$IFDEF SYN_LAZARUS}
fDirectiveAttri: TSynHighlighterAttributes;
FNestedComments: boolean;
FCompilerMode: TPascalCompilerMode;
{$ENDIF}
fD4syntax: boolean;
{$IFDEF SYN_LAZARUS}
procedure SetCompilerMode(const AValue: TPascalCompilerMode);
function TextComp(aText: PChar): Boolean;
function KeyHash: Integer;
{$ELSE}
@ -258,6 +279,7 @@ type
{$IFDEF SYN_LAZARUS}
function StartPascalCodeFoldBlock(ABlockType: TPascalCodeFoldBlockType;
SubBlock: boolean = false): TSynCustomCodeFoldBlock;
function GetRangeClass: TSynCustomHighlighterRangeClass; override;
{$ENDIF}
public
{$IFNDEF SYN_CPPB_1} class {$ENDIF}
@ -308,7 +330,8 @@ type
{$IFDEF SYN_LAZARUS}
property DirectiveAttri: TSynHighlighterAttributes read fDirectiveAttri
write fDirectiveAttri;
property NestedComments: boolean read FNestedComments write FNestedComments;
property NestedComments: boolean read FNestedComments;
property CompilerMode: TPascalCompilerMode read FCompilerMode write SetCompilerMode;
{$ENDIF}
property D4syntax: boolean read FD4syntax write SetD4syntax default true;
end;
@ -318,6 +341,7 @@ type
TSynFreePascalSyn = class(TSynPasSyn)
public
constructor Create(AOwner: TComponent); override;
procedure ResetRange; override;
end;
@ -604,13 +628,23 @@ var
CurPos: PChar;
begin
CurPos:=@fLine[Run];
while (aText<>#0) do begin
while (aText^<>#0) do begin
if mHashTable[aText^]<>mHashTable[CurPos^] then exit(false);
inc(aText);
inc(CurPos);
end;
Result:=true;
end;
procedure TSynPasSyn.SetCompilerMode(const AValue: TPascalCompilerMode);
begin
if FCompilerMode=AValue then exit;
FCompilerMode:=AValue;
FNestedComments:=FCompilerMode in [pcmFPC,pcmObjFPC];
TSynPasSynRange(CodeFoldRange).Mode:=FCompilerMode;
//DebugLn(['TSynPasSyn.SetCompilerMode FCompilerMode=',ord(FCompilerMode),' FNestedComments=',FNestedComments]);
end;
{$ENDIF}
function TSynPasSyn.Func15: TtkTokenKind;
@ -1266,6 +1300,7 @@ begin
fDirectiveAttri := TSynHighlighterAttributes.Create(SYNS_AttrDirective);
fDirectiveAttri.Style:= [fsItalic];
AddAttribute(fDirectiveAttri);
CompilerMode:=pcmDelphi;
{$ENDIF}
SetAttributesOnChange({$IFDEF FPC}@{$ENDIF}DefHighlightChange);
@ -1278,7 +1313,7 @@ end; { Create }
procedure TSynPasSyn.SetLine(const NewValue: string; LineNumber:Integer);
begin
//DebugLn(['TSynPasSyn.SetLine LineNumber=',LineNumber,' Line="',NewValue,'"']);
//DebugLn(['TSynPasSyn.SetLine START LineNumber=',LineNumber,' Line="',NewValue,'"']);
{$IFDEF SYN_LAZARUS}
fLineStr := NewValue;
fLineLen:=length(fLineStr);
@ -1361,6 +1396,24 @@ end;
procedure TSynPasSyn.DirectiveProc;
begin
fTokenID := tkDirective;
if TextComp('mode') then begin
// $mode directive
inc(Run,4);
// skip space
while (fLine[Run] in [' ',#9,#10,#13]) do inc(Run);
if TextComp('objfpc') then
CompilerMode:=pcmObjFPC
else if TextComp('delphi') then
CompilerMode:=pcmDelphi
else if TextComp('fpc') then
CompilerMode:=pcmFPC
else if TextComp('gpc') then
CompilerMode:=pcmGPC
else if TextComp('tp') then
CompilerMode:=pcmTP
else if TextComp('macpas') then
CompilerMode:=pcmMacPas;
end;
repeat
case fLine[Run] of
#0,#10,#13: break;
@ -1376,9 +1429,8 @@ begin
break;
end;
'{':
if NestedComments then begin
if NestedComments then
StartPascalCodeFoldBlock(cfbtNestedComment);
end;
end;
Inc(Run);
until (Run>=fLineLen);
@ -1789,7 +1841,9 @@ end;
procedure TSynPasSyn.SetRange(Value: Pointer);
begin
{$IFDEF SYN_LAZARUS}
//DebugLn(['TSynPasSyn.SetRange START']);
inherited SetRange(Value);
CompilerMode := TSynPasSynRange(CodeFoldRange).Mode;
fRange := TRangeState(PtrUInt(CodeFoldRange.RangeType));
{$ELSE}
fRange := TRangeState(PtrUInt(Value));
@ -1801,6 +1855,7 @@ begin
fRange:= rsUnknown;
{$IFDEF SYN_LAZARUS}
Inherited ResetRange;
CompilerMode:=pcmDelphi;
{$ENDIF}
end;
@ -1841,6 +1896,12 @@ begin
Result:=TSynCustomCodeFoldBlock(
inherited StartCodeFoldBlock(Pointer(PtrInt(ABlockType)),SubBlock));
end;
function TSynPasSyn.GetRangeClass: TSynCustomHighlighterRangeClass;
begin
Result:=TSynPasSynRange;
end;
{$endif}
function TSynPasSyn.UseUserSettings(settingIndex: integer): boolean;
@ -2003,9 +2064,32 @@ end;
constructor TSynFreePascalSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
NestedComments:=true;
CompilerMode:=pcmObjFPC;
end;
procedure TSynFreePascalSyn.ResetRange;
begin
inherited ResetRange;
CompilerMode:=pcmObjFPC;
end;
{$IFDEF SYN_LAZARUS}
{ TSynPasSynRange }
function TSynPasSynRange.Compare(Range: TSynCustomHighlighterRange): integer;
begin
Result:=inherited Compare(Range);
if Result<>0 then exit;
Result:=ord(FMode)-ord(TSynPasSynRange(Range).FMode);
end;
procedure TSynPasSynRange.Assign(Src: TSynCustomHighlighterRange);
begin
inherited Assign(Src);
FMode:=TSynPasSynRange(Src).FMode;
end;
{$ENDIF}
initialization
MakeIdentTable;
{$IFNDEF SYN_CPPB_1}

View File

@ -2083,7 +2083,7 @@ begin
// initialize with defaults
if SynColorScheme = '' then
SynColorScheme := ReadColorScheme(Syn.LanguageName);
DebugLn(['TEditorOptions.ReadHighlighterSettings ',SynColorScheme,' Syn.ClassName=',Syn.ClassName]);
//DebugLn(['TEditorOptions.ReadHighlighterSettings ',SynColorScheme,' Syn.ClassName=',Syn.ClassName]);
if (SynColorScheme = '') or (Syn.LanguageName = '') then
exit;
ReadDefaultsForHighlighterSettings(Syn, SynColorScheme, Nil);