Skip to content

Commit d49074c

Browse files
committed
Rector wip
1 parent c283ecf commit d49074c

5 files changed

Lines changed: 111 additions & 0 deletions

File tree

packages/upgrade/config/sets/tempest34.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
use Rector\Configuration\Option;
55
use Rector\Configuration\Parameter\SimpleParameterProvider;
66
use Tempest\Upgrade\Tempest34\UpdateDiscoveryImportsRector;
7+
use Tempest\Upgrade\Tempest34\UpdateKernelDiscoveryPropertiesRector;
78

89
return static function (RectorConfig $config): void {
910
SimpleParameterProvider::setParameter(Option::AUTO_IMPORT_NAMES, value: true);
1011
SimpleParameterProvider::setParameter(Option::IMPORT_SHORT_CLASSES, value: true);
1112

1213
$config->rule(UpdateDiscoveryImportsRector::class);
14+
$config->rule(UpdateKernelDiscoveryPropertiesRector::class);
1315
};
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace Tempest\Upgrade\Tempest34;
4+
5+
use PhpParser\Node;
6+
use PhpParser\Node\Expr\PropertyFetch;
7+
use PhpParser\Node\Identifier;
8+
use Rector\Rector\AbstractRector;
9+
10+
final class UpdateKernelDiscoveryPropertiesRector extends AbstractRector
11+
{
12+
private const array PROPERTY_RENAMES = [
13+
'discoveryLocations' => 'locations',
14+
'discoveryClasses' => 'classes',
15+
];
16+
17+
public function getNodeTypes(): array
18+
{
19+
return [
20+
PropertyFetch::class,
21+
];
22+
}
23+
24+
public function refactor(Node $node): ?Node
25+
{
26+
if (! $node instanceof PropertyFetch) {
27+
return null;
28+
}
29+
30+
if (! $node->name instanceof Identifier) {
31+
return null;
32+
}
33+
34+
$propertyName = $node->name->toString();
35+
36+
if (! isset(self::PROPERTY_RENAMES[$propertyName])) {
37+
return null;
38+
}
39+
40+
if (! $this->isKernelType($node->var)) {
41+
return null;
42+
}
43+
44+
// Transform $kernel->discoveryLocations to $kernel->registry->locations
45+
return new PropertyFetch(
46+
new PropertyFetch($node->var, 'registry'),
47+
self::PROPERTY_RENAMES[$propertyName],
48+
);
49+
}
50+
51+
private function isKernelType(Node\Expr $expr): bool
52+
{
53+
$type = $this->nodeTypeResolver->getType($expr);
54+
55+
foreach ($type->getObjectClassNames() as $className) {
56+
if ($className === 'Tempest\Core\Kernel' || is_subclass_of($className, 'Tempest\Core\Kernel')) {
57+
return true;
58+
}
59+
}
60+
61+
return false;
62+
}
63+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use Tempest\Core\Kernel;
4+
5+
final class KernelDiscoveryClasses
6+
{
7+
public function __construct(
8+
private Kernel $kernel,
9+
) {}
10+
11+
public function getClasses(): array
12+
{
13+
return $this->kernel->discoveryClasses;
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use Tempest\Core\Kernel;
4+
5+
final class KernelDiscoveryLocations
6+
{
7+
public function __construct(
8+
private Kernel $kernel,
9+
) {}
10+
11+
public function getLocations(): array
12+
{
13+
return $this->kernel->discoveryLocations;
14+
}
15+
}

packages/upgrade/tests/Tempest34/Tempest34RectorTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,20 @@ public function test_fully_qualified_discovery_cache(): void
6666
->assertContains('Tempest\Discovery\DiscoveryCache')
6767
->assertNotContains('Tempest\Core\DiscoveryCache');
6868
}
69+
70+
public function test_kernel_discovery_locations_refactored(): void
71+
{
72+
$this->rector
73+
->runFixture(__DIR__ . '/Fixtures/KernelDiscoveryLocations.input.php')
74+
->assertContains('$this->kernel->registry->locations')
75+
->assertNotContains('$this->kernel->discoveryLocations');
76+
}
77+
78+
public function test_kernel_discovery_classes_refactored(): void
79+
{
80+
$this->rector
81+
->runFixture(__DIR__ . '/Fixtures/KernelDiscoveryClasses.input.php')
82+
->assertContains('$this->kernel->registry->classes')
83+
->assertNotContains('$this->kernel->discoveryClasses');
84+
}
6985
}

0 commit comments

Comments
 (0)