SynEdit: Word-brackets (word-pair highlight) for ifdef

git-svn-id: trunk@37830 -
This commit is contained in:
martin 2012-06-30 21:40:44 +00:00
parent 9acafe4c47
commit e0d69ad952
6 changed files with 141 additions and 96 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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');

View File

@ -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]);

View File

@ -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