diff --git a/components/codetools/finddeclarationtool.pas b/components/codetools/finddeclarationtool.pas index dc12eeee7f..05960116dc 100644 --- a/components/codetools/finddeclarationtool.pas +++ b/components/codetools/finddeclarationtool.pas @@ -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; diff --git a/components/codetools/tests/testrefactoring.pas b/components/codetools/tests/testrefactoring.pas index a67c8547bf..a57ca3778d 100644 --- a/components/codetools/tests/testrefactoring.pas +++ b/components/codetools/tests/testrefactoring.pas @@ -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;