codetools: identifier completion: when a tools deletes nodes, clear list only if tool is used

git-svn-id: trunk@31230 -
This commit is contained in:
mattias 2011-06-14 19:37:45 +00:00
parent c15760ec41
commit f278799dc0

View File

@ -174,7 +174,10 @@ type
property Node: TCodeTreeNode read GetNode write SetNode; property Node: TCodeTreeNode read GetNode write SetNode;
end; end;
TIdentifierListFlag = (ilfFilteredListNeedsUpdate); TIdentifierListFlag = (
ilfFilteredListNeedsUpdate,
ilfUsedToolsNeedsUpdate
);
TIdentifierListFlags = set of TIdentifierListFlag; TIdentifierListFlags = set of TIdentifierListFlag;
TIdentifierListContextFlag = ( TIdentifierListContextFlag = (
@ -205,6 +208,7 @@ type
FHistory: TIdentifierHistoryList; FHistory: TIdentifierHistoryList;
FItems: TAVLTree; // tree of TIdentifierListItem (completely sorted) FItems: TAVLTree; // tree of TIdentifierListItem (completely sorted)
FIdentView: TAVLTree; // tree of TIdentHistListItem sorted for identifiers FIdentView: TAVLTree; // tree of TIdentHistListItem sorted for identifiers
FUsedTools: TAVLTree; // tree of TFindDeclarationTool
FIdentSearchItem: TIdentifierListSearchItem; FIdentSearchItem: TIdentifierListSearchItem;
FPrefix: string; FPrefix: string;
FStartContext: TFindContext; FStartContext: TFindContext;
@ -657,6 +661,7 @@ end;
destructor TIdentifierList.Destroy; destructor TIdentifierList.Destroy;
begin begin
Clear; Clear;
FreeAndNil(FUsedTools);
FreeAndNil(FItems); FreeAndNil(FItems);
FreeAndNil(FIdentView); FreeAndNil(FIdentView);
FreeAndNil(FFilteredList); FreeAndNil(FFilteredList);
@ -684,7 +689,9 @@ begin
FCreatedIdentifiers.Clear; FCreatedIdentifiers.Clear;
FItems.FreeAndClear; FItems.FreeAndClear;
FIdentView.Clear; FIdentView.Clear;
Include(FFlags,ilfFilteredListNeedsUpdate); if FUsedTools<>nil then
FUsedTools.Clear;
FFlags:=FFlags+[ilfFilteredListNeedsUpdate,ilfUsedToolsNeedsUpdate];
end; end;
procedure TIdentifierList.Add(NewItem: TIdentifierListItem); procedure TIdentifierList.Add(NewItem: TIdentifierListItem);
@ -697,7 +704,7 @@ begin
NewItem.HistoryIndex:=History.GetHistoryIndex(NewItem); NewItem.HistoryIndex:=History.GetHistoryIndex(NewItem);
FItems.Add(NewItem); FItems.Add(NewItem);
FIdentView.Add(NewItem); FIdentView.Add(NewItem);
Include(FFlags,ilfFilteredListNeedsUpdate); FFlags:=FFlags+[ilfFilteredListNeedsUpdate,ilfUsedToolsNeedsUpdate];
end else begin end else begin
// redefined identifier -> ignore // redefined identifier -> ignore
//DebugLn('TIdentifierList.Add redefined: ',NewItem.AsString); //DebugLn('TIdentifierList.Add redefined: ',NewItem.AsString);
@ -823,8 +830,28 @@ end;
procedure TIdentifierList.ToolTreeNodesDeleting(Tool: TCustomCodeTool; procedure TIdentifierList.ToolTreeNodesDeleting(Tool: TCustomCodeTool;
NodesDeleting: boolean); NodesDeleting: boolean);
var
ItemNode: TAVLTreeNode;
Item: TIdentifierListItem;
begin begin
if Tool=nil then exit;
if FIdentView.Count=0 then exit; if FIdentView.Count=0 then exit;
if (FUsedTools=nil) or (ilfUsedToolsNeedsUpdate in FFlags) then begin
Exclude(FFlags,ilfUsedToolsNeedsUpdate);
// create list of all used tools
if FUsedTools=nil then
FUsedTools:=TAVLTree.Create
else
FUsedTools.Clear;
ItemNode:=FItems.FindLowest;
while ItemNode<>nil do begin
Item:=TIdentifierListItem(ItemNode.Data);
if (Item.Tool<>nil) and (FUsedTools.Find(Item.Tool)=nil) then
FUsedTools.Add(Item.Tool);
ItemNode:=FItems.FindSuccessor(ItemNode);
end;
end;
if FUsedTools.Find(Tool)=nil then exit;
Clear; Clear;
end; end;