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 function TCodeToolManager.GatherOverloads(Code: TCodeBuffer; X, Y: integer; out
Graph: TDeclarationOverloadsGraph): boolean; Graph: TDeclarationOverloadsGraph): boolean;
var var
CursorPos: TCodeXYPosition; NewCode: TCodeBuffer;
NewX, NewY, NewTopLine: integer;
begin begin
Graph:=nil;
{$IFDEF CTDEBUG} {$IFDEF CTDEBUG}
DebugLn('TCodeToolManager.GatherOverloads A ',Code.Filename); DebugLn('TCodeToolManager.GatherOverloads A ',Code.Filename);
{$ENDIF} {$ENDIF}
Result:=false; 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; if not InitCurCodeTool(Code) then exit;
CursorPos.X:=X;
CursorPos.Y:=Y;
CursorPos.Code:=Code;
try try
Graph:=TDeclarationOverloadsGraph.Create; Graph:=TDeclarationOverloadsGraph.Create;
Result:=Graph.Init(NewCode,NewX,NewY);
except except
on e: Exception do Result:=HandleException(e); on e: Exception do Result:=HandleException(e);
end; end;

View File

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

View File

@ -83,13 +83,12 @@ type
procedure ScanSomeFiles; procedure ScanSomeFiles;
procedure ScanFile(AFile: TFOWFile); procedure ScanFile(AFile: TFOWFile);
public public
StartCodeXY: TCodeXYPosition;
Scopes: TFindOverloadsScopes; Scopes: TFindOverloadsScopes;
CompletedScopes: TFindOverloadsScopes; CompletedScopes: TFindOverloadsScopes;
Graph: TDeclarationOverloadsGraph;
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure Clear; procedure Clear;
procedure SetStartPosition(Code: TCodeBuffer; X, Y: integer);
procedure Work; procedure Work;
function Done: boolean; function Done: boolean;
procedure StopSearching; procedure StopSearching;
@ -154,13 +153,22 @@ function ShowFindOverloadsDialog(Code: TCodeBuffer; X, Y: integer
): TModalResult; ): TModalResult;
var var
FindOverloadsDialog: TFindOverloadsDialog; FindOverloadsDialog: TFindOverloadsDialog;
Graph: TDeclarationOverloadsGraph;
begin begin
FindOverloadsDialog:=TFindOverloadsDialog.Create(nil); Graph:=nil;
FindOverloadsDialog:=nil;
try 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; Result:=FindOverloadsDialog.ShowModal;
finally finally
FindOverloadsDialog.Free; FindOverloadsDialog.Free;
Graph.Free;
end; end;
end; end;
@ -374,14 +382,6 @@ begin
FStagePosMax:=100; FStagePosMax:=100;
end; end;
procedure TFindOverloadsWorker.SetStartPosition(Code: TCodeBuffer; X, Y: integer
);
begin
StartCodeXY.Code:=Code;
StartCodeXY.X:=X;
StartCodeXY.Y:=Y;
end;
procedure TFindOverloadsWorker.Work; procedure TFindOverloadsWorker.Work;
begin begin
DebugLn(['TFindOverloadsWorker.Work START']); DebugLn(['TFindOverloadsWorker.Work START']);

View File

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