IDE: Optimize adding component dependencies. Don't try to add same unit many times. Issue #37593.

git-svn-id: trunk@63791 -
This commit is contained in:
juha 2020-08-19 10:10:49 +00:00
parent 02e9b21883
commit bede7c1c4a
2 changed files with 33 additions and 23 deletions

View File

@ -13383,6 +13383,9 @@ begin
if ADesigner.LookupRoot.ComponentCount>0 then if ADesigner.LookupRoot.ComponentCount>0 then
begin begin
ComponentClassNames:=TStringList.Create; ComponentClassNames:=TStringList.Create;
ComponentClassNames.Sorted:=True;
ComponentClassNames.Duplicates:=dupIgnore;
ComponentClassNames.CaseSensitive:=False;
try try
for i:=0 to ADesigner.LookupRoot.ComponentCount-1 do for i:=0 to ADesigner.LookupRoot.ComponentCount-1 do
ComponentClassNames.Add(ADesigner.LookupRoot.Components[i].ClassName); ComponentClassNames.Add(ADesigner.LookupRoot.Components[i].ClassName);

View File

@ -4492,7 +4492,8 @@ var
Result:=LoadAndParseUnitBuf; Result:=LoadAndParseUnitBuf;
if Result<>mrOk then exit; if Result<>mrOk then exit;
for i:=0 to UnitNames.Count-1 do begin for i:=0 to UnitNames.Count-1 do begin
DebugLn('Hint: (lazarus) [TPkgManager.AddUnitDependenciesForComponentClasses] Extending Uses ',UnitBuf.Filename,' ',UnitNames[i]); DebugLn('Hint: (lazarus) [TPkgManager.AddUnitDependenciesForComponentClasses] Extending Uses ',
UnitBuf.Filename,' ',UnitNames[i]);
if not CodeToolBoss.AddUnitToMainUsesSection(UnitBuf,UnitNames[i],'') then if not CodeToolBoss.AddUnitToMainUsesSection(UnitBuf,UnitNames[i],'') then
MainIDE.DoJumpToCodeToolBossError; MainIDE.DoJumpToCodeToolBossError;
end; end;
@ -4566,15 +4567,20 @@ begin
AllPackages:=nil; AllPackages:=nil;
CurUnitNames:=TStringList.Create; CurUnitNames:=TStringList.Create;
try try
for CurClassID:=0 to ComponentClassnames.Count-1 do begin for CurClassID:=0 to ComponentClassnames.Count-1 do
begin
CurCompClass:=ComponentClassnames[CurClassID]; CurCompClass:=ComponentClassnames[CurClassID];
CurRegisteredComponent:=IDEComponentPalette.FindComponent(CurCompClass); CurRegisteredComponent:=IDEComponentPalette.FindComponent(CurCompClass);
if CurRegisteredComponent is TPkgComponent then begin if CurRegisteredComponent is TPkgComponent then
begin
CurUnitName:=''; CurUnitName:='';
CurUnitNames.Clear; CurUnitNames.Clear;
CurCompReq:=nil; CurCompReq:=nil;
if UnitList=nil then
UnitList:=TStringList.Create;
try try
if CurRegisteredComponent.ComponentClass<>nil then begin if CurRegisteredComponent.ComponentClass<>nil then
begin
CurUnitName:=GetClassUnitName(CurRegisteredComponent.ComponentClass); CurUnitName:=GetClassUnitName(CurRegisteredComponent.ComponentClass);
CurCompReq:=GetComponentRequirements(CurRegisteredComponent.ComponentClass); CurCompReq:=GetComponentRequirements(CurRegisteredComponent.ComponentClass);
end; end;
@ -4584,38 +4590,40 @@ begin
CurUnitNames.Add(CurUnitName); CurUnitNames.Add(CurUnitName);
if CurCompReq<>nil then if CurCompReq<>nil then
CurCompReq.RequiredUnits(CurUnitNames); CurCompReq.RequiredUnits(CurUnitNames);
for CurUnitIdx:=0 to CurUnitNames.Count-1 do begin for CurUnitIdx:=0 to CurUnitNames.Count-1 do
if UnitList=nil then begin begin
UnitList:=TStringList.Create;
UnitList.CaseSensitive:=False;
UnitList.Duplicates:=dupIgnore;
end;
CurUnitName:=CurUnitNames[CurUnitIdx]; CurUnitName:=CurUnitNames[CurUnitIdx];
UnitList.Add(CurUnitName); UnitList.Add(CurUnitName);
PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true); PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true);
//DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents PkgFile=',PkgFile<>nil]); //DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents PkgFile=',PkgFile<>nil]);
if PkgFile=nil then if PkgFile=nil then
PkgFile:=TPkgComponent(CurRegisteredComponent).PkgFile; PkgFile:=TPkgComponent(CurRegisteredComponent).PkgFile;
if PkgFile<>nil then begin if PkgFile<>nil then
begin
RequiredPackage:=PkgFile.LazPackage; RequiredPackage:=PkgFile.LazPackage;
RequiredPackage:=RedirectPackageDependency(TIDEPackage(RequiredPackage)); RequiredPackage:=RedirectPackageDependency(TIDEPackage(RequiredPackage));
if RequiredPackage<>nil then begin if RequiredPackage<>nil then
if CurPackages=nil then begin begin
if CurPackages=nil then
begin
CurPackages:=TStringList.Create; CurPackages:=TStringList.Create;
CurPackages.Sorted:=True;
CurPackages.Duplicates:=dupIgnore; CurPackages.Duplicates:=dupIgnore;
CurPackages.CaseSensitive:=False; CurPackages.CaseSensitive:=False;
end else end else
CurPackages.Clear; CurPackages.Clear;
if AllPackages=nil then
begin
AllPackages:=TStringList.Create;
AllPackages.Sorted:=True;
AllPackages.Duplicates:=dupIgnore;
AllPackages.CaseSensitive:=False;
end;
CurPackages.Add(RequiredPackage.Name); CurPackages.Add(RequiredPackage.Name);
if Assigned(CurCompReq) then if Assigned(CurCompReq) then
CurCompReq.RequiredPkgs(CurPackages); CurCompReq.RequiredPkgs(CurPackages);
Helper:=TPackageIterateHelper.Create; Helper:=TPackageIterateHelper.Create;
try try
if AllPackages=nil then begin
AllPackages:=TStringList.Create;
AllPackages.CaseSensitive:=False;
AllPackages.Duplicates:=dupIgnore;
end;
Helper.PackageNames:=CurPackages; Helper.PackageNames:=CurPackages;
Helper.PackageList:=AllPackages; Helper.PackageList:=AllPackages;
PackageGraph.IteratePackages(fpfSearchAllExisting,@Helper.AddDependency); PackageGraph.IteratePackages(fpfSearchAllExisting,@Helper.AddDependency);
@ -4630,9 +4638,9 @@ begin
end; end;
end; end;
end; end;
if AllPackages.Count>0 then begin if Assigned(AllPackages) and (AllPackages.Count>0) then
if AllPackages.Count>0 then begin
PackageList:=TPackagePackageArray.Create; PackageList:=TPackagePackageArray.Create;
for CurPackageIdx:=0 to AllPackages.Count-1 do for CurPackageIdx:=0 to AllPackages.Count-1 do
PackageList.Add(TLazPackageID(AllPackages.Objects[CurPackageIdx])); PackageList.Add(TLazPackageID(AllPackages.Objects[CurPackageIdx]));
end; end;
@ -4647,8 +4655,7 @@ end;
function TPkgManager.FilterMissingDependenciesForUnit(const UnitFilename: string; function TPkgManager.FilterMissingDependenciesForUnit(const UnitFilename: string;
InputPackageList: TPackagePackageArray; InputPackageList: TPackagePackageArray;
out OutputPackageList: TOwnerPackageArray): TModalResult; out OutputPackageList: TOwnerPackageArray): TModalResult;
// returns a list of packages that are not yet used by the project the unit // returns a list of packages that are not yet used by the project the unit belongs to
// belongs to
var var
UnitOwners: TFPList; UnitOwners: TFPList;
UnitOwner: TObject; UnitOwner: TObject;