codetools: fixed FindSourceNameReferences searching longest fitting unitname

This commit is contained in:
mattias 2025-02-04 19:21:26 +01:00
parent 116b91b184
commit 7dbb6355e5
2 changed files with 60 additions and 1 deletions

View File

@ -7375,7 +7375,7 @@ var
ExprP:=PChar(Expr);
for i:=0 to length(UseNames)-1 do begin
UseNameP:=PChar(UseNames[i]);
if CompareIdentifiers(UseNameP,ExprP)=0 then begin
if CompareDottedIdentifiers(UseNameP,ExprP)=0 then begin
DotCount:=GetDotCountInIdentifier(UseNameP);
if DotCount>BestDotCount then begin
BestDotCount:=DotCount;

View File

@ -73,6 +73,7 @@ type
procedure TestRenameUsedUnit_Impl;
procedure TestRenameUsedUnit_FN_KeepShort;
procedure TestRenameUsedUnit_InFilename;
procedure TestRenameUsedUnit_LongestUnitnameWins;
end;
implementation
@ -1656,6 +1657,64 @@ begin
end;
end;
procedure TTestRefactoring.TestRenameUsedUnit_LongestUnitnameWins;
var
RedUnit, RedGreenUnit, RedGreenBlueUnit: TCodeBuffer;
begin
RedUnit:=CodeToolBoss.CreateFile('red.pas');
RedGreenUnit:=CodeToolBoss.CreateFile('red.green.pas');
RedGreenBlueUnit:=CodeToolBoss.CreateFile('red.green.blue.pas');
try
RedUnit.Source:='unit Red;'+LineEnding
+'interface'+LineEnding
+'var'+LineEnding
+' Red, Green: word;'+LineEnding
+'implementation'+LineEnding
+'end.';
RedGreenUnit.Source:='unit Red.Green;'+LineEnding
+'interface'+LineEnding
+'var'+LineEnding
+' Green, Blue: word;'+LineEnding
+'implementation'+LineEnding
+'end.';
RedGreenBlueUnit.Source:='unit Red.Green.Blue;'+LineEnding
+'interface'+LineEnding
+'var'+LineEnding
+' Blue: word;'+LineEnding
+'implementation'+LineEnding
+'end.';
Add([
'program test1;',
'{$mode objfpc}{$H+}',
'uses Red, Red.Green, Red.Green.Blue;',
'begin',
' red.red:=1;',
' red.green.green:=2;',
' red.green.blue.blue:=3;',
'end.',
'']);
RenameUsedUnitRefs(RedGreenUnit,'&End','end.pas');
CheckDiff(Code,[
'program test1;',
'{$mode objfpc}{$H+}',
'uses Red, &End, Red.Green.Blue;',
'begin',
' red.red:=1;',
' &End.green:=2;',
' red.green.blue.blue:=3;',
'end.',
'']);
finally
RedUnit.IsDeleted:=true;
RedGreenUnit.IsDeleted:=true;
RedGreenBlueUnit.IsDeleted:=true;
end;
end;
initialization
RegisterTests([TTestRefactoring]);
end.