ide: comment, codetools: FindSourceNameReferences: search virtual files

This commit is contained in:
mattias 2025-03-16 13:45:12 +01:00
parent 435a011e8a
commit b09fddb930
3 changed files with 39 additions and 13 deletions

View File

@ -167,6 +167,8 @@ type
procedure DoOnGlobalValuesChanged; procedure DoOnGlobalValuesChanged;
function DoOnFindUsedUnit(SrcTool: TFindDeclarationTool; const TheUnitName, function DoOnFindUsedUnit(SrcTool: TFindDeclarationTool; const TheUnitName,
TheUnitInFilename: string): TCodeBuffer; TheUnitInFilename: string): TCodeBuffer;
function DoOnFindUsedUnit(const SrcFilename, TheUnitName,
TheUnitInFilename: string): TCodeBuffer;
function DoOnGetSrcPathForCompiledUnit(Sender: TObject; function DoOnGetSrcPathForCompiledUnit(Sender: TObject;
const AFilename: string): string; const AFilename: string): string;
function DoOnInternalGetMethodName(const AMethod: TMethod; function DoOnInternalGetMethodName(const AMethod: TMethod;
@ -3054,7 +3056,7 @@ function TCodeToolManager.FindSourceNameReferences(TargetFilename: string; Files
SkipComments: boolean; out ListOfSrcNameRefs: TObjectList; WithDuplicates: boolean): boolean; SkipComments: boolean; out ListOfSrcNameRefs: TObjectList; WithDuplicates: boolean): boolean;
var var
i, j, InFilenameCleanPos: Integer; i, j, InFilenameCleanPos: Integer;
Filename, Dir, TargetUnitName, InFilename, LocalSrcName: String; Filename, Dir, TargetUnitName, InFilename, LocalSrcName, CurUnitName: String;
Code: TCodeBuffer; Code: TCodeBuffer;
Tools, DirCachesSearch, DirCachesSkip: TFPList; Tools, DirCachesSearch, DirCachesSkip: TFPList;
DirCache: TCTDirectoryCache; DirCache: TCTDirectoryCache;
@ -3062,11 +3064,20 @@ var
Refs: TSrcNameRefs; Refs: TSrcNameRefs;
Node, NextNode: TAVLTreeNode; Node, NextNode: TAVLTreeNode;
CodeXYPos: PCodeXYPosition; CodeXYPos: PCodeXYPosition;
function CanFindFile(const CurFilename: string): boolean;
begin
Result:=false;
if FilenameIsAbsolute(TargetFilename) then exit;
Result:=DoOnFindUsedUnit(CurFilename,TargetUnitName,'')<>nil;
end;
begin begin
{$IFDEF VerboseFindSourceNameReferences} {$IFDEF VerboseFindSourceNameReferences}
debugln(['TCodeToolManager.FindSourceNameReferences TargetFile="',TargetFilename,'" FileCount=',Files.Count,' SkipComments=',SkipComments]); debugln(['TCodeToolManager.FindSourceNameReferences TargetFile="',TargetFilename,'" FileCount=',Files.Count,' SkipComments=',SkipComments]);
{$ENDIF} {$ENDIF}
Result:=false; Result:=false;
TargetUnitName:=ExtractFileNameOnly(TargetFilename);
ListOfSrcNameRefs:=nil; ListOfSrcNameRefs:=nil;
Tools:=TFPList.Create; Tools:=TFPList.Create;
DirCachesSearch:=TFPList.Create; DirCachesSearch:=TFPList.Create;
@ -3089,17 +3100,21 @@ begin
// check if directory has target in unitpath // check if directory has target in unitpath
Dir:=ExtractFilePath(Filename); Dir:=ExtractFilePath(Filename);
DirCache:=DirectoryCachePool.GetCache(Dir,true,false); DirCache:=DirectoryCachePool.GetCache(Dir,true,false);
if DirCachesSkip.IndexOf(DirCache)>=0 then continue; if DirCachesSkip.IndexOf(DirCache)>=0 then begin
if DirCachesSearch.IndexOf(DirCache)<0 then begin // this directory does not have target in unit path
TargetUnitName:=ExtractFileNameOnly(TargetFilename); // check custom search
if not CanFindFile(Filename) then
continue;
end else if DirCachesSearch.IndexOf(DirCache)<0 then begin
CurUnitName:=TargetUnitName;
InFilename:=''; InFilename:='';
if DirCache.FindUnitSourceInCompletePath(TargetUnitName,InFilename,true)<>'' then if DirCache.FindUnitSourceInCompletePath(CurUnitName,InFilename,true)<>'' then
begin begin
{$IFDEF VerboseFindSourceNameReferences} {$IFDEF VerboseFindSourceNameReferences}
debugln(['TCodeToolManager.FindSourceNameReferences File ',Filename,', target in unit path']); debugln(['TCodeToolManager.FindSourceNameReferences File ',Filename,', target in unit path']);
{$ENDIF} {$ENDIF}
DirCachesSearch.Add(DirCache); DirCachesSearch.Add(DirCache);
end else begin end else if not CanFindFile(Filename) then begin
{$IFDEF VerboseFindSourceNameReferences} {$IFDEF VerboseFindSourceNameReferences}
debugln(['TCodeToolManager.FindSourceNameReferences File ',Filename,', target NOT in unit path, SKIP']); debugln(['TCodeToolManager.FindSourceNameReferences File ',Filename,', target NOT in unit path, SKIP']);
{$ENDIF} {$ENDIF}
@ -6399,8 +6414,16 @@ function TCodeToolManager.DoOnFindUsedUnit(SrcTool: TFindDeclarationTool;
const TheUnitName, TheUnitInFilename: string): TCodeBuffer; const TheUnitName, TheUnitInFilename: string): TCodeBuffer;
begin begin
if Assigned(OnSearchUsedUnit) then if Assigned(OnSearchUsedUnit) then
Result:=OnSearchUsedUnit(SrcTool.MainFilename, Result:=OnSearchUsedUnit(SrcTool.MainFilename,TheUnitName,TheUnitInFilename)
TheUnitName,TheUnitInFilename) else
Result:=nil;
end;
function TCodeToolManager.DoOnFindUsedUnit(const SrcFilename, TheUnitName, TheUnitInFilename: string
): TCodeBuffer;
begin
if Assigned(OnSearchUsedUnit) then
Result:=OnSearchUsedUnit(SrcFilename,TheUnitName,TheUnitInFilename)
else else
Result:=nil; Result:=nil;
end; end;

View File

@ -6648,7 +6648,7 @@ end;
procedure TProjectDefineTemplates.UpdateMain; procedure TProjectDefineTemplates.UpdateMain;
begin begin
if (Owner as TProject).Destroying then exit; if (Owner as TProject).Destroying then exit;
// update the package block define template (the container for all other // update the block define template (the container for all other
// define templates of the project) // define templates of the project)
if FMain=nil then begin if FMain=nil then begin
// create the main project template // create the main project template
@ -6768,7 +6768,7 @@ var
SrcDirDefTempl: TDefineTemplate; SrcDirDefTempl: TDefineTemplate;
IDHasChanged: Boolean; IDHasChanged: Boolean;
SrcDirMarkDefTempl: TDefineTemplate; SrcDirMarkDefTempl: TDefineTemplate;
CurUnitPath: String; CurUnitPath, SrcDir: String;
begin begin
//DebugLn('TProjectDefineTemplates.UpdateDefinesForSourceDirectories ',Owner.IDAsString,' Active=',dbgs(Active),' TimeStamp=',dbgs(fLastSourceDirStamp),' Project.TimeStamp=',dbgs(Project.SourceDirectories.TimeStamp)); //DebugLn('TProjectDefineTemplates.UpdateDefinesForSourceDirectories ',Owner.IDAsString,' Active=',dbgs(Active),' TimeStamp=',dbgs(fLastSourceDirStamp),' Project.TimeStamp=',dbgs(Project.SourceDirectories.TimeStamp));
if (not Owner.NeedsDefineTemplates) or (not Active) then exit; if (not Owner.NeedsDefineTemplates) or (not Active) then exit;
@ -6822,10 +6822,12 @@ begin
UpdateSrcDirIfDef; UpdateSrcDirIfDef;
for i:=0 to fLastSourceDirectories.Count-1 do begin for i:=0 to fLastSourceDirectories.Count-1 do begin
// create directory template // create directory template
SrcDir:=fLastSourceDirectories[i];
SrcDirDefTempl:=TDefineTemplate.Create('Source Directory '+IntToStr(i+1), SrcDirDefTempl:=TDefineTemplate.Create('Source Directory '+IntToStr(i+1),
fLastSourceDirectories[i],'',fLastSourceDirectories[i],da_Directory); SrcDir,'',fLastSourceDirectories[i],da_Directory);
DisableDefaultsInDirectories(SrcDirDefTempl,false);
fLastSourceDirectories.Objects[i]:=SrcDirDefTempl; fLastSourceDirectories.Objects[i]:=SrcDirDefTempl;
// add disable defaults
DisableDefaultsInDirectories(SrcDirDefTempl,false);
// add proj source directory marker // add proj source directory marker
SrcDirMarkDefTempl:=TDefineTemplate.Create('ProjectSrcDirMark', SrcDirMarkDefTempl:=TDefineTemplate.Create('ProjectSrcDirMark',
lisProjProjectSourceDirectoryMark, '#ProjectSrcMark'+Owner.IDAsWord, lisProjProjectSourceDirectoryMark, '#ProjectSrcMark'+Owner.IDAsWord,

View File

@ -1758,6 +1758,7 @@ end;
function TProjectUnitFileSelector.InitialSelection(aFilename: string): Boolean; function TProjectUnitFileSelector.InitialSelection(aFilename: string): Boolean;
begin begin
Result:=False; Result:=False;
if aFilename='' then ;
end; end;
function TProjectUnitFileSelector.Select: TModalResult; function TProjectUnitFileSelector.Select: TModalResult;
@ -5827,7 +5828,7 @@ begin
// check new resource file // check new resource file
NewLFMFilename:=''; NewLFMFilename:='';
if FilenameHasPascalExt(NewFilename) then if FilenameHasPascalExt(NewFilename) then
NewLFMFilename:=ChangeFileExt(NewFilename,'.lfm'); NewLFMFilename:=ChangeFileExt(NewFilename,'.lfm');
if AnUnitInfo.ComponentName='' then begin if AnUnitInfo.ComponentName='' then begin
// unit has no component // unit has no component
// -> remove lfm file, so that it will not be auto loaded on next open // -> remove lfm file, so that it will not be auto loaded on next open