IDE: fixed regression #40181, add designtime package

This commit is contained in:
mattias 2023-03-27 12:43:39 +02:00
parent f479581489
commit 785fdec71b

View File

@ -4506,45 +4506,17 @@ function TPkgManager.GetUnitsAndDepsForComps(ComponentClasses: TClassList;
out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult; out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult;
// returns a list of packages and units needed to use the Component in the unit // returns a list of packages and units needed to use the Component in the unit
var var
CurPackages, AllPackages: TStringList; CurPackages: TStringListUTF8Fast;
procedure AddPkgDep(CurCompReq: TComponentRequirements; PkgFile: TPkgFile; procedure AddPkgDep(PkgFile: TPkgFile);
OnlyDesigntime: boolean);
var var
RequiredPackage: TLazPackageID; RequiredPackage: TLazPackageID;
Helper: TPackageIterateHelper;
begin begin
if PkgFile=nil then exit; if PkgFile=nil then exit;
RequiredPackage:=PkgFile.LazPackage; RequiredPackage:=PkgFile.LazPackage;
RequiredPackage:=RedirectPackageDependency(TIDEPackage(RequiredPackage)); RequiredPackage:=RedirectPackageDependency(TIDEPackage(RequiredPackage));
if RequiredPackage=nil then exit; if RequiredPackage=nil then exit;
if OnlyDesigntime and (TIDEPackage(RequiredPackage).PackageType<>lptDesignTime) then
exit;
if CurPackages=nil then
begin
CurPackages:=TStringListUTF8Fast.Create;
CurPackages.Sorted:=True;
CurPackages.Duplicates:=dupIgnore;
end else
CurPackages.Clear;
if AllPackages=nil then
begin
AllPackages:=TStringListUTF8Fast.Create;
AllPackages.Sorted:=True;
AllPackages.Duplicates:=dupIgnore;
end;
CurPackages.Add(RequiredPackage.Name); CurPackages.Add(RequiredPackage.Name);
if Assigned(CurCompReq) then
CurCompReq.RequiredPkgs(CurPackages);
Helper:=TPackageIterateHelper.Create;
try
Helper.PackageNames:=CurPackages;
Helper.PackageList:=AllPackages;
PackageGraph.IteratePackages(fpfSearchAllExisting,@Helper.AddDependency);
finally
Helper.Free;
end;
end; end;
var var
@ -4554,14 +4526,18 @@ var
CurRegComp: TRegisteredComponent; CurRegComp: TRegisteredComponent;
PkgFile: TPkgFile; PkgFile: TPkgFile;
CurUnitName: String; CurUnitName: String;
CurUnitNames: TStrings; CurCompReqs: TComponentRequirements;
CurCompReq: TComponentRequirements; ExistingPkgs, AllPackages, CurUnitNames: TStringListUTF8Fast;
Helper: TPackageIterateHelper;
begin begin
Result:=mrCancel; Result:=mrCancel;
PackageList:=nil; PackageList:=nil;
UnitList:=nil; UnitList:=nil;
ExistingPkgs:=nil;
AllPackages:=TStringListUTF8Fast.Create;
AllPackages.Sorted:=True;
AllPackages.Duplicates:=dupIgnore;
CurPackages:=nil; CurPackages:=nil;
AllPackages:=nil;
CurUnitNames:=TStringListUTF8Fast.Create; CurUnitNames:=TStringListUTF8Fast.Create;
try try
for CurClassID:=0 to ComponentClasses.Count-1 do for CurClassID:=0 to ComponentClasses.Count-1 do
@ -4572,48 +4548,70 @@ begin
begin begin
CurUnitName:=''; CurUnitName:='';
CurUnitNames.Clear; CurUnitNames.Clear;
CurCompReq:=nil; CurCompReqs:=nil;
if UnitList=nil then if UnitList=nil then
begin begin
UnitList:=TStringListUTF8Fast.Create; UnitList:=TStringListUTF8Fast.Create;
UnitList.Sorted:=True; UnitList.Sorted:=True;
UnitList.Duplicates:=dupIgnore; UnitList.Duplicates:=dupIgnore;
end; end;
if CurPackages=nil then
begin
CurPackages:=TStringListUTF8Fast.Create;
CurPackages.Sorted:=True;
CurPackages.Duplicates:=dupIgnore;
end else
CurPackages.Clear;
if CurRegComp.ComponentClass<>nil then if CurRegComp.ComponentClass<>nil then
begin begin
CurUnitName:=CurRegComp.ComponentClass.UnitName; CurUnitName:=CurRegComp.ComponentClass.UnitName;
CurCompReq:=GetComponentRequirements(CurRegComp.ComponentClass); CurCompReqs:=GetComponentRequirements(CurRegComp.ComponentClass);
end; end;
//DebugLn(['TPkgManager.GetUnitsAndDepsForComps: CurCompClass=',DbgSName(CurCompClass),' CurUnitName=',CurUnitName,' CurCompReq=',DbgSName(CurCompReq)]); //DebugLn(['TPkgManager.GetUnitsAndDepsForComps: CurCompClass=',DbgSName(CurCompClass),' CurUnitName=',CurUnitName,' CurCompReq=',DbgSName(CurCompReqs)]);
if CurUnitName='' then if CurUnitName='' then
CurUnitName:=CurRegComp.GetUnitName; CurUnitName:=CurRegComp.GetUnitName;
//Assert(CurUnitNames.IndexOf(CurUnitName)<0, //Assert(CurUnitNames.IndexOf(CurUnitName)<0,
// 'TPkgManager.GetUnitsAndDepsForComps: Name already in CurUnitNames.'); // 'TPkgManager.GetUnitsAndDepsForComps: Name already in CurUnitNames.');
CurUnitNames.Add(CurUnitName); CurUnitNames.Add(CurUnitName);
if CurCompReq<>nil then if CurCompReqs<>nil then
CurCompReq.RequiredUnits(CurUnitNames); CurCompReqs.RequiredUnits(CurUnitNames);
for CurUnitIdx:=0 to CurUnitNames.Count-1 do for CurUnitIdx:=0 to CurUnitNames.Count-1 do
begin begin
CurUnitName:=CurUnitNames[CurUnitIdx]; CurUnitName:=CurUnitNames[CurUnitIdx];
UnitList.Add(CurUnitName); UnitList.Add(CurUnitName);
PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true); PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true);
AddPkgDep(CurCompReq,PkgFile,false); AddPkgDep(PkgFile);
if TPkgComponent(CurRegComp).PkgFile<>PkgFile then end;
// e.g. a designtime package has registered the componentclass // dont forget to add the designtime package
AddPkgDep(nil,TPkgComponent(CurRegComp).PkgFile,true); AddPkgDep(TPkgComponent(CurRegComp).PkgFile);
end; // for CurUnitIdx:= if CurCompReqs<>nil then
CurCompReqs.RequiredPkgs(CurPackages);// let addons add extra pkgs
AllPackages.AddStrings(CurPackages);
end; end;
end; // for CurClassID:=... end; // for CurClassID:=...
if Assigned(AllPackages) and (AllPackages.Count>0) then if AllPackages.Count>0 then
begin begin
ExistingPkgs:=TStringListUTF8Fast.Create;
ExistingPkgs.Sorted:=True;
ExistingPkgs.Duplicates:=dupIgnore;
Helper:=TPackageIterateHelper.Create;
try
Helper.PackageNames:=AllPackages;
Helper.PackageList:=ExistingPkgs;
PackageGraph.IteratePackages(fpfSearchAllExisting,@Helper.AddDependency);
finally
Helper.Free;
end;
PackageList:=TPackagePackageArray.Create; PackageList:=TPackagePackageArray.Create;
for CurPackageIdx:=0 to AllPackages.Count-1 do for CurPackageIdx:=0 to ExistingPkgs.Count-1 do
PackageList.Add(TLazPackageID(AllPackages.Objects[CurPackageIdx])); PackageList.Add(TLazPackageID(ExistingPkgs.Objects[CurPackageIdx]));
end; end;
finally finally
CurUnitNames.Free; CurUnitNames.Free;
CurPackages.Free;
AllPackages.Free; AllPackages.Free;
CurPackages.Free;
ExistingPkgs.Free;
end; end;
Result:=mrOk; Result:=mrOk;
end; end;