Skip to content

Commit cdd219c

Browse files
authored
perf: use hash map for installed packages (#7878)
* perf: use hash map for installed packages We can turn a package lookup into O(1) by using a hash map instead of an O(n) with a linear array. * chore: review updates
1 parent 52c6ece commit cdd219c

File tree

3 files changed

+17
-18
lines changed

3 files changed

+17
-18
lines changed

src/Composer/InstalledPackageResolver.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
final class InstalledPackageResolver
1818
{
1919
/**
20-
* @var null|InstalledPackage[]
20+
* @var null|array<string, InstalledPackage>
2121
*/
2222
private ?array $resolvedInstalledPackages = null;
2323

@@ -33,7 +33,7 @@ public function __construct(
3333
}
3434

3535
/**
36-
* @return InstalledPackage[]
36+
* @return array<string, InstalledPackage>
3737
*/
3838
public function resolve(): array
3939
{
@@ -61,28 +61,26 @@ public function resolve(): array
6161

6262
public function resolvePackageVersion(string $packageName): ?string
6363
{
64-
$installedPackages = $this->resolve();
65-
foreach ($installedPackages as $installedPackage) {
66-
if ($installedPackage->getName() !== $packageName) {
67-
continue;
68-
}
64+
$package = $this->resolve()[$packageName] ?? null;
6965

70-
return $installedPackage->getVersion();
66+
if (! $package instanceof InstalledPackage) {
67+
return null;
7168
}
7269

73-
return null;
70+
return $package->getVersion();
7471
}
7572

7673
/**
7774
* @param mixed[] $packages
78-
* @return InstalledPackage[]
75+
* @return array<string, InstalledPackage>
7976
*/
8077
private function createInstalledPackages(array $packages): array
8178
{
8279
$installedPackages = [];
8380

8481
foreach ($packages as $package) {
85-
$installedPackages[] = new InstalledPackage($package['name'], $package['version_normalized']);
82+
$name = $package['name'];
83+
$installedPackages[$name] = new InstalledPackage($name, $package['version_normalized']);
8684
}
8785

8886
return $installedPackages;

src/Composer/ValueObject/InstalledPackage.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Rector\Composer\ValueObject;
66

7+
/**
8+
* @api
9+
*/
710
final readonly class InstalledPackage
811
{
912
public function __construct(

src/Set/ValueObject/ComposerTriggeredSet.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,17 @@ public function getSetFilePath(): string
4040
}
4141

4242
/**
43-
* @param InstalledPackage[] $installedPackages
43+
* @param array<string, InstalledPackage> $installedPackages
4444
*/
4545
public function matchInstalledPackages(array $installedPackages): bool
4646
{
47-
foreach ($installedPackages as $installedPackage) {
48-
if ($installedPackage->getName() !== $this->packageName) {
49-
continue;
50-
}
47+
$package = $installedPackages[$this->packageName] ?? null;
5148

52-
return Semver::satisfies($installedPackage->getVersion(), '^' . $this->version);
49+
if (! $package instanceof InstalledPackage) {
50+
return false;
5351
}
5452

55-
return false;
53+
return Semver::satisfies($package->getVersion(), '^' . $this->version);
5654
}
5755

5856
public function getName(): string

0 commit comments

Comments
 (0)