mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 20:59:12 +02:00
SynEdit: Ifdef Markup: fix wrong info, when nodestate changed
git-svn-id: trunk@41258 -
This commit is contained in:
parent
add486763e
commit
34b02a676b
@ -98,6 +98,7 @@ type
|
|||||||
|
|
||||||
function NodeStateForPeer(APeerType: TSynMarkupIfdefNodeType): TSynMarkupIfdefNodeStateEx;
|
function NodeStateForPeer(APeerType: TSynMarkupIfdefNodeType): TSynMarkupIfdefNodeStateEx;
|
||||||
procedure SetOpeningPeerNodeState(AValueOfPeer, AValueForNode: TSynMarkupIfdefNodeStateEx);
|
procedure SetOpeningPeerNodeState(AValueOfPeer, AValueForNode: TSynMarkupIfdefNodeStateEx);
|
||||||
|
procedure SetNodeState(AValue: TSynMarkupIfdefNodeStateEx; ASkipLineState: Boolean);
|
||||||
procedure SetNodeState(AValue: TSynMarkupIfdefNodeStateEx);
|
procedure SetNodeState(AValue: TSynMarkupIfdefNodeStateEx);
|
||||||
|
|
||||||
function GetPeer(APeerType: TSynMarkupIfdefPeerType): TSynMarkupHighIfDefEntry;
|
function GetPeer(APeerType: TSynMarkupIfdefPeerType): TSynMarkupHighIfDefEntry;
|
||||||
@ -363,8 +364,8 @@ type
|
|||||||
CurrentState: TSynMarkupIfdefNodeStateEx): TSynMarkupIfdefNodeState;
|
CurrentState: TSynMarkupIfdefNodeStateEx): TSynMarkupIfdefNodeState;
|
||||||
|
|
||||||
Procedure ValidateMatches;
|
Procedure ValidateMatches;
|
||||||
procedure DoTreeUnlocked(Sender: TObject);
|
|
||||||
procedure DoTreeUnlocking(Sender: TObject);
|
procedure DoTreeUnlocking(Sender: TObject);
|
||||||
|
procedure DoTreeUnlocked(Sender: TObject);
|
||||||
procedure DoTreeChanged(Sender: TObject);
|
procedure DoTreeChanged(Sender: TObject);
|
||||||
protected
|
protected
|
||||||
procedure DoFoldChanged(aLine: Integer);
|
procedure DoFoldChanged(aLine: Integer);
|
||||||
@ -638,6 +639,11 @@ procedure TSynMarkupHighIfDefEntry.SetLine(AValue: TSynMarkupHighIfDefLinesNode)
|
|||||||
begin
|
begin
|
||||||
if FLine = AValue then Exit;
|
if FLine = AValue then Exit;
|
||||||
|
|
||||||
|
if (FNodeState = idnNotInCode) and (FLine <> nil) and
|
||||||
|
(idlNotInCodeToUnknown in FLine.LineFlags)
|
||||||
|
then
|
||||||
|
SetNodeState(idnUnknown);
|
||||||
|
|
||||||
RemoveNodeStateFromLine;
|
RemoveNodeStateFromLine;
|
||||||
FLine := AValue;
|
FLine := AValue;
|
||||||
ApplyNodeStateToLine;
|
ApplyNodeStateToLine;
|
||||||
@ -646,25 +652,35 @@ end;
|
|||||||
procedure TSynMarkupHighIfDefEntry.SetOpeningPeerNodeState(AValueOfPeer,
|
procedure TSynMarkupHighIfDefEntry.SetOpeningPeerNodeState(AValueOfPeer,
|
||||||
AValueForNode: TSynMarkupIfdefNodeStateEx);
|
AValueForNode: TSynMarkupIfdefNodeStateEx);
|
||||||
begin
|
begin
|
||||||
|
RemoveNodeStateFromLine;
|
||||||
FOpeningPeerNodeState := AValueOfPeer;
|
FOpeningPeerNodeState := AValueOfPeer;
|
||||||
if NodeType in [idnElse, idnEndIf] then
|
if NodeType in [idnElse, idnEndIf] then
|
||||||
SetNodeState(AValueForNode)
|
SetNodeState(AValueForNode, True)
|
||||||
else
|
else
|
||||||
if NodeType = idnElseIf then
|
if NodeType = idnElseIf then
|
||||||
case AValueForNode of
|
case AValueForNode of
|
||||||
idnEnabled: MakeUnknown; // Maybe keep?
|
idnEnabled: SetNodeState(idnUnknown, True); // Maybe keep?
|
||||||
idnDisabled: SetNodeState(idnDisabled);
|
idnDisabled: SetNodeState(idnDisabled, True);
|
||||||
else SetNodeState(idnUnknown);
|
else SetNodeState(idnUnknown, True);
|
||||||
end;
|
end;
|
||||||
|
ApplyNodeStateToLine;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynMarkupHighIfDefEntry.SetNodeState(AValue: TSynMarkupIfdefNodeStateEx);
|
procedure TSynMarkupHighIfDefEntry.SetNodeState(AValue: TSynMarkupIfdefNodeStateEx);
|
||||||
begin
|
begin
|
||||||
|
SetNodeState(AValue, False);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynMarkupHighIfDefEntry.SetNodeState(AValue: TSynMarkupIfdefNodeStateEx;
|
||||||
|
ASkipLineState: Boolean);
|
||||||
|
begin
|
||||||
|
if not ASkipLineState then
|
||||||
RemoveNodeStateFromLine;
|
RemoveNodeStateFromLine;
|
||||||
FNodeState := AValue;
|
FNodeState := AValue;
|
||||||
|
if not ASkipLineState then
|
||||||
ApplyNodeStateToLine;
|
ApplyNodeStateToLine;
|
||||||
|
|
||||||
if AValue = idnEnabled then
|
if FNodeState = idnEnabled then
|
||||||
Line.FLineFlags := Line.FLineFlags + [idlNotInCodeToUnknownReq, idlNotInCodeToUnknown];
|
Line.FLineFlags := Line.FLineFlags + [idlNotInCodeToUnknownReq, idlNotInCodeToUnknown];
|
||||||
|
|
||||||
case NodeType of
|
case NodeType of
|
||||||
@ -2475,6 +2491,7 @@ if (e<> nil) and not(e.NodeType in [idnIfdef, idnElseIf]) then DebugLn([ 'SetNod
|
|||||||
IncChangeStep;
|
IncChangeStep;
|
||||||
if FLockTreeCount = 0 then
|
if FLockTreeCount = 0 then
|
||||||
FNotifyLists[itnChanged].CallNotifyEvents(Self);
|
FNotifyLists[itnChanged].CallNotifyEvents(Self);
|
||||||
|
//DebugLn([ 'SetNodeState ', ALinePos, '/', 'AstartPos', AstartPos, ' ', dbgs(AState)]);
|
||||||
end;
|
end;
|
||||||
e.NodeState := AState;
|
e.NodeState := AState;
|
||||||
|
|
||||||
@ -2957,7 +2974,7 @@ begin
|
|||||||
else
|
else
|
||||||
Result := idnInvalid;
|
Result := idnInvalid;
|
||||||
|
|
||||||
DebugLn(['STATE REQUEST ', LinePos, ' ', XStartPos, ' : ', dbgs(Result)]);
|
//DebugLn(['STATE REQUEST ', LinePos, ' ', XStartPos, ' : ', dbgs(Result)]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditMarkupIfDef.SetLines(const AValue: TSynEditStrings);
|
procedure TSynEditMarkupIfDef.SetLines(const AValue: TSynEditStrings);
|
||||||
|
@ -53,7 +53,10 @@ type
|
|||||||
function TestText5: TStringArray;
|
function TestText5: TStringArray;
|
||||||
function TestText6: TStringArray;
|
function TestText6: TStringArray;
|
||||||
function TestText7: TStringArray;
|
function TestText7: TStringArray;
|
||||||
|
function TestText8: TStringArray;
|
||||||
|
|
||||||
|
procedure CheckOpenCloseCount(AName: String; ALine: Integer;
|
||||||
|
AExpOpenCnt, AExpCloseCnt: Integer);
|
||||||
procedure CheckNodes(AName: String; ALine: Integer;
|
procedure CheckNodes(AName: String; ALine: Integer;
|
||||||
AExp: array of TNodeExpect);
|
AExp: array of TNodeExpect);
|
||||||
procedure CheckNodesXY(AName: String; ALine: Integer;
|
procedure CheckNodesXY(AName: String; ALine: Integer;
|
||||||
@ -595,6 +598,38 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TTestMarkupIfDef.TestText8: TStringArray;
|
||||||
|
procedure AddLine(s: String);
|
||||||
|
begin
|
||||||
|
SetLength(Result, Length(Result)+1);
|
||||||
|
Result[Length(Result)-1] := s;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
// 1
|
||||||
|
AddLine('//' );
|
||||||
|
AddLine('{$IFDEF A} {$IFDEF B} {$ENDIF} {$ENDIF}');
|
||||||
|
AddLine(' {$IFDEF XX}' );
|
||||||
|
AddLine('' );
|
||||||
|
// 5
|
||||||
|
AddLine('{$ENDIF}');
|
||||||
|
AddLine('' );
|
||||||
|
AddLine('' );
|
||||||
|
AddLine('' );
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestMarkupIfDef.CheckOpenCloseCount(AName: String; ALine: Integer; AExpOpenCnt,
|
||||||
|
AExpCloseCnt: Integer);
|
||||||
|
var
|
||||||
|
LineNode: TSynMarkupHighIfDefLinesNodeInfo;
|
||||||
|
begin
|
||||||
|
AName := Format('%s - %s L=%d', [BaseTestName, AName, ALine]);
|
||||||
|
LineNode := FTestTree.FindNodeAtPosition(ALine, afmNil);
|
||||||
|
AssertTrue(AName + 'HasNode', LineNode.HasNode);
|
||||||
|
AssertEquals(AName + ' DisabledEntryOpenCount', AExpOpenCnt, LineNode.Node.DisabledEntryOpenCount);
|
||||||
|
AssertEquals(AName + ' DisabledEntryCloseCount', AExpCloseCnt, LineNode.Node.DisabledEntryCloseCount);
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
function TTestMarkupIfDef.CreateTheHighLighter: TSynCustomFoldHighlighter;
|
function TTestMarkupIfDef.CreateTheHighLighter: TSynCustomFoldHighlighter;
|
||||||
begin
|
begin
|
||||||
Result := TSynPasSyn.Create(nil);
|
Result := TSynPasSyn.Create(nil);
|
||||||
@ -1043,7 +1078,6 @@ FTestTree.DebugPrint(true);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Insert IFDEF into empty text
|
// Insert IFDEF into empty text
|
||||||
ReCreateEditForTreeTest(TestTextNoIfDef);
|
ReCreateEditForTreeTest(TestTextNoIfDef);
|
||||||
FTestTree.ValidateRange(1, 5, FOpenings);
|
FTestTree.ValidateRange(1, 5, FOpenings);
|
||||||
@ -1915,7 +1949,6 @@ begin
|
|||||||
ClearData;
|
ClearData;
|
||||||
SynEdit.TextBetweenPoints[point(1, 1),point(1, 1)] := '(*';
|
SynEdit.TextBetweenPoints[point(1, 1),point(1, 1)] := '(*';
|
||||||
FTestTree.ValidateRange(1, 10, FOpenings);
|
FTestTree.ValidateRange(1, 10, FOpenings);
|
||||||
FTestTree.DebugPrint(true);DebugLn;
|
|
||||||
CheckReq(n, []);
|
CheckReq(n, []);
|
||||||
CheckNodes(n, 2, [ ExpN( 1,12, idnCommentedIfdef, idnDisabled) ]);
|
CheckNodes(n, 2, [ ExpN( 1,12, idnCommentedIfdef, idnDisabled) ]);
|
||||||
CheckNodes(n, 3, []);
|
CheckNodes(n, 3, []);
|
||||||
@ -1925,7 +1958,6 @@ FTestTree.DebugPrint(true);DebugLn;
|
|||||||
ClearData;
|
ClearData;
|
||||||
SynEdit.TextBetweenPoints[point(2, 12),point(2, 12)] := '//';
|
SynEdit.TextBetweenPoints[point(2, 12),point(2, 12)] := '//';
|
||||||
FTestTree.ValidateRange(1, 10, FOpenings);
|
FTestTree.ValidateRange(1, 10, FOpenings);
|
||||||
FTestTree.DebugPrint(true);DebugLn;
|
|
||||||
CheckReq(n, []);
|
CheckReq(n, []);
|
||||||
CheckNodes(n, 2, [ ExpN( 1,12, idnCommentedIfdef, idnDisabled) ]);
|
CheckNodes(n, 2, [ ExpN( 1,12, idnCommentedIfdef, idnDisabled) ]);
|
||||||
CheckNodes(n, 3, []);
|
CheckNodes(n, 3, []);
|
||||||
@ -1935,7 +1967,6 @@ FTestTree.DebugPrint(true);DebugLn;
|
|||||||
ClearData;
|
ClearData;
|
||||||
SynEdit.TextBetweenPoints[point(1, 1),point(3, 1)] := '';
|
SynEdit.TextBetweenPoints[point(1, 1),point(3, 1)] := '';
|
||||||
FTestTree.ValidateRange(1, 10, FOpenings);
|
FTestTree.ValidateRange(1, 10, FOpenings);
|
||||||
FTestTree.DebugPrint(true);DebugLn;
|
|
||||||
CheckReq(n, []);
|
CheckReq(n, []);
|
||||||
CheckNodes(n, 2, [ ExpN( 1,12, idnIfdef, idnDisabled) ]);
|
CheckNodes(n, 2, [ ExpN( 1,12, idnIfdef, idnDisabled) ]);
|
||||||
CheckNodes(n, 3, [ ExpN( 1, 8, idnElse, idnEnabled) ]);
|
CheckNodes(n, 3, [ ExpN( 1, 8, idnElse, idnEnabled) ]);
|
||||||
@ -1974,12 +2005,53 @@ FTestTree.DebugPrint(true);DebugLn;
|
|||||||
|
|
||||||
SynEdit.TextBetweenPoints[point(1, 3),point(1, 3)] := '{$IFDEF a}';
|
SynEdit.TextBetweenPoints[point(1, 3),point(1, 3)] := '{$IFDEF a}';
|
||||||
FTestTree.ValidateRange(1, 5, FOpenings);
|
FTestTree.ValidateRange(1, 5, FOpenings);
|
||||||
FTestTree.DebugPrint(true);DebugLn;
|
//FTestTree.DebugPrint(true);DebugLn;
|
||||||
CheckReq(n, [ 3, 1, 1 ]);
|
CheckReq(n, [ 3, 1, 1 ]);
|
||||||
CheckNodesXY('Insert IFDEF into empty text', 3, [1,11], 0);
|
CheckNodesXY('Insert IFDEF into empty text', 3, [1,11], 0);
|
||||||
{%endregion Insert IFDEF into empty text }
|
{%endregion Insert IFDEF into empty text }
|
||||||
|
|
||||||
|
|
||||||
|
{%region }
|
||||||
|
n := '';
|
||||||
|
ReCreateEditForTreeTest(TestText8);
|
||||||
|
FTestTree.SetNodeState( 2, 1,idnDisabled);
|
||||||
|
FTestTree.SetNodeState( 2,12,idnInvalid);
|
||||||
|
FTestTree.SetNodeState( 3, 2,idnEnabled);
|
||||||
|
FTestTree.DebugPrint(true);DebugLn('-----');
|
||||||
|
|
||||||
|
FTestTree.ValidateRange( 1, 11, FOpenings);
|
||||||
|
FTestTree.DebugPrint(true);DebugLn('-----');
|
||||||
|
CheckNodes(n, 2, [ ExpN( 1,11, idnIfdef, idnDisabled, EpNil, EpEnd(2, 35)),
|
||||||
|
ExpN(12,22, idnIfdef, idnInvalid, EpNil, EpEnd(2, 26)),
|
||||||
|
ExpN(26,34, idnEndIf, idnUnknown, EpIf(2,12), EpNil),
|
||||||
|
ExpN(35,43, idnEndIf, idnDisabled, EpIf(2, 1), EpNil)
|
||||||
|
]);
|
||||||
|
CheckOpenCloseCount(n, 2, 1, 1);
|
||||||
|
CheckNodes(n, 3, [ ExpN( 2,13, idnIfdef, idnEnabled, EpNil, EpEnd( 5, 1)) ]);
|
||||||
|
CheckOpenCloseCount(n, 3, 0, 0);
|
||||||
|
CheckNodes(n, 5, [ ExpN( 1, 9, idnEndIf, idnEnabled, EpIf( 3, 2)) ]);
|
||||||
|
CheckOpenCloseCount(n, 5, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
|
SynEdit.TextBetweenPoints[point(10,2),point(10,2)] := LineEnding;
|
||||||
|
FTestTree.DebugPrint(true);DebugLn('-----');
|
||||||
|
CheckNodes(n, 2, [ ExpN( 1, 2, 1, idnIfdef, idnUnknown, EpNil, EpEnd(3, 26)) ]);
|
||||||
|
CheckNodes(n, 3, [ ExpN( 3,13, idnIfdef, idnInvalid, EpNil, EpEnd(3, 17)),
|
||||||
|
ExpN(17,25, idnEndIf, idnUnknown, EpIf(3, 3), EpNil),
|
||||||
|
ExpN(26,34, idnEndIf, idnUnknown, EpIf(2, 1), EpNil)
|
||||||
|
]);
|
||||||
|
CheckOpenCloseCount(n, 2, 0, 0);
|
||||||
|
CheckOpenCloseCount(n, 3, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
|
SynEdit.TextBetweenPoints[point(14,2),point(1, 3)] := '';
|
||||||
|
|
||||||
|
{%endregion }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FTestTree.DiscardOpeningList(FOpenings);
|
FTestTree.DiscardOpeningList(FOpenings);
|
||||||
FOpenings := nil;
|
FOpenings := nil;
|
||||||
FTestTree.Free;
|
FTestTree.Free;
|
||||||
|
Loading…
Reference in New Issue
Block a user