codetools: fixed FindSourceNameReferences to check also source name

This commit is contained in:
mattias 2025-02-11 16:50:12 +01:00
parent f61782fb4a
commit fd115f2c71
2 changed files with 55 additions and 22 deletions

View File

@ -7229,6 +7229,7 @@ function TFindDeclarationTool.FindSourceNameReferences(const TargetFilename: str
TreeOfPCodeXYPosition: TAVLTree; SyntaxExceptions: boolean): boolean;
var
IsSelf: Boolean; // true = searching references of my program/unit name
MySrcName: String;
LocalSrcNamePos: integer;
CleanPositions: TIntegerDynArray;
CleanPosCount: integer;
@ -7356,6 +7357,22 @@ var
Result:=true;
end;
procedure FindLongestSrcName(const Expr: string;
var BestUseName: string; var BestDotCount: integer);
var
ExprP, SrcNameP: PChar;
DotCount: Integer;
begin
ExprP:=PChar(Expr);
SrcNameP:=PChar(MySrcName);
if CompareDottedIdentifiers(SrcNameP,ExprP)<>0 then exit;
DotCount:=GetDotCountInIdentifier(SrcNameP);
if DotCount>BestDotCount then begin
BestDotCount:=DotCount;
BestUseName:=MySrcName;
end;
end;
procedure FindLongestUsesName(UseNames: TStringArray; const Expr: string;
var BestUseName: string; var BestDotCount: integer);
var
@ -7410,6 +7427,8 @@ var
FindLongestUsesName(ImplUseNames,Expr,BestUseName,BestDotCount);
if (InterfaceUsesNode<>nil) and (InterfaceUsesNode.EndPos<=StartPos) then
FindLongestUsesName(IntfUseNames,Expr,BestUseName,BestDotCount);
FindLongestSrcName(Expr,BestUseName,BestDotCount);
if (BestUseName<>'')
and (CompareDottedIdentifiers(PChar(BestUseName),PChar(LocalSrcName))<>0) then
begin
@ -7695,7 +7714,6 @@ var
var
NamePos: TAtomPosition;
MySrcName: String;
StartPos, MaxPos: Integer;
begin
Result:=false;

View File

@ -1529,28 +1529,43 @@ begin
end;
procedure TTestRefactoring.TestRenameProgramName_ToraToraTora;
var
ToraUnit: TCodeBuffer;
begin
Add([
'program tora.tora.{comment}tora;',
'{$mode objFPC}',
'var Toranaga: longint;',
'begin',
' Toranaga:=3;',
' tora.tora.tora.Toranaga:=3*Toranaga;',
' tora.{}tora.{comment}tora.{}Toranaga:=3*tora.tora.tora.Toranaga;',
'end.',
'']);
RenameSourceName('Red.Green.Blue','red.green.blue.pas');
CheckDiff(Code,[
'program Red.Green.{comment}Blue;',
'{$mode objFPC}',
'var Toranaga: longint;',
'begin',
' Toranaga:=3;',
' Red.Green.Blue.Toranaga:=3*Toranaga;',
' Red.{}Green.{comment}Blue.{}Toranaga:=3*Red.Green.Blue.Toranaga;',
'end.',
'']);
ToraUnit:=CodeToolBoss.CreateFile('tora.pas');
try
ToraUnit.Source:=LinesToStr([
'unit Tora;',
'interface',
'implementation',
'end.']);
Add([
'program tora.tora.{comment}tora;',
'{$mode objFPC}',
'uses tora;',
'var Toranaga: longint;',
'begin',
' Toranaga:=3;',
' tora.tora.tora.Toranaga:=3*Toranaga;',
' tora.{}tora.{comment}tora.{}Toranaga:=3*tora.tora.tora.Toranaga;',
'end.',
'']);
RenameSourceName('Red.Green.Blue','red.green.blue.pas');
CheckDiff(Code,[
'program Red.Green.{comment}Blue;',
'{$mode objFPC}',
'uses tora;',
'var Toranaga: longint;',
'begin',
' Toranaga:=3;',
' Red.Green.Blue.Toranaga:=3*Toranaga;',
' Red.{}Green.{comment}Blue.{}Toranaga:=3*Red.Green.Blue.Toranaga;',
'end.',
'']);
finally
ToraUnit.IsDeleted:=true;
end;
end;
procedure TTestRefactoring.TestRenameUnitName_IncludeUsedTwiceInOneUnit;