mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 20:59:12 +02:00
SynEdit: Ifdef Markup: re-request deferred nodes (idnNotInCode)
git-svn-id: trunk@41121 -
This commit is contained in:
parent
50c08f1626
commit
4276260f19
@ -65,7 +65,7 @@ type
|
|||||||
idnNotInCode, // in currently inactive outer IfDef
|
idnNotInCode, // in currently inactive outer IfDef
|
||||||
idnInvalid, // not known for other reasons. Will not ask again
|
idnInvalid, // not known for other reasons. Will not ask again
|
||||||
idnUnknown, // needs requesting
|
idnUnknown, // needs requesting
|
||||||
idnRequested
|
idnRequested // not used
|
||||||
);
|
);
|
||||||
TSynMarkupIfdefNodeState = idnEnabled..idnInvalid;
|
TSynMarkupIfdefNodeState = idnEnabled..idnInvalid;
|
||||||
|
|
||||||
@ -140,6 +140,8 @@ type
|
|||||||
idlValid, // X start/stop positions are ok
|
idlValid, // X start/stop positions are ok
|
||||||
idlHasUnknownNodes, // need requesting
|
idlHasUnknownNodes, // need requesting
|
||||||
idlHasNodesNotInCode,
|
idlHasNodesNotInCode,
|
||||||
|
idlNotInCodeToUnknown, // treat all idnNotInCode nodes as unknown
|
||||||
|
idlNotInCodeToUnknownReq, // Request to set all nested lines to ... during next validate
|
||||||
idlDisposed, // Node is disposed, may be re-used
|
idlDisposed, // Node is disposed, may be re-used
|
||||||
idlInGlobalClear // Skip unlinking Peers
|
idlInGlobalClear // Skip unlinking Peers
|
||||||
);
|
);
|
||||||
@ -596,7 +598,9 @@ begin
|
|||||||
Result := ( (NodeType = idnIfdef) or
|
Result := ( (NodeType = idnIfdef) or
|
||||||
( (NodeType = idnElseIf) and (FOpeningPeerNodeState = idnEnabled) )
|
( (NodeType = idnElseIf) and (FOpeningPeerNodeState = idnEnabled) )
|
||||||
) and
|
) and
|
||||||
(not(FNodeState in [idnEnabled, idnDisabled, idnRequested, idnInvalid]));
|
( (FNodeState in [idnUnknown, idnRequested]) or
|
||||||
|
( (FNodeState = idnNotInCode) and (idlNotInCodeToUnknown in Line.LineFlags) )
|
||||||
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynMarkupHighIfDefEntry.GetNodeState: TSynMarkupIfdefNodeStateEx;
|
function TSynMarkupHighIfDefEntry.GetNodeState: TSynMarkupIfdefNodeStateEx;
|
||||||
@ -634,6 +638,9 @@ begin
|
|||||||
FNodeState := AValue;
|
FNodeState := AValue;
|
||||||
ApplyNodeStateToLine;
|
ApplyNodeStateToLine;
|
||||||
|
|
||||||
|
if AValue = idnEnabled then
|
||||||
|
Line.FLineFlags := Line.FLineFlags + [idlNotInCodeToUnknownReq, idlNotInCodeToUnknown];
|
||||||
|
|
||||||
case NodeType of
|
case NodeType of
|
||||||
idnIfdef, idnElse, idnElseIf: begin
|
idnIfdef, idnElse, idnElseIf: begin
|
||||||
if (ClosingPeer <> nil) then
|
if (ClosingPeer <> nil) then
|
||||||
@ -1947,7 +1954,7 @@ var
|
|||||||
function GetEntry(ALogStart, ALogEnd, ALineOffs: Integer;
|
function GetEntry(ALogStart, ALogEnd, ALineOffs: Integer;
|
||||||
AType: TSynMarkupIfdefNodeType): TSynMarkupHighIfDefEntry;
|
AType: TSynMarkupIfdefNodeType): TSynMarkupHighIfDefEntry;
|
||||||
var
|
var
|
||||||
i, j, k: Integer;
|
i: Integer;
|
||||||
e: TSynMarkupHighIfDefEntry;
|
e: TSynMarkupHighIfDefEntry;
|
||||||
begin
|
begin
|
||||||
if ANodeForLine = nil then begin
|
if ANodeForLine = nil then begin
|
||||||
@ -1966,7 +1973,6 @@ var
|
|||||||
|
|
||||||
// Check if existing node matches
|
// Check if existing node matches
|
||||||
i := NodesAddedCnt;
|
i := NodesAddedCnt;
|
||||||
j := ANodeForLine.Entry[i].StartColumn;
|
|
||||||
while (i < ANodeForLine.EntryCount-1) do begin
|
while (i < ANodeForLine.EntryCount-1) do begin
|
||||||
e := ANodeForLine.Entry[i];
|
e := ANodeForLine.Entry[i];
|
||||||
if e.StartColumn >= ALogStart then
|
if e.StartColumn >= ALogStart then
|
||||||
@ -2147,6 +2153,7 @@ procedure TSynMarkupHighIfDefLinesTree.ValidateRange(AStartLine, AEndLine: Integ
|
|||||||
OuterLines: TLazSynEditNestedFoldsList);
|
OuterLines: TLazSynEditNestedFoldsList);
|
||||||
var
|
var
|
||||||
NestList: TSynMarkupHighIfDefLinesNodeInfoList;
|
NestList: TSynMarkupHighIfDefLinesNodeInfoList;
|
||||||
|
NotInCodeLowLevel: Integer;
|
||||||
|
|
||||||
procedure FixNodePeers(var ANode: TSynMarkupHighIfDefLinesNodeInfo);
|
procedure FixNodePeers(var ANode: TSynMarkupHighIfDefLinesNodeInfo);
|
||||||
begin
|
begin
|
||||||
@ -2156,6 +2163,29 @@ var
|
|||||||
NestList.PushNodeLine(ANode);
|
NestList.PushNodeLine(ANode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ApplyNotInCodeFlagToNode(var ANode: TSynMarkupHighIfDefLinesNodeInfo);
|
||||||
|
begin
|
||||||
|
if Anode.HasNode and (ANode.NestDepthAtNodeStart >= NotInCodeLowLevel) then
|
||||||
|
Include(ANode.Node.FLineFlags, idlNotInCodeToUnknown);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure CheckNodeForAppNotInCodeFlag(var ANode: TSynMarkupHighIfDefLinesNodeInfo);
|
||||||
|
begin
|
||||||
|
if not ANode.HasNode then
|
||||||
|
exit;
|
||||||
|
if idlNotInCodeToUnknownReq in ANode.LineFlags then
|
||||||
|
NotInCodeLowLevel := Min(NotInCodeLowLevel, ANode.NestMinimumDepthAtNode);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure FinishNodeForAppNotInCodeFlag(var ANode: TSynMarkupHighIfDefLinesNodeInfo);
|
||||||
|
begin
|
||||||
|
if not ANode.HasNode then
|
||||||
|
exit;
|
||||||
|
if idlNotInCodeToUnknownReq in ANode.LineFlags then
|
||||||
|
NotInCodeLowLevel := Min(NotInCodeLowLevel, ANode.NestMinimumDepthAtNode);
|
||||||
|
ANode.Node.FLineFlags := ANode.Node.FLineFlags - [idlNotInCodeToUnknown, idlNotInCodeToUnknownReq];
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
NextNode, Node, TmpNode: TSynMarkupHighIfDefLinesNodeInfo;
|
NextNode, Node, TmpNode: TSynMarkupHighIfDefLinesNodeInfo;
|
||||||
i, j, NodeValidTo: Integer;
|
i, j, NodeValidTo: Integer;
|
||||||
@ -2164,15 +2194,18 @@ begin
|
|||||||
XXXCurTree := self; try
|
XXXCurTree := self; try
|
||||||
TmpNode.FTree := Self;
|
TmpNode.FTree := Self;
|
||||||
|
|
||||||
|
NotInCodeLowLevel := MaxInt;
|
||||||
(*** Outer Nesting ***)
|
(*** Outer Nesting ***)
|
||||||
OuterLines.Line := ToIdx(AStartLine);
|
OuterLines.Line := ToIdx(AStartLine);
|
||||||
For i := 0 to OuterLines.Count - 1 do begin
|
For i := 0 to OuterLines.Count - 1 do begin
|
||||||
j := ToPos(OuterLines.NodeLine[i]);
|
j := ToPos(OuterLines.NodeLine[i]);
|
||||||
Node := GetOrInsertNodeAtLine(j);
|
Node := GetOrInsertNodeAtLine(j);
|
||||||
|
ApplyNotInCodeFlagToNode(Node);
|
||||||
Assert(CheckLineForNodes(j), 'CheckLineForNodes(j) : in Outer Nesting');
|
Assert(CheckLineForNodes(j), 'CheckLineForNodes(j) : in Outer Nesting');
|
||||||
MaybeValidateNode(Node);
|
MaybeValidateNode(Node);
|
||||||
// FixNodePeers(Node);
|
// FixNodePeers(Node);
|
||||||
ConnectPeers(Node, NestList, OuterLines);
|
ConnectPeers(Node, NestList, OuterLines);
|
||||||
|
FinishNodeForAppNotInCodeFlag(Node);
|
||||||
NestList.PushNodeLine(Node);
|
NestList.PushNodeLine(Node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2194,7 +2227,10 @@ XXXCurTree := self; try
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
if (NextNode.StartLine <= AEndLine) then begin
|
if (NextNode.StartLine <= AEndLine) then begin
|
||||||
|
CheckNodeForAppNotInCodeFlag(Node);
|
||||||
|
ApplyNotInCodeFlagToNode(NextNode);
|
||||||
MaybeExtendNodeBackward(NextNode, AStartLine);
|
MaybeExtendNodeBackward(NextNode, AStartLine);
|
||||||
|
FinishNodeForAppNotInCodeFlag(NextNode);
|
||||||
if NextNode.StartLine = AStartLine then begin
|
if NextNode.StartLine = AStartLine then begin
|
||||||
Node := NextNode;
|
Node := NextNode;
|
||||||
NextNode := Node.Successor;
|
NextNode := Node.Successor;
|
||||||
@ -2209,6 +2245,7 @@ XXXCurTree := self; try
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
SkipPeers := Node.StartLine < AStartLine; // NO peer info available, if node starts before startline
|
SkipPeers := Node.StartLine < AStartLine; // NO peer info available, if node starts before startline
|
||||||
|
ApplyNotInCodeFlagToNode(Node);
|
||||||
MaybeValidateNode(Node);
|
MaybeValidateNode(Node);
|
||||||
assert((AStartLine >= Node.StartLine) and (AStartLine <= Node.StartLine + Node.ScanEndLine), 'AStartLine is in Node');
|
assert((AStartLine >= Node.StartLine) and (AStartLine <= Node.StartLine + Node.ScanEndLine), 'AStartLine is in Node');
|
||||||
|
|
||||||
@ -2219,10 +2256,12 @@ XXXCurTree := self; try
|
|||||||
(NextNode.StartLine <= AEndLine)
|
(NextNode.StartLine <= AEndLine)
|
||||||
do begin
|
do begin
|
||||||
Assert(Node.IsValid, 'Node.IsValid while "Scan to Endline"');
|
Assert(Node.IsValid, 'Node.IsValid while "Scan to Endline"');
|
||||||
|
|
||||||
if not SkipPeers then
|
if not SkipPeers then
|
||||||
FixNodePeers(Node);
|
FixNodePeers(Node);
|
||||||
SkipPeers := False;
|
SkipPeers := False;
|
||||||
|
FinishNodeForAppNotInCodeFlag(Node);
|
||||||
|
ApplyNotInCodeFlagToNode(NextNode);
|
||||||
|
|
||||||
MaybeValidateNode(NextNode);
|
MaybeValidateNode(NextNode);
|
||||||
NodeValidTo := Node.ValidToLine(NextNode);
|
NodeValidTo := Node.ValidToLine(NextNode);
|
||||||
MaybeExtendNodeBackward(NextNode, NodeValidTo + 1);
|
MaybeExtendNodeBackward(NextNode, NodeValidTo + 1);
|
||||||
@ -2271,6 +2310,7 @@ XXXCurTree := self; try
|
|||||||
assert(Node.HasNode);
|
assert(Node.HasNode);
|
||||||
if not SkipPeers then
|
if not SkipPeers then
|
||||||
FixNodePeers(Node);
|
FixNodePeers(Node);
|
||||||
|
FinishNodeForAppNotInCodeFlag(Node);
|
||||||
|
|
||||||
|
|
||||||
while Node.ScanEndLine < AEndLine do begin
|
while Node.ScanEndLine < AEndLine do begin
|
||||||
@ -2285,6 +2325,19 @@ XXXCurTree := self; try
|
|||||||
end;
|
end;
|
||||||
assert(Node.ScanEndLine >= AEndLine, 'Scan gap has reached AEndLine');
|
assert(Node.ScanEndLine >= AEndLine, 'Scan gap has reached AEndLine');
|
||||||
|
|
||||||
|
// Check for existing nodes nested in NotInCodeLowLevel
|
||||||
|
if NotInCodeLowLevel < MaxInt then begin
|
||||||
|
Node := Node.Successor;
|
||||||
|
while Node.HasNode do begin
|
||||||
|
if Node.NestDepthAtNodeStart >= NotInCodeLowLevel then begin
|
||||||
|
ApplyNotInCodeFlagToNode(Node);
|
||||||
|
MaybeValidateNode(Node);
|
||||||
|
FinishNodeForAppNotInCodeFlag(Node);
|
||||||
|
end;
|
||||||
|
Node := Node.Successor;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
finally XXXCurTree := nil; end;
|
finally XXXCurTree := nil; end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user