File tree Expand file tree Collapse file tree 8 files changed +114
-0
lines changed
Expand file tree Collapse file tree 8 files changed +114
-0
lines changed Original file line number Diff line number Diff line change 1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ use Rector \Config \RectorConfig ;
6+ use Tempest \Upgrade \Set \TempestSetList ;
7+
8+ return static function (RectorConfig $ config ): void {
9+ $ config ->sets ([
10+ TempestSetList::TEMPEST_20 ,
11+ TempestSetList::TEMPEST_30 ,
12+ ]);
13+ };
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ use Rector \Config \RectorConfig ;
4+ use Tempest \Upgrade \Tempest3 \WriteableRouteRector ;
5+
6+ return static function (RectorConfig $ config ): void {
7+ $ config ->importNames ();
8+ $ config ->importShortClasses ();
9+
10+ $ config ->rule (WriteableRouteRector::class);
11+ };
Original file line number Diff line number Diff line change 77final class TempestLevelSetList
88{
99 public const string UP_TO_TEMPEST_20 = __DIR__ . '/../../config/sets/level/up-to-tempest-20.php ' ;
10+ public const string UP_TO_TEMPEST_30 = __DIR__ . '/../../config/sets/level/up-to-tempest-30.php ' ;
1011}
Original file line number Diff line number Diff line change 77final class TempestSetList
88{
99 public const string TEMPEST_20 = __DIR__ . '/../../config/sets/tempest20.php ' ;
10+ public const string TEMPEST_30 = __DIR__ . '/../../config/sets/tempest30.php ' ;
1011}
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ namespace Tempest \Upgrade \Tempest3 ;
4+
5+ use PhpParser \Modifiers ;
6+ use PhpParser \Node ;
7+ use Rector \Rector \AbstractRector ;
8+ use Tempest \Router \Route ;
9+
10+ final class WriteableRouteRector extends AbstractRector
11+ {
12+ public function getNodeTypes (): array
13+ {
14+ return [
15+ Node \Stmt \Class_::class,
16+ ];
17+ }
18+
19+ public function refactor (Node $ node ): void
20+ {
21+ if (! $ node instanceof Node \Stmt \Class_) {
22+ return ;
23+ }
24+
25+ // Check whether this class implements Tempest\Router\Route
26+ $ implements = $ node ->implements ;
27+
28+ $ implementsRoute = array_find_key (
29+ $ implements ,
30+ static fn (Node \Name $ name ) => $ name ->toString () === Route::class,
31+ );
32+
33+ if ($ implementsRoute === null ) {
34+ return ;
35+ }
36+
37+ if (! $ node ->isReadonly ()) {
38+ return ;
39+ }
40+
41+ $ node ->flags = $ node ->flags & ~Modifiers::READONLY ;
42+ }
43+ }
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ namespace Tempest \Upgrade \Tests \Tempest30 \Fixtures ;
4+
5+ use Tempest \Http \Method ;
6+ use Tempest \Router \Route ;
7+
8+ final readonly class CustomRoute implements Route
9+ {
10+ public function __construct (
11+ public Method $ method ,
12+ public string $ uri ,
13+ public array $ middleware = [],
14+ public array $ without = [],
15+ ) {}
16+ }
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ namespace Tempest \Upgrade \Tests \Tempest30 ;
4+
5+ use PHPUnit \Framework \TestCase ;
6+ use Tempest \Upgrade \Tests \RectorTester ;
7+
8+ final class Tempest30RectorTest extends TestCase
9+ {
10+ private RectorTester $ rector {
11+ get => new RectorTester (__DIR__ . '/tempest30_rector.php ' );
12+ }
13+
14+ public function test_writeable_routes (): void
15+ {
16+ $ this ->rector
17+ ->runFixture (__DIR__ . '/Fixtures/CustomRoute.input.php ' )
18+ ->assertContains ('final class CustomRoute implements Route ' );
19+ }
20+ }
Original file line number Diff line number Diff line change 1+ <?php
2+
3+ use Rector \Config \RectorConfig ;
4+ use Tempest \Upgrade \Set \TempestSetList ;
5+
6+ return RectorConfig::configure ()
7+ ->withSets ([
8+ TempestSetList::TEMPEST_30 ,
9+ ]);
You can’t perform that action at this time.
0 commit comments