SynEdit: Ifdef highlight, more verbose assert.

git-svn-id: trunk@43064 -
This commit is contained in:
martin 2013-10-03 13:35:45 +00:00
parent 82ba28e80b
commit af8af08094

View File

@ -115,6 +115,7 @@ type
procedure SetStateByUser(AValue: Boolean); procedure SetStateByUser(AValue: Boolean);
protected protected
procedure SetNodeType(ANodeType: TSynMarkupIfdefNodeType); procedure SetNodeType(ANodeType: TSynMarkupIfdefNodeType);
function DebugText(Short: Boolean = False): String;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -194,6 +195,7 @@ type
protected protected
procedure AdjustPositionOffset(AnAdjustment: integer); // Caller is responsible for staying between neighbours procedure AdjustPositionOffset(AnAdjustment: integer); // Caller is responsible for staying between neighbours
property NextDispose: TSynSizedDifferentialAVLNode read FParent write FParent; property NextDispose: TSynSizedDifferentialAVLNode read FParent write FParent;
function DebugText: String;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -238,6 +240,7 @@ type
procedure SetScanEndLine(AValue: Integer); procedure SetScanEndLine(AValue: Integer);
procedure SetScanEndOffs(AValue: Integer); procedure SetScanEndOffs(AValue: Integer);
procedure SetStartLine(AValue: Integer); // Caller is responsible for staying between neighbours procedure SetStartLine(AValue: Integer); // Caller is responsible for staying between neighbours
function DebugText: String;
public public
procedure ClearInfo; procedure ClearInfo;
procedure InitForNode(ANode: TSynMarkupHighIfDefLinesNode; ALine: Integer); procedure InitForNode(ANode: TSynMarkupHighIfDefLinesNode; ALine: Integer);
@ -504,6 +507,7 @@ function dbgs(AFlag: TSynMarkupIfDefNodeFlag): String; overload;
function dbgs(AFlags: SynMarkupIfDefNodeFlags): String; overload; function dbgs(AFlags: SynMarkupIfDefNodeFlags): String; overload;
function dbgs(AFlag: TSynMarkupIfdefNodeType): String; overload; function dbgs(AFlag: TSynMarkupIfdefNodeType): String; overload;
function dbgs(AFlag: TSynMarkupIfdefNodeStateEx): String; overload; function dbgs(AFlag: TSynMarkupIfdefNodeStateEx): String; overload;
function dbgs(APeerType: TSynMarkupIfdefPeerType): String; overload;
implementation implementation
@ -588,6 +592,12 @@ begin
WriteStr(Result, AFlag); WriteStr(Result, AFlag);
end; end;
function dbgs(APeerType: TSynMarkupIfdefPeerType): String;
begin
Result := '';
WriteStr(Result, APeerType);
end;
{ TSynEditMarkupIfDefNodes } { TSynEditMarkupIfDefNodes }
function TSynEditMarkupIfDefNodes.GetMarkupInfo: TSynSelectedColor; function TSynEditMarkupIfDefNodes.GetMarkupInfo: TSynSelectedColor;
@ -787,7 +797,7 @@ end;
function TSynMarkupHighIfDefLinesNodeInfoList.GetNode(AIndex: Integer): TSynMarkupHighIfDefLinesNodeInfo; function TSynMarkupHighIfDefLinesNodeInfoList.GetNode(AIndex: Integer): TSynMarkupHighIfDefLinesNodeInfo;
begin begin
Assert((AIndex < Count) and (AIndex >= 0), 'TSynMarkupHighIfDefLinesNodeInfoList.GetNode Index'); Assert((AIndex < Count) and (AIndex >= 0), 'TSynMarkupHighIfDefLinesNodeInfoList.GetNode Index='+IntToStr(AIndex)+' Cnt='+IntToStr(Count));
Result := FNestOpenNodes[AIndex]; Result := FNestOpenNodes[AIndex];
end; end;
@ -811,7 +821,7 @@ end;
procedure TSynMarkupHighIfDefLinesNodeInfoList.SetNode( AIndex: Integer; procedure TSynMarkupHighIfDefLinesNodeInfoList.SetNode( AIndex: Integer;
AValue: TSynMarkupHighIfDefLinesNodeInfo); AValue: TSynMarkupHighIfDefLinesNodeInfo);
begin begin
Assert(( AIndex < Count) and ( AIndex >= 0), 'TSynMarkupHighIfDefLinesNodeInfoList.SetNode Index'); Assert(( AIndex < Count) and ( AIndex >= 0), 'TSynMarkupHighIfDefLinesNodeInfoList.SetNode Index='+IntToStr(AIndex)+' Cnt='+IntToStr(Count));
FNestOpenNodes[ AIndex] := AValue; FNestOpenNodes[ AIndex] := AValue;
end; end;
@ -1029,7 +1039,7 @@ begin
if (ClosingPeer <> nil) then if (ClosingPeer <> nil) then
ClosingPeer.SetOpeningPeerNodeState(NodeState, NodeStateForPeer(ClosingPeer.NodeType)) ClosingPeer.SetOpeningPeerNodeState(NodeState, NodeStateForPeer(ClosingPeer.NodeType))
end; end;
idnCommentedNode: Assert(AValue = idnUnknown, 'SetOpeningPeerNodeState for idnCommentedIfdef not possible'); idnCommentedNode: Assert(AValue = idnUnknown, 'SetOpeningPeerNodeState for idnCommentedIfdef not possible. '+DebugText);
end; end;
end; end;
@ -1041,13 +1051,13 @@ end;
procedure TSynMarkupHighIfDefEntry.SetPeer(APeerType: TSynMarkupIfdefPeerType; procedure TSynMarkupHighIfDefEntry.SetPeer(APeerType: TSynMarkupIfdefPeerType;
ANewPeer: TSynMarkupHighIfDefEntry); ANewPeer: TSynMarkupHighIfDefEntry);
begin begin
assert( ((APeerType=idpOpeningPeer) and (NodeType <> idnIfdef)) OR ((APeerType=idpClosingPeer) and (NodeType <> idnEndIf)), 'Invalid peertype for this node'); assert( ((APeerType=idpOpeningPeer) and (NodeType <> idnIfdef)) OR ((APeerType=idpClosingPeer) and (NodeType <> idnEndIf)), 'Invalid peertype ('+dbgs(APeerType)+') for this node'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
assert((ANewPeer=nil) OR assert((ANewPeer=nil) OR
((APeerType=idpOpeningPeer) and (ANewPeer.NodeType <> idnEndIf)) OR ((APeerType=idpClosingPeer) and (ANewPeer.NodeType <> idnIfdef)) ((APeerType=idpOpeningPeer) and (ANewPeer.NodeType <> idnEndIf)) OR ((APeerType=idpClosingPeer) and (ANewPeer.NodeType <> idnIfdef))
, 'New peer not allowed for peertype'); , 'New peer not allowed for peertype ('+dbgs(APeerType)+') Node:'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
if FPeers[APeerType] = ANewPeer then begin if FPeers[APeerType] = ANewPeer then begin
assert((ANewPeer = nil) or (ANewPeer.GetPeer(ReversePeerType[APeerType]) = self), 'Peer does not point back to self'); assert((ANewPeer = nil) or (ANewPeer.GetPeer(ReversePeerType[APeerType]) = self), 'Peer does not point back to self. Node:'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
assert((NodeType in [idnElse, idnElseIf]) or (FPeers[idpOpeningPeer] = nil) or (FPeers[idpClosingPeer] = nil), 'Only ELSE has 2 peers'); assert((NodeType in [idnElse, idnElseIf]) or (FPeers[idpOpeningPeer] = nil) or (FPeers[idpClosingPeer] = nil), 'Only ELSE has 2 peers. Node:'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
exit; exit;
end; end;
@ -1061,7 +1071,7 @@ begin
end end
else begin else begin
// If new peer is part of another pair, disolve that pair. This may set FPeers[APeerType] = nil, if new pair points to this node // If new peer is part of another pair, disolve that pair. This may set FPeers[APeerType] = nil, if new pair points to this node
assert(ANewPeer.GetPeer(ReversePeerType[APeerType]) <> self, 'New peer points to this, but was not known by this / link is not bidirectional'); assert(ANewPeer.GetPeer(ReversePeerType[APeerType]) <> self, 'New peer points to this, but was not known by this / link is not bidirectional. Node:'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
ANewPeer.ClearPeerField(ReversePeerType[APeerType]); ANewPeer.ClearPeerField(ReversePeerType[APeerType]);
ANewPeer.FPeers[ReversePeerType[APeerType]] := Self; ANewPeer.FPeers[ReversePeerType[APeerType]] := Self;
@ -1072,7 +1082,7 @@ begin
else else
SetOpeningPeerNodeState(FPeers[APeerType].NodeState, FPeers[APeerType].NodeStateForPeer(NodeType)); SetOpeningPeerNodeState(FPeers[APeerType].NodeState, FPeers[APeerType].NodeStateForPeer(NodeType));
end; end;
assert((NodeType in [idnElse, idnElseIf]) or (FPeers[idpOpeningPeer] = nil) or (FPeers[idpClosingPeer] = nil), 'Only ELSE has 2 peers'); assert((NodeType in [idnElse, idnElseIf]) or (FPeers[idpOpeningPeer] = nil) or (FPeers[idpClosingPeer] = nil), 'Only ELSE has 2 peers. Node:'+DebugText+' NEWNODE='+ANewPeer.DebugText(True));
end; end;
procedure TSynMarkupHighIfDefEntry.MakeDisabled; procedure TSynMarkupHighIfDefEntry.MakeDisabled;
@ -1133,7 +1143,7 @@ end;
procedure TSynMarkupHighIfDefEntry.ClearPeerField(APeerType: TSynMarkupIfdefPeerType); procedure TSynMarkupHighIfDefEntry.ClearPeerField(APeerType: TSynMarkupIfdefPeerType);
begin begin
if FPeers[APeerType] = nil then exit; if FPeers[APeerType] = nil then exit;
assert(FPeers[APeerType].GetPeer(ReversePeerType[APeerType]) = self, 'ClearPeerField: Peer does not point back to self'); assert(FPeers[APeerType].GetPeer(ReversePeerType[APeerType]) = self, 'ClearPeerField('+dbgs(APeerType)+'): Peer does not point back to self. '+DebugText);
if APeerType = idpClosingPeer then if APeerType = idpClosingPeer then
FPeers[APeerType].SetOpeningPeerNodeState(idnUnknown, idnUnknown) FPeers[APeerType].SetOpeningPeerNodeState(idnUnknown, idnUnknown)
@ -1187,7 +1197,7 @@ procedure TSynMarkupHighIfDefEntry.SetStartColumn(AValue: Integer);
begin begin
if FStartColumn = AValue then Exit; if FStartColumn = AValue then Exit;
FStartColumn := AValue; FStartColumn := AValue;
Assert(AValue>0, 'Startcol negative'); Assert(AValue>0, 'Startcol negative'+DebugText);
end; end;
procedure TSynMarkupHighIfDefEntry.SetStateByUser(AValue: Boolean); procedure TSynMarkupHighIfDefEntry.SetStateByUser(AValue: Boolean);
@ -1206,6 +1216,26 @@ begin
ApplyNodeStateToLine; ApplyNodeStateToLine;
end; end;
function TSynMarkupHighIfDefEntry.DebugText(Short: Boolean): String;
begin
If Self = nil then
exit('NODE IS NIL');
Result := Format('Line=%d NType=%s State=%s OpenState=%s Flags=%s ' +
' StartCol=%d EndCol=%d',
[FLine, dbgs(FNodeType), dbgs(FNodeState), dbgs(FOpeningPeerNodeState) ,
dbgs(FNodeFlags), FStartColumn, FEndColumn]
);
if Short or (FPeers[idpOpeningPeer] = nil) then
Result := Result + ' OpenPeer='+dbgs(FPeers[idpOpeningPeer])
else
Result := Result + ' OpenPeer='+FPeers[idpOpeningPeer].DebugText(True);
if Short or (FPeers[idpClosingPeer] = nil) then
Result := Result + ' ClosePeer='+dbgs(FPeers[idpClosingPeer])
else
Result := Result + ' OpenPeer='+FPeers[idpClosingPeer].DebugText(True);
end;
function TSynMarkupHighIfDefEntry.NodeStateForPeer(APeerType: TSynMarkupIfdefNodeType): TSynMarkupIfdefNodeStateEx; function TSynMarkupHighIfDefEntry.NodeStateForPeer(APeerType: TSynMarkupIfdefNodeType): TSynMarkupIfdefNodeStateEx;
const const
NodeStateMap: array [Boolean] of TSynMarkupIfdefNodeStateEx = NodeStateMap: array [Boolean] of TSynMarkupIfdefNodeStateEx =
@ -1214,7 +1244,7 @@ const
(idnTempDisabled, idnTempEnabled); // False, True (idnTempDisabled, idnTempEnabled); // False, True
begin begin
Result := idnUnknown; Result := idnUnknown;
Assert((NodeType <> APeerType) or (NodeType = idnElseIf), 'NodeStateForPeer: NodeType <> APeerType'); Assert((NodeType <> APeerType) or (NodeType = idnElseIf), 'NodeStateForPeer: NodeType <> APeerType'+dbgs(APeerType)+' Node:'+DebugText);
case NodeState of case NodeState of
idnEnabled: begin idnEnabled: begin
case NodeType of case NodeType of
@ -1328,8 +1358,8 @@ end;
procedure TSynMarkupHighIfDefLinesNode.AdjustPositionOffset(AnAdjustment: integer); procedure TSynMarkupHighIfDefLinesNode.AdjustPositionOffset(AnAdjustment: integer);
begin begin
Assert((Successor = nil) or (GetPosition + AnAdjustment < Successor.GetPosition), 'GetPosition + AnAdjustment < Successor.GetPosition'); Assert((Successor = nil) or (GetPosition + AnAdjustment < Successor.GetPosition), 'GetPosition + AnAdjustment < Successor.GetPosition '+DebugText);
Assert((Precessor = nil) or (GetPosition + AnAdjustment > Precessor.GetPosition), 'GetPosition + AnAdjustment > Precessor.GetPosition'); Assert((Precessor = nil) or (GetPosition + AnAdjustment > Precessor.GetPosition), 'GetPosition + AnAdjustment > Precessor.GetPosition '+DebugText);
FPositionOffset := FPositionOffset + AnAdjustment; FPositionOffset := FPositionOffset + AnAdjustment;
if FLeft <> nil then if FLeft <> nil then
TSynMarkupHighIfDefLinesNode(FLeft).FPositionOffset := TSynMarkupHighIfDefLinesNode(FLeft).FPositionOffset :=
@ -1339,6 +1369,17 @@ begin
TSynMarkupHighIfDefLinesNode(FRight).FPositionOffset - AnAdjustment; TSynMarkupHighIfDefLinesNode(FRight).FPositionOffset - AnAdjustment;
end; end;
function TSynMarkupHighIfDefLinesNode.DebugText: String;
begin
if self = nil then
exit('NODE IN NIL');
Result := Format('Pos=%d Flags=%s ECnt=%d LastEOffs=%d ScanEndOffs=%d ' +
' DisEOpen=%d DisEClose=%d',
[GetPosition, dbgs(FLineFlags), FEntryCount, FLastEntryEndLineOffs,
FScanEndOffs, FDisabledEntryOpenCount, FDisabledEntryCloseCount
]);
end;
constructor TSynMarkupHighIfDefLinesNode.Create; constructor TSynMarkupHighIfDefLinesNode.Create;
begin begin
FSize := 1; // used for index FSize := 1; // used for index
@ -1356,7 +1397,7 @@ begin
FLineFlags := [idlDisposed] + FLineFlags * [idlInGlobalClear]; FLineFlags := [idlDisposed] + FLineFlags * [idlInGlobalClear];
while EntryCount > 0 do while EntryCount > 0 do
DeletEntry(EntryCount-1, True); DeletEntry(EntryCount-1, True);
assert((idlInGlobalClear in LineFlags) or ((FDisabledEntryOpenCount =0) and (FDisabledEntryCloseCount = 0)), 'no close count left over'); assert((idlInGlobalClear in LineFlags) or ((FDisabledEntryOpenCount =0) and (FDisabledEntryCloseCount = 0)), 'no close count left over'+DebugText);
FDisabledEntryOpenCount := 0; FDisabledEntryOpenCount := 0;
FDisabledEntryCloseCount := 0; FDisabledEntryCloseCount := 0;
end; end;
@ -1367,11 +1408,11 @@ var
begin begin
c := EntryCount; c := EntryCount;
EntryCount := c + 1; EntryCount := c + 1;
assert(FEntries[c]=nil, 'FEntries[c]=nil'); assert(FEntries[c]=nil, 'FEntries[c]=nil Aindex='+IntToStr(AIndex)+' '+DebugText);
Result := TSynMarkupHighIfDefEntry.Create; Result := TSynMarkupHighIfDefEntry.Create;
Result.Line := Self; Result.Line := Self;
if (AIndex >= 0) then begin if (AIndex >= 0) then begin
Assert(AIndex <= c, 'Add node index <= count'); Assert(AIndex <= c, 'Add node index ('+IntToStr(AIndex)+') <= count c='+IntToStr(c)+' '+DebugText);
while c > AIndex do begin while c > AIndex do begin
FEntries[c] := FEntries[c - 1]; FEntries[c] := FEntries[c - 1];
dec(c); dec(c);
@ -1382,7 +1423,7 @@ end;
procedure TSynMarkupHighIfDefLinesNode.DeletEntry(AIndex: Integer; AFree: Boolean); procedure TSynMarkupHighIfDefLinesNode.DeletEntry(AIndex: Integer; AFree: Boolean);
begin begin
Assert((AIndex >= 0) and (AIndex < FEntryCount), 'DeletEntry'); Assert((AIndex >= 0) and (AIndex < FEntryCount), 'DeletEntry Aindex='+IntToStr(AIndex)+' '+DebugText);
if AFree then if AFree then
FEntries[AIndex].Free FEntries[AIndex].Free
else else
@ -1411,12 +1452,21 @@ end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetStartLine(AValue: Integer); procedure TSynMarkupHighIfDefLinesNodeInfo.SetStartLine(AValue: Integer);
begin begin
Assert(FNode <> nil, 'TSynMarkupHighIfDefLinesNodeInfo.SetStartLine has node'); Assert(FNode <> nil, 'TSynMarkupHighIfDefLinesNodeInfo.SetStartLine has node '+DebugText);
if FStartLine = AValue then Exit; if FStartLine = AValue then Exit;
FNode.AdjustPositionOffset(AValue - FStartLine); FNode.AdjustPositionOffset(AValue - FStartLine);
FStartLine := AValue; FStartLine := AValue;
end; end;
function TSynMarkupHighIfDefLinesNodeInfo.DebugText: String;
begin
Result := ' Startline='+IntToStr(FStartLine);
if FNode <> nil then
Result := Result + ' '+FNode.DebugText
else
Result := Result + ' Node is nil';
end;
function TSynMarkupHighIfDefLinesNodeInfo.GetLineFlags: SynMarkupIfDefLineFlags; function TSynMarkupHighIfDefLinesNodeInfo.GetLineFlags: SynMarkupIfDefLineFlags;
begin begin
if not HasNode then if not HasNode then
@ -1440,7 +1490,7 @@ end;
function TSynMarkupHighIfDefLinesNodeInfo.GetEntry(AIndex: Integer): TSynMarkupHighIfDefEntry; function TSynMarkupHighIfDefLinesNodeInfo.GetEntry(AIndex: Integer): TSynMarkupHighIfDefEntry;
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.GetEntry'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.GetEntry'+DebugText);
Result := FNode.Entry[AIndex]; Result := FNode.Entry[AIndex];
end; end;
@ -1471,31 +1521,31 @@ end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetEntry(AIndex: Integer; procedure TSynMarkupHighIfDefLinesNodeInfo.SetEntry(AIndex: Integer;
AValue: TSynMarkupHighIfDefEntry); AValue: TSynMarkupHighIfDefEntry);
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEntry'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEntry'+DebugText);
FNode.Entry[AIndex] := AValue; FNode.Entry[AIndex] := AValue;
end; end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetEntryCount(AValue: Integer); procedure TSynMarkupHighIfDefLinesNodeInfo.SetEntryCount(AValue: Integer);
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEntryCount'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEntryCount'+DebugText);
FNode.EntryCount := AValue; FNode.EntryCount := AValue;
end; end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetLastEntryEndLineOffs(AValue: Integer); procedure TSynMarkupHighIfDefLinesNodeInfo.SetLastEntryEndLineOffs(AValue: Integer);
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEndLineOffs'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetEndLineOffs'+DebugText);
FNode.LastEntryEndLineOffs := AValue; FNode.LastEntryEndLineOffs := AValue;
end; end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetScanEndLine(AValue: Integer); procedure TSynMarkupHighIfDefLinesNodeInfo.SetScanEndLine(AValue: Integer);
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetScanEndLine'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetScanEndLine'+DebugText);
ScanEndOffs := AValue - StartLine; ScanEndOffs := AValue - StartLine;
end; end;
procedure TSynMarkupHighIfDefLinesNodeInfo.SetScanEndOffs(AValue: Integer); procedure TSynMarkupHighIfDefLinesNodeInfo.SetScanEndOffs(AValue: Integer);
begin begin
Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetScanEndOffs'); Assert(HasNode, 'HasNode for TSynMarkupHighIfDefLinesNodeInfo.SetScanEndOffs'+DebugText);
FNode.ScanEndOffs := AValue; FNode.ScanEndOffs := AValue;
end; end;
@ -1570,7 +1620,7 @@ end;
function TSynMarkupHighIfDefLinesNodeInfo.NestMinimumDepthAtNode: Integer; function TSynMarkupHighIfDefLinesNodeInfo.NestMinimumDepthAtNode: Integer;
begin begin
assert(FTree <> nil, 'NestWinimumDepthAtNode has tree'); assert(FTree <> nil, 'NestWinimumDepthAtNode has tree'+DebugText);
if FCacheNestMinimum < 0 then if FCacheNestMinimum < 0 then
FCacheNestMinimum := FCacheNestMinimum :=
FTree.GetHighLighterWithLines.FoldBlockMinLevel(ToIdx(StartLine), FOLDGROUP_IFDEF, FTree.GetHighLighterWithLines.FoldBlockMinLevel(ToIdx(StartLine), FOLDGROUP_IFDEF,
@ -1580,7 +1630,7 @@ end;
function TSynMarkupHighIfDefLinesNodeInfo.NestDepthAtNodeStart: Integer; function TSynMarkupHighIfDefLinesNodeInfo.NestDepthAtNodeStart: Integer;
begin begin
assert(FTree <> nil, 'NestDepthAtNodeStart has tree'); assert(FTree <> nil, 'NestDepthAtNodeStart has tree'+DebugText);
if FCacheNestStart < 0 then if FCacheNestStart < 0 then
FCacheNestStart := FCacheNestStart :=
FTree.GetHighLighterWithLines.FoldBlockEndLevel(ToIdx(StartLine)-1, FOLDGROUP_IFDEF, FTree.GetHighLighterWithLines.FoldBlockEndLevel(ToIdx(StartLine)-1, FOLDGROUP_IFDEF,
@ -1590,7 +1640,7 @@ end;
function TSynMarkupHighIfDefLinesNodeInfo.NestDepthAtNodeEnd: Integer; function TSynMarkupHighIfDefLinesNodeInfo.NestDepthAtNodeEnd: Integer;
begin begin
assert(FTree <> nil, 'NestDepthAtNodeEnd has tree'); assert(FTree <> nil, 'NestDepthAtNodeEnd has tree'+DebugText);
if FCacheNestEnd < 0 then if FCacheNestEnd < 0 then
FCacheNestEnd := FCacheNestEnd :=
FTree.GetHighLighterWithLines.FoldBlockEndLevel(ToIdx(StartLine), FOLDGROUP_IFDEF, FTree.GetHighLighterWithLines.FoldBlockEndLevel(ToIdx(StartLine), FOLDGROUP_IFDEF,
@ -1607,7 +1657,7 @@ begin
if ScanEndOffs >= 0 then begin if ScanEndOffs >= 0 then begin
Result := StartLine + ScanEndOffs; Result := StartLine + ScanEndOffs;
assert((not ANextNode.HasNode) or (Result<ANextNode.StartLine), '(ANextNode=nil) or (Result<ANextNode.StartLine)'); assert((not ANextNode.HasNode) or (Result<ANextNode.StartLine), '(ANextNode=nil) or (Result<ANextNode.StartLine)'+DebugText);
end end
else else
if ANextNode.HasNode then if ANextNode.HasNode then
@ -1714,7 +1764,7 @@ procedure TSynMarkupHighIfDefLinesTree.MaybeExtendNodeBackward(var ANode: TSynMa
var var
Line: Integer; Line: Integer;
begin begin
Assert(ANode.HasNode, 'ANode.HasNode in MaybeExtendNodeDownwards'); Assert(ANode.HasNode, 'ANode.HasNode in MaybeExtendNodeDownwards'+ANode.DebugText+ ' Stopline='+IntToStr(AStopAtLine));
MaybeValidateNode(ANode); MaybeValidateNode(ANode);
if (ANode.EntryCount = 0) then begin if (ANode.EntryCount = 0) then begin
// ANode is a Scan-Start-Marker and may be extended downto StartLine // ANode is a Scan-Start-Marker and may be extended downto StartLine
@ -2588,7 +2638,7 @@ begin
LogStartX := ToPos(fn.LogXStart)-1; // LogXStart is at "$", we need "{" LogStartX := ToPos(fn.LogXStart)-1; // LogXStart is at "$", we need "{"
if (LogStartX < 1) or (LogStartX > LineLen) then begin if (LogStartX < 1) or (LogStartX > LineLen) then begin
assert(false, '(LogStartX < 1) or (LogStartX > LineLen) '); assert(false, '(LogStartX < 1) or (LogStartX > LineLen) LogX='+IntToStr(LogStartX)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
continue; continue;
end; end;
// assert(LogStartX >= LogEndX, 'ifdef xpos found before end of previous ifdef'); // assert(LogStartX >= LogEndX, 'ifdef xpos found before end of previous ifdef');
@ -2598,39 +2648,39 @@ begin
case TheDict.GetMatchAtChar(@LineTextLower[LogStartX], LineLen + 1 - LogStartX) of case TheDict.GetMatchAtChar(@LineTextLower[LogStartX], LineLen + 1 - LogStartX) of
1: // ifdef 1: // ifdef
begin begin
assert(sfaOpen in fn.FoldAction, 'sfaOpen in fn.FoldAction'); assert(sfaOpen in fn.FoldAction, 'sfaOpen in fn.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
NType := idnIfdef; NType := idnIfdef;
//inc(RelNestDepthNext); //inc(RelNestDepthNext);
end; end;
2: // else 2: // else
begin begin
assert(i < c, '$ELSE i < c'); assert(i < c, '$ELSE i < c LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
inc(i); inc(i);
fn2 := FoldNodeInfoList[i]; fn2 := FoldNodeInfoList[i];
assert(sfaClose in fn.FoldAction, 'sfaClose in fn.FoldAction'); assert(sfaClose in fn.FoldAction, 'sfaClose in fn.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
assert(sfaOpen in fn2.FoldAction, 'sfaOpen in fn2.FoldAction'); assert(sfaOpen in fn2.FoldAction, 'sfaOpen in fn2.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
assert(fn.LogXStart = fn2.LogXStart, 'sfaOpen in fn2.FoldAction'); assert(fn.LogXStart = fn2.LogXStart, 'sfaOpen in fn2.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
NType := idnElse; NType := idnElse;
end; end;
3: // endif 3: // endif
begin begin
assert(sfaClose in fn.FoldAction, 'sfaOpen in fn.FoldAction'); assert(sfaClose in fn.FoldAction, 'sfaOpen in fn.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
NType := idnEndIf; NType := idnEndIf;
//dec(RelNestDepthNext); //dec(RelNestDepthNext);
end; end;
4: // ElseIf 4: // ElseIf
begin begin
assert(i < c, '$ELSE i < c'); assert(i < c, '$ELSE i < c LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
inc(i); inc(i);
fn2 := FoldNodeInfoList[i]; fn2 := FoldNodeInfoList[i];
assert(sfaClose in fn.FoldAction, 'sfaClose in fn.FoldAction'); assert(sfaClose in fn.FoldAction, 'sfaClose in fn.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
assert(sfaOpen in fn2.FoldAction, 'sfaOpen in fn2.FoldAction'); assert(sfaOpen in fn2.FoldAction, 'sfaOpen in fn2.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
assert(fn.LogXStart = fn2.LogXStart, 'sfaOpen in fn2.FoldAction'); assert(fn.LogXStart = fn2.LogXStart, 'sfaOpen in fn2.FoldAction LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
NType := idnElseIf; NType := idnElseIf;
end; end;
else else
begin begin
assert(false, 'not found ifdef'); assert(false, 'not found ifdef LogX='+IntToStr(LogStartX)+ ' FldAct='+dbgs(fn.FoldAction)+ ' Line='+IntToStr(ALine)+' Txt='+LineTextLower);
continue; continue;
end; end;
end; end;