mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-19 23:49:36 +02:00
SynEdit: Word-brackets (word-pair highlight) for ifdef
git-svn-id: trunk@37830 -
This commit is contained in:
parent
9acafe4c47
commit
e0d69ad952
@ -1583,12 +1583,13 @@ begin
|
||||
FReadType := FReadDefaultType;
|
||||
end;
|
||||
|
||||
if ((aY < FReadY) or ((aY = FReadY) and (aX < FReadX))) then
|
||||
// ax may be off by one, since pas highlighter changed to include $ in $IFDEF
|
||||
if ((aY < FReadY) or ((aY = FReadY) and (aX+1 < FReadX))) then
|
||||
exit(scftOpen); // actually, read before point
|
||||
|
||||
i := 0;
|
||||
if FReadType = scftHide then i := 1; // fold one more than len
|
||||
if (aY <> FReadY) or (aX <> FReadX) or (aLen + i <> FReadSumLen) then
|
||||
if (aY <> FReadY) or (abs(aX - FReadX) > 1) or (aLen + i <> FReadSumLen) then
|
||||
exit(Invalidate);
|
||||
|
||||
FReadLastY := FReadY;
|
||||
|
@ -189,10 +189,29 @@ var
|
||||
Result.FoldAction := [sfaInvalid]; // LastLine closed Node(maybe force-closed?)
|
||||
end;
|
||||
|
||||
function CompareBounds(const Node1, Node2: TSynFoldNodeInfo): Boolean;
|
||||
begin
|
||||
Result := (not (sfaInvalid in Node1.FoldAction)) and
|
||||
(not (sfaInvalid in Node2.FoldAction)) and
|
||||
(Node1.LogXStart = Node2.LogXStart) and
|
||||
(Node1.LogXEnd = Node2.LogXEnd);
|
||||
end;
|
||||
|
||||
function CheckNeighbourNode(const NodeList: TLazSynFoldNodeInfoList;
|
||||
const CurNode: TSynFoldNodeInfo; Offset: Integer; var FoundNode: TSynFoldNodeInfo): Boolean;
|
||||
var
|
||||
TmpNode: TSynFoldNodeInfo;
|
||||
begin
|
||||
TmpNode := NodeList[CurNode.NodeIndex + Offset];
|
||||
Result := CompareBounds(CurNode, TmpNode);
|
||||
if Result then
|
||||
FoundNode := TmpNode;
|
||||
end;
|
||||
|
||||
var
|
||||
LogCaretXY: TPoint;
|
||||
i, i2, y, y2: integer;
|
||||
Node1, Node2, Node3, TmpNode: TSynFoldNodeInfo;
|
||||
i, y: integer;
|
||||
StartNode, CloseNode, Node3, TmpNode: TSynFoldNodeInfo;
|
||||
NodeList: TLazSynFoldNodeInfoList;
|
||||
begin
|
||||
Word1.Y := -1;
|
||||
@ -212,71 +231,60 @@ begin
|
||||
HL.CurrentLines := Lines;
|
||||
HL.FoldNodeInfo[y].ClearFilter; // only needed once, in case the line was already used
|
||||
|
||||
(* Find the node under caret.
|
||||
- for "end" (Procedure and begin) this is the inner (end of begin) node
|
||||
- For "{$Else}" this is the closing node
|
||||
*)
|
||||
i := 0;
|
||||
NodeList := HL.FoldNodeInfo[y];
|
||||
NodeList.ActionFilter := [sfaMarkup];
|
||||
Node1 := NodeList[i];
|
||||
while not(sfaInvalid in Node1.FoldAction) and (Node1.LogXEnd < LogCaretXY.X-1) do
|
||||
TmpNode := NodeList[i];
|
||||
while not(sfaInvalid in TmpNode.FoldAction) and (TmpNode.LogXEnd < LogCaretXY.X-1) do
|
||||
begin
|
||||
inc(i);
|
||||
Node1 := NodeList[i];
|
||||
TmpNode := NodeList[i];
|
||||
end;
|
||||
if (Node1.LogXStart > LogCaretXY.X - 1) or (sfaInvalid in Node1.FoldAction) then
|
||||
if (TmpNode.LogXStart > LogCaretXY.X - 1) or (sfaInvalid in TmpNode.FoldAction) then
|
||||
exit;
|
||||
|
||||
if Node1.FoldAction * [sfaOpen, sfaOneLineOpen] <> [] then begin
|
||||
//y1 := y;
|
||||
Node2 := FindEndNode(Node1, y, i);
|
||||
if (sfaInvalid in Node2.FoldAction) then
|
||||
exit;
|
||||
y2 := y;
|
||||
i2 := i;
|
||||
end else begin
|
||||
Node2 := Node1;
|
||||
y2 := y;
|
||||
i2 := i;
|
||||
Node1 := FindStartNode(Node2, y, i); // skip = endnode => do not skup anything
|
||||
if (sfaInvalid in Node1.FoldAction) then
|
||||
exit;
|
||||
end;
|
||||
|
||||
(* Find other end *)
|
||||
Node3.FoldAction := [sfaInvalid];
|
||||
i := i2;
|
||||
y := y2;
|
||||
TmpNode := HL.FoldNodeInfo[y2].NodeInfoEx(i2 - 1, [sfaMarkup]);
|
||||
if (not (sfaInvalid in TmpNode.FoldAction)) and
|
||||
(TmpNode.LogXStart = Node2.LogXStart) and (TmpNode.LogXEnd = Node2.LogXEnd)
|
||||
then begin
|
||||
// triple node => 3rd start after current start
|
||||
TmpNode := FindStartNode(TmpNode, y2, i2);
|
||||
if (not (sfaInvalid in TmpNode.FoldAction)) then begin
|
||||
Node3 := Node2;
|
||||
Node2 := TmpNode;
|
||||
end;
|
||||
end
|
||||
else begin
|
||||
y2 := y;
|
||||
i2 := i;
|
||||
TmpNode := HL.FoldNodeInfo[y2].NodeInfoEx(i2 + 1, [sfaMarkup]);
|
||||
if (not (sfaInvalid in TmpNode.FoldAction)) and
|
||||
(TmpNode.LogXStart = Node2.LogXStart) and (TmpNode.LogXEnd = Node2.LogXEnd)
|
||||
then begin
|
||||
// triple node => 3rd start before current start
|
||||
TmpNode := FindStartNode(TmpNode, y2, i2);
|
||||
if (not (sfaInvalid in TmpNode.FoldAction)) then begin
|
||||
Node3 := Node2;
|
||||
Node2 := Node1;
|
||||
Node1 := TmpNode;
|
||||
end;
|
||||
end
|
||||
if TmpNode.FoldAction * [sfaOpen, sfaOneLineOpen] <> [] then begin
|
||||
StartNode := TmpNode;
|
||||
CloseNode := FindEndNode(StartNode, y, i);
|
||||
if (sfaInvalid in CloseNode.FoldAction) then
|
||||
exit;
|
||||
// NodeList now holds the closing line
|
||||
if not CheckNeighbourNode(NodeList, CloseNode, 1, Node3)
|
||||
then CheckNeighbourNode(NodeList, CloseNode, -1, Node3);
|
||||
end else begin
|
||||
CloseNode := TmpNode;
|
||||
CheckNeighbourNode(NodeList, CloseNode, 1, Node3); // still having the correct NodeList;
|
||||
StartNode := FindStartNode(CloseNode, y, i);
|
||||
if (sfaInvalid in StartNode.FoldAction) then
|
||||
exit;
|
||||
// NodeList now holds the opening line
|
||||
if sfaInvalid in Node3.FoldAction then
|
||||
CheckNeighbourNode(NodeList, StartNode, -1, Node3); // StartNode could be $ELSE
|
||||
end;
|
||||
|
||||
Word1.Y := Node1.LineIndex + 1;
|
||||
Word1.X := Node1.LogXStart + 1;
|
||||
Word1.X2 := Node1.LogXEnd + 1;
|
||||
Word2.Y := Node2.LineIndex + 1;
|
||||
Word2.X := Node2.LogXStart + 1;
|
||||
Word2.X2 := Node2.LogXEnd + 1;
|
||||
|
||||
(* Find optional 3rd Node *)
|
||||
if not(sfaInvalid in Node3.FoldAction) then begin
|
||||
i := Node3.NodeIndex;
|
||||
y := Node3.LineIndex;
|
||||
if Node3.FoldAction * [sfaOpen, sfaOneLineOpen] <> [] then
|
||||
Node3 := FindEndNode(Node3, y, i)
|
||||
else
|
||||
Node3 := FindStartNode(Node3, y, i);
|
||||
end;
|
||||
|
||||
Word1.Y := StartNode.LineIndex + 1;
|
||||
Word1.X := StartNode.LogXStart + 1;
|
||||
Word1.X2 := StartNode.LogXEnd + 1;
|
||||
Word2.Y := CloseNode.LineIndex + 1;
|
||||
Word2.X := CloseNode.LogXStart + 1;
|
||||
Word2.X2 := CloseNode.LogXEnd + 1;
|
||||
if not(sfaInvalid in Node3.FoldAction) then
|
||||
begin
|
||||
Word3.Y := Node3.LineIndex + 1;
|
||||
|
@ -138,7 +138,8 @@ const
|
||||
[low(TPascalCodeFoldBlockType)..high(TPascalCodeFoldBlockType)];
|
||||
PascalWordTripletRanges: TPascalCodeFoldBlockTypes =
|
||||
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtProcedure, cfbtClass, cfbtProgram, cfbtRecord,
|
||||
cfbtTry, cfbtExcept, cfbtRepeat, cfbtAsm, cfbtCase
|
||||
cfbtTry, cfbtExcept, cfbtRepeat, cfbtAsm, cfbtCase, cfbtCaseElse,
|
||||
cfbtIfDef, cfbtRegion
|
||||
];
|
||||
|
||||
// restrict cdecl etc to places where they can be.
|
||||
@ -2474,25 +2475,48 @@ procedure TSynPasSyn.BraceOpenProc;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure StartDirectiveFoldBlock(ABlockType: TPascalCodeFoldBlockType); inline;
|
||||
begin
|
||||
dec(Run);
|
||||
inc(fStringLen); // include $
|
||||
StartCustomCodeFoldBlock(ABlockType);
|
||||
inc(Run);
|
||||
end;
|
||||
|
||||
procedure EndDirectiveFoldBlock(ABlockType: TPascalCodeFoldBlockType); inline;
|
||||
begin
|
||||
dec(Run);
|
||||
inc(fStringLen); // include $
|
||||
EndCustomCodeFoldBlock(ABlockType);
|
||||
inc(Run);
|
||||
end;
|
||||
|
||||
procedure EndStartDirectiveFoldBlock(ABlockType: TPascalCodeFoldBlockType); inline;
|
||||
begin
|
||||
dec(Run);
|
||||
inc(fStringLen); // include $
|
||||
EndCustomCodeFoldBlock(ABlockType);
|
||||
StartCustomCodeFoldBlock(ABlockType);
|
||||
inc(Run);
|
||||
end;
|
||||
|
||||
var
|
||||
nd: PSynFoldNodeInfo;
|
||||
begin
|
||||
if (Run < fLineLen-1) and (fLine[Run+1] = '$') then begin
|
||||
// compiler directive
|
||||
fRange := fRange + [rsDirective];
|
||||
inc(Run,2);
|
||||
inc(Run, 2);
|
||||
fToIdent := Run;
|
||||
KeyHash;
|
||||
if KeyComp('ifdef') or KeyComp('ifndef') or KeyComp('if') then
|
||||
StartCustomCodeFoldBlock(cfbtIfDef)
|
||||
StartDirectiveFoldBlock(cfbtIfDef)
|
||||
else if KeyComp('endif') then
|
||||
EndCustomCodeFoldBlock(cfbtIfDef)
|
||||
else if KeyComp('else') then begin
|
||||
EndCustomCodeFoldBlock(cfbtIfDef);
|
||||
StartCustomCodeFoldBlock(cfbtIfDef);
|
||||
end
|
||||
EndDirectiveFoldBlock(cfbtIfDef)
|
||||
else if KeyComp('else') then
|
||||
EndStartDirectiveFoldBlock(cfbtIfDef)
|
||||
else if KeyComp('region') then begin
|
||||
StartCustomCodeFoldBlock(cfbtRegion);
|
||||
StartDirectiveFoldBlock(cfbtRegion);
|
||||
if FCatchNodeInfo then
|
||||
// Scan ahead
|
||||
if ScanRegion then begin
|
||||
@ -2502,7 +2526,7 @@ begin
|
||||
end;
|
||||
end
|
||||
else if KeyComp('endregion') then
|
||||
EndCustomCodeFoldBlock(cfbtRegion);
|
||||
EndDirectiveFoldBlock(cfbtRegion);
|
||||
DirectiveProc;
|
||||
end else begin
|
||||
// curly bracket open -> borland comment
|
||||
@ -2515,7 +2539,7 @@ begin
|
||||
fToIdent := Run;
|
||||
KeyHash;
|
||||
if KeyComp('region') then begin
|
||||
StartCustomCodeFoldBlock(cfbtRegion);
|
||||
StartDirectiveFoldBlock(cfbtRegion);
|
||||
if FCatchNodeInfo then
|
||||
// Scan ahead
|
||||
if ScanRegion then begin
|
||||
@ -2525,7 +2549,7 @@ begin
|
||||
end;
|
||||
end
|
||||
else if KeyComp('endregion') then
|
||||
EndCustomCodeFoldBlock(cfbtRegion)
|
||||
EndDirectiveFoldBlock(cfbtRegion)
|
||||
else begin
|
||||
dec(Run, 2);
|
||||
StartPascalCodeFoldBlock(cfbtBorCommand);
|
||||
|
@ -2067,7 +2067,7 @@ begin
|
||||
TheList.FoldFlags := [];
|
||||
AssertEquals(BaseTestName + 'Cnt', 3, TheList.Count);
|
||||
CheckNode(TheList.HLNode[2], 2, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode(TheList.HLNode[1], 1, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode(TheList.HLNode[1], 1, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode(TheList.HLNode[0], 0, 0, 0, 7, 0, 1, 0, 1, 10, 10, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
|
||||
|
||||
@ -2087,7 +2087,7 @@ begin
|
||||
TheList.FoldGroup := 3;
|
||||
TheList.FoldFlags := [];
|
||||
AssertEquals(BaseTestName + 'Cnt', 1, TheList.Count);
|
||||
CheckNode(TheList.HLNode[0], 1, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode(TheList.HLNode[0], 1, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
|
||||
|
||||
PopPushBaseName('All Enabled - group 0 - line 3');
|
||||
|
@ -1089,15 +1089,15 @@ begin
|
||||
//### Foldinfo Line: 1 PasMinLvl=1 EndLvl=2 : procedure a;
|
||||
CheckNode( 1, [], 0, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 2 PasMinLvl=2 EndLvl=2 : {$IFDEF A}
|
||||
CheckNode( 2, [], 0, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [], 0, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 3 PasMinLvl=2 EndLvl=3 : begin
|
||||
CheckNode( 3, [], 0, 0, 0, 5, 2, 3, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 4 PasMinLvl=3 EndLvl=3 : {$ENDIF}
|
||||
CheckNode( 4, [], 0, 0, 2, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 4, [], 0, 0, 1, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 5 PasMinLvl=3 EndLvl=4 : {$IFDEF B} if a then begin {$ENDIF}
|
||||
CheckNode( 5, [], 0, 0, 4, 9, 0, 1, 0, 1, 18, 18, 3, [sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 5, [], 0, 0, 3, 9, 0, 1, 0, 1, 18, 18, 3, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 5, [], 0, 1, 23, 28, 3, 4, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 5, [], 0, 2, 31, 36, 1, 0, 1, 0, 18, 18, 3, [sfaOneLineClose]);
|
||||
CheckNode( 5, [], 0, 2, 30, 36, 1, 0, 1, 0, 18, 18, 3, [sfaMarkup,sfaOneLineClose]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=4 EndLvl=4 : writeln()
|
||||
//### Foldinfo Line: 7 PasMinLvl=3 EndLvl=3 : end;
|
||||
CheckNode( 7, [], 0, 0, 2, 5, 4, 3, 4, 3, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
@ -1195,11 +1195,11 @@ begin
|
||||
//### Foldinfo Line: 1 PasMinLvl=1 EndLvl=2 : procedure a;
|
||||
CheckNode( 1, [sfaFold], 0, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 2 PasMinLvl=2 EndLvl=2 : {$IFDEF A}
|
||||
CheckNode( 2, [sfaFold], 0, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [sfaFold], 0, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 3 PasMinLvl=2 EndLvl=3 : begin
|
||||
CheckNode( 3, [sfaFold], 0, 0, 0, 5, 2, 3, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 4 PasMinLvl=3 EndLvl=3 : {$ENDIF}
|
||||
CheckNode( 4, [sfaFold], 0, 0, 2, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 4, [sfaFold], 0, 0, 1, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 5 PasMinLvl=3 EndLvl=4 : {$IFDEF B} if a then begin {$ENDIF}
|
||||
CheckNode( 5, [sfaFold], 0, 0, 23, 28, 3, 4, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=4 EndLvl=4 : writeln()
|
||||
@ -1218,9 +1218,9 @@ begin
|
||||
{%endregion TEXT 1 -- [cfbtBeginEnd..cfbtNone], [sfaFold]}
|
||||
|
||||
{%region TEXT 1 -- [cfbtBeginEnd..cfbtNone], [sfaMarkup]}
|
||||
PopPushBaseName('Text 1 -- [cfbtBeginEnd..cfbtNone], [sfaMarkup], 0');
|
||||
PopPushBaseName('Text 1 -- [cfbtBeginEnd..cfbtNone]-cfbtIfDef, [sfaMarkup], 0');
|
||||
SetLines(TestTextFoldInfo1);
|
||||
EnableFolds([cfbtBeginEnd..cfbtNone], []);
|
||||
EnableFolds([cfbtBeginEnd..cfbtNone]-[cfbtIfDef], []);
|
||||
//DebugFoldInfo([sfaMarkup]);
|
||||
|
||||
CheckFoldInfoCounts('', [sfaMarkup], 0, [1, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2, 0]);
|
||||
@ -1262,15 +1262,15 @@ begin
|
||||
//### Foldinfo Line: 1 PasMinLvl=1 EndLvl=1 : procedure a;
|
||||
CheckNode( 1, [], 0, 0, 0, 9, 1, 1, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup]);
|
||||
//### Foldinfo Line: 2 PasMinLvl=1 EndLvl=1 : {$IFDEF A}
|
||||
CheckNode( 2, [], 0, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [], 0, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 3 PasMinLvl=1 EndLvl=2 : begin
|
||||
CheckNode( 3, [], 0, 0, 0, 5, 1, 2, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 4 PasMinLvl=2 EndLvl=2 : {$ENDIF}
|
||||
CheckNode( 4, [], 0, 0, 2, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 4, [], 0, 0, 1, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 5 PasMinLvl=2 EndLvl=3 : {$IFDEF B} if a then begin {$ENDIF}
|
||||
CheckNode( 5, [], 0, 0, 4, 9, 0, 1, 0, 1, 18, 18, 3, [sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 5, [], 0, 0, 3, 9, 0, 1, 0, 1, 18, 18, 3, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 5, [], 0, 1, 23, 28, 2, 3, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 5, [], 0, 2, 31, 36, 1, 0, 1, 0, 18, 18, 3, [sfaOneLineClose]);
|
||||
CheckNode( 5, [], 0, 2, 30, 36, 1, 0, 1, 0, 18, 18, 3, [sfaMarkup,sfaOneLineClose]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=3 EndLvl=3 : writeln()
|
||||
//### Foldinfo Line: 7 PasMinLvl=2 EndLvl=2 : end;
|
||||
CheckNode( 7, [], 0, 0, 2, 5, 3, 2, 4, 3, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
@ -1305,30 +1305,30 @@ begin
|
||||
//### Foldinfo Line: 1 PasMinLvl=1 EndLvl=2 : procedure a;
|
||||
CheckNode( 1, [], 0, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 2 PasMinLvl=2 EndLvl=4 : {$IFDEF A} begin {$IFDEF B} repeat a; {$ENDIF} until b; {$IFDEF c} try {$ELSE} //x
|
||||
CheckNode( 2, [], 0, 0, 2, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]); // {$IFDEF A}
|
||||
CheckNode( 2, [], 0, 0, 1, 7, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // {$IFDEF A}
|
||||
CheckNode( 2, [], 0, 1, 11, 16, 2, 3, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // begin
|
||||
CheckNode( 2, [], 0, 2, 19, 24, 1, 2, 1, 2, 18, 18, 3, [sfaFoldFold,sfaOneLineOpen]); // {$IFDEF B}
|
||||
CheckNode( 2, [], 0, 2, 18, 24, 1, 2, 1, 2, 18, 18, 3, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]); // {$IFDEF B}
|
||||
CheckNode( 2, [], 0, 3, 28, 34, 3, 4, 3, 4, 15, 15, 1, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]); // repeat a;
|
||||
CheckNode( 2, [], 0, 4, 40, 45, 2, 1, 2, 1, 18, 18, 3, [sfaOneLineClose]); // {$ENDIF}
|
||||
CheckNode( 2, [], 0, 4, 39, 45, 2, 1, 2, 1, 18, 18, 3, [sfaMarkup,sfaOneLineClose]); // {$ENDIF}
|
||||
CheckNode( 2, [], 0, 5, 47, 52, 4, 3, 4, 3, 15, 15, 1, [sfaMarkup,sfaOneLineClose]); // until b;
|
||||
CheckNode( 2, [], 0, 6, 58, 63, 1, 2, 1, 2, 18, 18, 3, [sfaFoldFold,sfaOneLineOpen]); // {$IFDEF c}
|
||||
CheckNode( 2, [], 0, 6, 57, 63, 1, 2, 1, 2, 18, 18, 3, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]); // {$IFDEF c}
|
||||
CheckNode( 2, [], 0, 7, 67, 70, 3, 4, 3, 4, 13, 13, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);// try
|
||||
CheckNode( 2, [], 0, 8, 73, 77, 2, 1, 2, 1, 18, 18, 3, [sfaOneLineClose]); // {$ELSE}
|
||||
CheckNode( 2, [], 0, 9, 73, 77, 1, 2, 1, 2, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]); // //x
|
||||
CheckNode( 2, [], 0, 8, 72, 77, 2, 1, 2, 1, 18, 18, 3, [sfaMarkup,sfaOneLineClose]); // {$ELSE}
|
||||
CheckNode( 2, [], 0, 9, 72, 77, 1, 2, 1, 2, 18, 18, 3, [sfaMarkup,sfaOpen,sfaFold,sfaFoldFold]); // {$ELSE}
|
||||
//### Foldinfo Line: 3 PasMinLvl=4 EndLvl=4 : //foo
|
||||
CheckNode( 3, [], 0, 0, 2, 4, 4, 5, 4, 5, 22, 22, 1, [sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 3, [], 0, 1, 7, 7, 5, 4, 5, 4, 22, 22, 1, [sfaOneLineClose]);
|
||||
//### Foldinfo Line: 4 PasMinLvl=4 EndLvl=5 : finally repeat x; {$ENDIF C} until y;
|
||||
CheckNode( 4, [], 0, 0, 2, 9, 4, 5, 4, 5, 14, 14, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 4, [], 0, 1, 10, 16, 5, 6, 5, 6, 15, 15, 1, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 4, [], 0, 2, 22, 27, 2, 1, 2, 1, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 4, [], 0, 2, 21, 27, 2, 1, 2, 1, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
CheckNode( 4, [], 0, 3, 31, 36, 6, 5, 6, 5, 15, 15, 1, [sfaMarkup,sfaOneLineClose]);
|
||||
//### Foldinfo Line: 5 PasMinLvl=3 EndLvl=3 : repeat m; until n; end; {$ENDIF A} //
|
||||
CheckNode( 5, [], 0, 0, 2, 8, 5, 6, 5, 6, 15, 15, 1, [sfaMarkup,sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 5, [], 0, 1, 12, 17, 6, 5, 6, 5, 15, 15, 1, [sfaMarkup,sfaOneLineClose]);
|
||||
CheckNode( 5, [], 0, 2, 21, 24, 5, 4, 5, 4, 14, 14, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
CheckNode( 5, [], 0, 3, 21, 24, 4, 3, 4, 3, 13, 13, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
CheckNode( 5, [], 0, 4, 28, 33, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 5, [], 0, 4, 27, 33, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=1 EndLvl=1 : end
|
||||
CheckNode( 6, [], 0, 0, 0, 3, 3, 2, 3, 2, 1, 0, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
CheckNode( 6, [], 0, 1, 0, 3, 2, 1, 2, 1, 3, 3, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
@ -1366,7 +1366,7 @@ begin
|
||||
CheckNode( 5, [], 0, 0, 0, 5, 2, 3, 2, 3, 5, 5, 1, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=3 EndLvl=3 : c = 1;
|
||||
//### Foldinfo Line: 7 PasMinLvl=1 EndLvl=1 : d = 2; {$IFDEF A}
|
||||
CheckNode( 7, [], 0, 0, 11, 16, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 7, [], 0, 0, 10, 16, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 7, [], 0, 1, 19, 19, 3, 2, 3, 2, 5, 5, 1, [sfaClose,sfaFold]);
|
||||
CheckNode( 7, [], 0, 2, 19, 19, 2, 1, 2, 1, 9, 9, 1, [sfaClose,sfaFold]);
|
||||
//### Foldinfo Line: 8 PasMinLvl=1 EndLvl=2 : Implementation
|
||||
@ -1377,7 +1377,7 @@ begin
|
||||
CheckNode( 9, [], 0, 2, 2, 2, 2, 1, 2, 1, 9, 9, 1, [sfaClose,sfaFold]);
|
||||
//### Foldinfo Line: 10 PasMinLvl=0 EndLvl=0 : end.
|
||||
CheckNode(10, [], 0, 0, 0, 3, 1, 0, 1, 0, 11, 11, 1, [sfaClose,sfaFold]);
|
||||
CheckNode(10, [], 0, 1, 4, 4, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold,sfaLastLineClose]);
|
||||
CheckNode(10, [], 0, 1, 4, 4, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold,sfaLastLineClose]);
|
||||
{%endregion TEXT 3 -- [cfbtBeginEnd..cfbtNone], []}
|
||||
|
||||
{%region TEXT 3}
|
||||
@ -1399,7 +1399,7 @@ begin
|
||||
CheckNode( 1, [], 0, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 2 PasMinLvl=2 EndLvl=4 : begin {$IFDEF} if a then begin
|
||||
CheckNode( 2, [], 0, 0, 0, 5, 2, 3, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [], 0, 1, 8, 13, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [], 0, 1, 7, 13, 0, 1, 0, 1, 18, 18, 3, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
CheckNode( 2, [], 0, 2, 25, 30, 3, 4, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
|
||||
//### Foldinfo Line: 3 PasMinLvl=3 EndLvl=3 : end; // 2
|
||||
CheckNode( 3, [], 0, 0, 2, 5, 4, 3, 4, 3, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
@ -1407,7 +1407,7 @@ begin
|
||||
CheckNode( 4, [], 0, 0, 0, 3, 3, 2, 3, 2, 1, 0, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
CheckNode( 4, [], 0, 1, 0, 3, 2, 1, 2, 1, 3, 3, 1, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 5 PasMinLvl=1 EndLvl=1 : {$ENDIF}
|
||||
CheckNode( 5, [], 0, 0, 2, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaFold]);
|
||||
CheckNode( 5, [], 0, 0, 1, 7, 1, 0, 1, 0, 18, 18, 3, [sfaClose,sfaMarkup,sfaFold]);
|
||||
//### Foldinfo Line: 6 PasMinLvl=1 EndLvl=0 : //
|
||||
CheckNode( 6, [], 0, 0, 0, 2, 1, 2, 1, 2, 22, 22, 1, [sfaFoldFold,sfaOneLineOpen]);
|
||||
CheckNode( 6, [], 0, 1, 2, 2, 2, 1, 2, 1, 22, 22, 1, [sfaOneLineClose,sfaLastLineClose]);
|
||||
|
@ -85,11 +85,23 @@ end;
|
||||
|
||||
procedure TTestMarkupWordGroup.TestWordGroup;
|
||||
procedure CheckWord(Name: String; X,Y, w1X,w1E,w1Y, w2X,w2E,w2Y, w3X,w3E,w3Y: Integer);
|
||||
Procedure SortWordPoint(var w1,w2: TWordPoint);
|
||||
var w3: TWordPoint;
|
||||
begin
|
||||
if (w1.Y > w2.Y) or ((w1.Y = w2.Y) and (w1.X > w2.X)) then begin
|
||||
w3 := w1;
|
||||
w1 := w2;
|
||||
w2 := w3;
|
||||
end;
|
||||
end;
|
||||
var
|
||||
w1,w2,w3: TWordPoint;
|
||||
begin
|
||||
Name := Name + ' At '+IntToStr(x)+ ','+IntToStr(y)+' ';
|
||||
Markup.FindMatchingWords(Point(X,Y), w1, w2, w3);
|
||||
SortWordPoint(w1, w2);
|
||||
SortWordPoint(w2, w3);
|
||||
SortWordPoint(w1, w2);
|
||||
if w1Y = -1 then
|
||||
AssertEquals(Name+'Y', -1, w1.Y)
|
||||
else begin
|
||||
|
Loading…
Reference in New Issue
Block a user