IDE: GetAllRequiredPackages: sort for topological lvl and name

git-svn-id: trunk@40306 -
This commit is contained in:
mattias 2013-02-13 19:07:26 +00:00
parent e1f38d1a0b
commit 0c71b8e46c
2 changed files with 36 additions and 28 deletions

View File

@ -874,6 +874,7 @@ function CompareLazPackageID(Data1, Data2: Pointer): integer;
function CompareNameWithPackageID(Key, Data: Pointer): integer;
function ComparePkgIDMaskWithPackageID(Key, Data: Pointer): integer;
function CompareLazPackageIDNames(Data1, Data2: Pointer): integer;
function CompareLazPackageTopologicallyAndName(Data1, Data2: Pointer): integer;
function CompareNameWithPkgDependency(Key, Data: Pointer): integer;
function ComparePkgDependencyNames(Data1, Data2: Pointer): integer;
function CompareUnitsTree(UnitTree1, UnitTree2: TPkgUnitsTree): integer;
@ -1174,11 +1175,9 @@ end;
function CompareLazPackageID(Data1, Data2: Pointer): integer;
var
Pkg1: TLazPackageID;
Pkg2: TLazPackageID;
Pkg1: TLazPackageID absolute Data1;
Pkg2: TLazPackageID absolute Data2;
begin
Pkg1:=TLazPackageID(Data1);
Pkg2:=TLazPackageID(Data2);
Result:=Pkg1.Compare(Pkg2);
end;
@ -1197,41 +1196,44 @@ end;
function ComparePkgIDMaskWithPackageID(Key, Data: Pointer): integer;
var
Pkg1: TLazPackageID;
Pkg2: TLazPackageID;
Pkg1: TLazPackageID absolute Key;
Pkg2: TLazPackageID absolute Data;
begin
Pkg1:=TLazPackageID(Key);
Pkg2:=TLazPackageID(Data);
Result:=Pkg1.CompareMask(Pkg2);
end;
function CompareLazPackageIDNames(Data1, Data2: Pointer): integer;
var
Pkg1: TLazPackageID;
Pkg2: TLazPackageID;
Pkg1: TLazPackageID absolute Data1;
Pkg2: TLazPackageID absolute Data2;
begin
Pkg1:=TLazPackageID(Data1);
Pkg2:=TLazPackageID(Data2);
Result:=SysUtils.CompareText(Pkg1.Name,Pkg2.Name);
end;
function CompareLazPackageTopologicallyAndName(Data1, Data2: Pointer): integer;
var
Pkg1: TLazPackage absolute Data1;
Pkg2: TLazPackage absolute Data2;
begin
Result:=Pkg1.TopologicalLevel-Pkg2.TopologicalLevel;
if Result<>0 then exit;
Result:=SysUtils.CompareText(Pkg1.Name,Pkg2.Name);
end;
function CompareNameWithPkgDependency(Key, Data: Pointer): integer;
var
PkgName: String;
Dependency: TPkgDependency;
Dependency: TPkgDependency absolute Data;
begin
PkgName:=String(Key);
Dependency:=TPkgDependency(Data);
Result:=SysUtils.CompareText(PkgName,Dependency.PackageName);
end;
function ComparePkgDependencyNames(Data1, Data2: Pointer): integer;
var
Dependency1: TPkgDependency;
Dependency2: TPkgDependency;
Dependency1: TPkgDependency absolute Data1;
Dependency2: TPkgDependency absolute Data2;
begin
Dependency1:=TPkgDependency(Data1);
Dependency2:=TPkgDependency(Data2);
Result:=SysUtils.CompareText(Dependency1.PackageName,Dependency2.PackageName);
end;

View File

@ -5207,8 +5207,12 @@ procedure TLazPackageGraph.GetAllRequiredPackages(APackage: TLazPackage;
if Dependency.LoadPackageResult<>lprSuccess then continue;
//debugln('TLazPackageGraph.GetAllRequiredPackages B ',Dependency.AsString);
RequiredPackage:=Dependency.RequiredPackage;
if (lpfVisited in RequiredPackage.Flags) then
continue; // already visited
if (lpfVisited in RequiredPackage.Flags) then begin
// already visited
if HighestLevel<RequiredPackage.TopologicalLevel then
HighestLevel:=RequiredPackage.TopologicalLevel;
continue;
end;
RequiredPackage.Flags:=RequiredPackage.Flags+[lpfVisited];
if ord(RequiredPackage.AutoUpdate)<ord(MinPolicy) then
continue; // skip manually updated packages
@ -5240,18 +5244,20 @@ begin
end;
// create topological list, beginning with the leaves
GetTopologicalOrder(FirstDependency,DepLevel);
if List=nil then exit;
MergeSort(List,@CompareLazPackageTopologicallyAndName);
if not (pirCompileOrder in Flags) then begin
// reverse list order
if List<>nil then begin
i:=0;
j:=List.Count-1;
while i<j do begin
List.Exchange(i,j);
inc(i);
dec(j);
end;
i:=0;
j:=List.Count-1;
while i<j do begin
List.Exchange(i,j);
inc(i);
dec(j);
end;
end;
//for i:=0 to List.Count-1 do
// debugln(['TLazPackageGraph.GetAllRequiredPackages ',i,'/',List.Count-1,' ',TLazPackage(List[i]).Name,' ',TLazPackage(List[i]).TopologicalLevel]);
end;
procedure TLazPackageGraph.GetConnectionsTree(FirstDependency: TPkgDependency;