IDE: find overloads: find main declaration

git-svn-id: trunk@19751 -
This commit is contained in:
mattias 2009-05-01 19:41:26 +00:00
parent c62f7d1f75
commit a927537fcb
4 changed files with 53 additions and 23 deletions

View File

@ -2116,19 +2116,24 @@ end;
function TCodeToolManager.GatherOverloads(Code: TCodeBuffer; X, Y: integer; out
Graph: TDeclarationOverloadsGraph): boolean;
var
CursorPos: TCodeXYPosition;
NewCode: TCodeBuffer;
NewX, NewY, NewTopLine: integer;
begin
Graph:=nil;
{$IFDEF CTDEBUG}
DebugLn('TCodeToolManager.GatherOverloads A ',Code.Filename);
{$ENDIF}
Result:=false;
Graph:=nil;
if not FindMainDeclaration(Code,X,Y,NewCode,NewX,NewY,NewTopLine)
then begin
DebugLn('TCodeToolManager.GatherOverloads unable to FindMainDeclaration ',Code.Filename,' x=',dbgs(x),' y=',dbgs(y));
exit;
end;
if NewTopLine=0 then ;
if not InitCurCodeTool(Code) then exit;
CursorPos.X:=X;
CursorPos.Y:=Y;
CursorPos.Code:=Code;
try
Graph:=TDeclarationOverloadsGraph.Create;
Result:=Graph.Init(NewCode,NewX,NewY);
except
on e: Exception do Result:=HandleException(e);
end;

View File

@ -30,7 +30,7 @@ unit FindOverloads;
interface
uses
Classes, SysUtils, CodeGraph;
Classes, SysUtils, CodeGraph, CodeCache;
type
TOverloadsGraphNode = class(TCodeGraphNode)
@ -55,12 +55,19 @@ type
private
FGraph: TCodeGraph;
FIdentifier: string;
FStartCode: TCodeBuffer;
FStartX: integer;
FStartY: integer;
public
constructor Create;
destructor Destroy; override;
procedure Clear;
function Init(Code: TCodeBuffer; X,Y: integer): Boolean;
property Identifier: string read FIdentifier;
property Graph: TCodeGraph read FGraph;
property StartCode: TCodeBuffer read FStartCode;
property StartX: integer read FStartX;
property StartY: integer read FStartY;
end;
implementation
@ -84,5 +91,18 @@ begin
end;
function TDeclarationOverloadsGraph.Init(Code: TCodeBuffer; X, Y: integer
): Boolean;
begin
Result:=false;
FStartCode:=Code;
FStartX:=X;
FStartY:=Y;
Result:=true;
end;
end.

View File

@ -83,13 +83,12 @@ type
procedure ScanSomeFiles;
procedure ScanFile(AFile: TFOWFile);
public
StartCodeXY: TCodeXYPosition;
Scopes: TFindOverloadsScopes;
CompletedScopes: TFindOverloadsScopes;
Graph: TDeclarationOverloadsGraph;
constructor Create;
destructor Destroy; override;
procedure Clear;
procedure SetStartPosition(Code: TCodeBuffer; X, Y: integer);
procedure Work;
function Done: boolean;
procedure StopSearching;
@ -154,13 +153,22 @@ function ShowFindOverloadsDialog(Code: TCodeBuffer; X, Y: integer
): TModalResult;
var
FindOverloadsDialog: TFindOverloadsDialog;
Graph: TDeclarationOverloadsGraph;
begin
FindOverloadsDialog:=TFindOverloadsDialog.Create(nil);
Graph:=nil;
FindOverloadsDialog:=nil;
try
FindOverloadsDialog.Worker.SetStartPosition(Code,X,Y);
if not CodeToolBoss.GatherOverloads(Code,X,Y,Graph) then begin
LazarusIDE.DoJumpToCodeToolBossError;
exit(mrCancel);
end;
DebugLn(['ShowFindOverloadsDialog ',Graph.StartCode.Filename,' ',Graph.StartX,',',Graph.StartY]);
FindOverloadsDialog:=TFindOverloadsDialog.Create(nil);
FindOverloadsDialog.Worker.Graph:=Graph;
Result:=FindOverloadsDialog.ShowModal;
finally
FindOverloadsDialog.Free;
Graph.Free;
end;
end;
@ -374,14 +382,6 @@ begin
FStagePosMax:=100;
end;
procedure TFindOverloadsWorker.SetStartPosition(Code: TCodeBuffer; X, Y: integer
);
begin
StartCodeXY.Code:=Code;
StartCodeXY.X:=X;
StartCodeXY.Y:=Y;
end;
procedure TFindOverloadsWorker.Work;
begin
DebugLn(['TFindOverloadsWorker.Work START']);

View File

@ -4175,6 +4175,8 @@ var
SelAvail: Boolean;
SelAvailAndWritable: Boolean;
CurFilename: String;
CurWordAtCursor: String;
AtIdentifier: Boolean;
begin
//DebugLn(['TSourceNotebook.SrcPopUpMenuPopup ',dbgsName(Sender)]);
//SourceEditorMenuRoot.WriteDebugReport('TSourceNotebook.SrcPopUpMenuPopup START ',true);
@ -4241,18 +4243,21 @@ begin
EditorPopupPoint:=EditorComp.ScreenToClient(SrcPopUpMenu.PopupPoint);
if EditorPopupPoint.X>EditorComp.GutterWidth then begin
// user clicked on text
// collect some flags
SelAvail:=ASrcEdit.EditorComponent.SelAvail;
SelAvailAndWritable:=SelAvail and (not ASrcEdit.ReadOnly);
SrcEditMenuEncloseSelection.Enabled := SelAvailAndWritable;
SrcEditMenuExtractProc.Enabled := SelAvailAndWritable;
SrcEditMenuInvertAssignment.Enabled := SelAvailAndWritable;
SrcEditMenuFindIdentifierReferences.Enabled:=
IsValidIdent(ASrcEdit.GetWordAtCurrentCaret);
SrcEditMenuRenameIdentifier.Enabled:=
IsValidIdent(ASrcEdit.GetWordAtCurrentCaret)
and (not ASrcEdit.ReadOnly);
CurWordAtCursor:=ASrcEdit.GetWordAtCurrentCaret;
AtIdentifier:=IsValidIdent(CurWordAtCursor);
// enable menu items
SrcEditMenuFindIdentifierReferences.Enabled:=AtIdentifier;
SrcEditMenuRenameIdentifier.Enabled:=AtIdentifier
and (not ASrcEdit.ReadOnly);
SrcEditMenuShowAbstractMethods.Enabled:=not ASrcEdit.ReadOnly;
SrcEditMenuShowEmptyMethods.Enabled:=not ASrcEdit.ReadOnly;
SrcEditMenuFindOverloads.Enabled:=AtIdentifier;
end else begin
// user clicked on gutter
SourceEditorMarks.GetMarksForLine(EditorComp,EditorComp.CaretY,