IDE: find overloads: show start identifier in dialog

git-svn-id: trunk@19778 -
This commit is contained in:
mattias 2009-05-03 04:00:35 +00:00
parent 28a1b83734
commit dfe1e5a3cf
3 changed files with 79 additions and 8 deletions

View File

@ -2528,6 +2528,7 @@ end;
procedure TCustomCodeTool.DoDeleteNodes;
begin
if Tree.Root<>nil then begin
//DebugLn(['TCustomCodeTool.DoDeleteNodes ',MainFilename]);
// first notify, so that references could be deleted clean
IncreaseTreeChangeStep(true);
// then change

View File

@ -76,6 +76,7 @@ type
FShortestNodes: TAVLTree;
FStartCode: TCodeBuffer;
FStartCodeNode: TCodeTreeNode;
FStartTool: TFindDeclarationTool;
FStartX: integer;
FStartY: integer;
function AddContext(Tool: TFindDeclarationTool;
@ -97,6 +98,7 @@ type
property StartCode: TCodeBuffer read FStartCode;
property StartX: integer read FStartX;
property StartY: integer read FStartY;
property StartTool: TFindDeclarationTool read FStartTool;
property StartCodeNode: TCodeTreeNode read FStartCodeNode;
property OnGetCodeToolForBuffer: TOnGetCodeToolForBuffer
read FOnGetCodeToolForBuffer write FOnGetCodeToolForBuffer;
@ -272,7 +274,6 @@ end;
function TDeclarationOverloadsGraph.Init(Code: TCodeBuffer; X, Y: integer
): Boolean;
var
Tool: TFindDeclarationTool;
CleanPos: integer;
begin
Result:=false;
@ -280,18 +281,18 @@ begin
FStartX:=X;
FStartY:=Y;
Tool:=OnGetCodeToolForBuffer(Self,Code,true);
if Tool.CaretToCleanPos(CodeXYPosition(X,Y,Code),CleanPos)<>0 then begin
fStartTool:=OnGetCodeToolForBuffer(Self,Code,true);
if fStartTool.CaretToCleanPos(CodeXYPosition(X,Y,Code),CleanPos)<>0 then begin
DebugLn(['TDeclarationOverloadsGraph.Init Tool.CaretToCleanPos failed']);
exit(false);
end;
fStartCodeNode:=Tool.FindDeepestNodeAtPos(CleanPos,true);
//DebugLn(['TDeclarationOverloadsGraph.Init Add start context']);
AddContext(Tool,StartCodeNode);
fStartCodeNode:=fStartTool.FindDeepestNodeAtPos(CleanPos,true);
DebugLn(['TDeclarationOverloadsGraph.Init Add start context ',FStartTool.MainFilename,' ',FStartCodeNode.DescAsString,' ',dbgstr(copy(FStartTool.Src,FStartCodeNode.StartPos,20))]);
AddContext(fStartTool,StartCodeNode);
fIdentifier:='';
if fStartCodeNode.Desc in AllIdentifierDefinitions+[ctnEnumIdentifier] then
fIdentifier:=GetIdentifier(@Tool.Src[fStartCodeNode.StartPos]);
fIdentifier:=GetIdentifier(@fStartTool.Src[fStartCodeNode.StartPos]);
Result:=true;
end;

View File

@ -33,7 +33,8 @@ uses
Classes, SysUtils, LCLProc,FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, ExtCtrls, StdCtrls, Buttons, ButtonPanel, ComCtrls, AvgLvlTree,
// codetools
CodeTree, CodeCache, CodeAtom, CodeToolManager, CodeGraph, FindOverloads,
FindDeclarationTool, PascalParserTool, CodeTree, CodeCache, CodeAtom,
CodeToolManager, CodeGraph, FindOverloads,
// IDE
LazIDEIntf, ProjectIntf, SrcEditorIntf, IDEProcs;
@ -122,10 +123,12 @@ type
procedure OnIdle(Sender: TObject; var Done: Boolean);
private
FIdleConnected: boolean;
fCurTreeViewComplete: boolean;
fWorker: TFindOverloadsWorker;
procedure SetIdleConnected(const AValue: boolean);
procedure UpdateProgress;
procedure StopWorking;
procedure UpdateCurTreeView;
public
property Worker: TFindOverloadsWorker read fWorker;
property IdleConnected: boolean read FIdleConnected write SetIdleConnected;
@ -226,6 +229,8 @@ begin
if Done then
IdleConnected:=false;
UpdateProgress;
if not fCurTreeViewComplete then
UpdateCurTreeView;
end;
procedure TFindOverloadsDialog.SetIdleConnected(const AValue: boolean);
@ -260,6 +265,70 @@ begin
Worker.StopSearching;
end;
procedure TFindOverloadsDialog.UpdateCurTreeView;
var
s: String;
Node: TCodeTreeNode;
Tool: TFindDeclarationTool;
ParentNode: TCodeTreeNode;
begin
fCurTreeViewComplete:=true;
CurTreeView.BeginUpdate;
CurTreeView.Items.Clear;
Node:=Worker.Graph.StartCodeNode;
Tool:=Worker.Graph.StartTool;
if Node<>nil then begin
DebugLn(['TFindOverloadsDialog.UpdateCurTreeView ',Node.DescAsString,' ',dbgstr(copy(Tool.Src,Node.StartPos,20))]);
// unit name
s:=Tool.GetSourceName(false)+': ';
// keyword
case Node.Desc of
ctnEnumIdentifier: s:=s+'enum';
ctnVarDefinition: s:=s+'var';
ctnConstDefinition: s:=s+'const';
ctnTypeDefinition: s:=s+'type';
ctnGenericType: s:=s+'generic';
ctnProperty: s:=s+'property';
ctnProcedure: s:=s+'procedure';
ctnUseUnit: s:=s+'uses';
ctnUnit: s:=s+'unit';
ctnProgram: s:=s+'program';
ctnPackage: s:=s+'package';
ctnLibrary: s:=s+'library';
end;
s:=s+' ';
// context
if Node.Desc<>ctnEnumIdentifier then
begin
ParentNode:=Node.Parent;
while ParentNode<>nil do begin
case ParentNode.Desc of
ctnTypeDefinition,ctnGenericType:
s:=s+Tool.ExtractDefinitionName(Node)+'.';
end;
ParentNode:=ParentNode.Parent;
end;
end;
// name
case Node.Desc of
ctnEnumIdentifier, ctnTypeDefinition, ctnConstDefinition, ctnVarDefinition,
ctnGenericType:
s:=s+Tool.ExtractDefinitionName(Node);
ctnProperty:
s:=s+Tool.ExtractPropName(Node,false);
ctnProcedure:
s:=s+Tool.ExtractProcName(Node,[phpWithoutClassName,phpCommentsToSpace]);
ctnUseUnit:
s:=s+Tool.ExtractNode(Node,[phpCommentsToSpace]);
ctnUnit,ctnProgram,ctnPackage,ctnLibrary:
s:=s+Tool.GetSourceName(false);
end;
// add node
CurTreeView.Items.Add(nil,s);
end;
CurTreeView.EndUpdate;
end;
{ TFOWFile }
procedure TFOWFile.SetCode(const AValue: TCodeBuffer);