mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-03 01:38:17 +02:00
synedit: pascal highlighter: implemented mode Delphi/ObjFPC and nested comments
git-svn-id: trunk@15874 -
This commit is contained in:
parent
2a59caae77
commit
cbc57806d7
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user