Skip to content

Commit fae42d1

Browse files
committed
feat(upgrade): automate map namespace change
1 parent 2cbb2ae commit fae42d1

File tree

11 files changed

+171
-0
lines changed

11 files changed

+171
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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_28,
12+
TempestSetList::TEMPEST_30,
13+
]);
14+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use Rector\Config\RectorConfig;
4+
use Tempest\Upgrade\Tempest3\UpdateMapperFunctionImportsRector;
5+
6+
return static function (RectorConfig $config): void {
7+
$config->importNames();
8+
$config->importShortClasses();
9+
10+
$config->rule(UpdateMapperFunctionImportsRector::class);
11+
};

packages/upgrade/src/Set/TempestLevelSetList.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ final class TempestLevelSetList
88
{
99
public const string UP_TO_TEMPEST_20 = __DIR__ . '/../../config/sets/level/up-to-tempest-20.php';
1010
public const string UP_TO_TEMPEST_28 = __DIR__ . '/../../config/sets/level/up-to-tempest-28.php';
11+
public const string UP_TO_TEMPEST_30 = __DIR__ . '/../../config/sets/level/up-to-tempest-30.php';
1112
}

packages/upgrade/src/Set/TempestSetList.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ final class TempestSetList
88
{
99
public const string TEMPEST_20 = __DIR__ . '/../../config/sets/tempest20.php';
1010
public const string TEMPEST_28 = __DIR__ . '/../../config/sets/tempest28.php';
11+
public const string TEMPEST_30 = __DIR__ . '/../../config/sets/tempest30.php';
1112
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Tempest\Upgrade\Tempest3;
4+
5+
use PhpParser\Node;
6+
use Rector\Rector\AbstractRector;
7+
8+
final class UpdateMapperFunctionImportsRector extends AbstractRector
9+
{
10+
public function getNodeTypes(): array
11+
{
12+
return [
13+
Node\UseItem::class,
14+
Node\Expr\FuncCall::class,
15+
];
16+
}
17+
18+
public function refactor(Node $node): ?int
19+
{
20+
if ($node instanceof Node\UseItem) {
21+
if ($node->name->toString() === 'Tempest\map') {
22+
$node->name = new Node\Name('Tempest\Mapper\map');
23+
}
24+
25+
if ($node->name->toString() === 'Tempest\make') {
26+
$node->name = new Node\Name('Tempest\Mapper\make');
27+
}
28+
29+
return null;
30+
}
31+
32+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
33+
$functionName = $node->name->toString();
34+
35+
if ($functionName === 'Tempest\map') {
36+
$node->name = new Node\Name\FullyQualified('Tempest\Mapper\map');
37+
38+
return null;
39+
}
40+
41+
if ($functionName === 'Tempest\make') {
42+
$node->name = new Node\Name\FullyQualified('Tempest\Mapper\make');
43+
44+
return null;
45+
}
46+
}
47+
48+
return null;
49+
}
50+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
final class FullyQualifiedMakeCall
4+
{
5+
public function __invoke()
6+
{
7+
return \Tempest\make(Author::class)->from(['name' => 'Jon Doe']);
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
final class FullyQualifiedMapCall
4+
{
5+
public function __invoke(array $data)
6+
{
7+
return \Tempest\map($data)->to(Author::class);
8+
}
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use function Tempest\make;
4+
5+
final class MakeNamespaceChange
6+
{
7+
public function __invoke()
8+
{
9+
return make(Author::class)->from(['name' => 'Jon Doe']);
10+
}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use function Tempest\map;
4+
5+
final class MapNamespaceChange
6+
{
7+
public function __invoke(array $data)
8+
{
9+
return map($data)->to(Author::class);
10+
}
11+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace Tempest\Upgrade\Tests\Tempest3;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Tempest\Upgrade\Tests\RectorTester;
7+
8+
final class Tempest3RectorTest extends TestCase
9+
{
10+
private RectorTester $rector {
11+
get => new RectorTester(__DIR__ . '/tempest30_rector.php');
12+
}
13+
14+
public function test_map_namespace_change(): void
15+
{
16+
$this->rector
17+
->runFixture(__DIR__ . '/Fixtures/MapNamespaceChange.input.php')
18+
->assertContains('use function Tempest\Mapper\map;')
19+
->assertNotContains('use function Tempest\map;');
20+
}
21+
22+
public function test_make_namespace_change(): void
23+
{
24+
$this->rector
25+
->runFixture(__DIR__ . '/Fixtures/MakeNamespaceChange.input.php')
26+
->assertContains('use function Tempest\Mapper\make;')
27+
->assertNotContains('use function Tempest\make;');
28+
}
29+
30+
public function test_fully_qualified_map_call(): void
31+
{
32+
$this->rector
33+
->runFixture(__DIR__ . '/Fixtures/FullyQualifiedMapCall.input.php')
34+
->assertContains('use Tempest\Mapper\map;')
35+
->assertContains('return map($data)->to(Author::class);');
36+
}
37+
38+
public function test_fully_qualified_make_call(): void
39+
{
40+
$this->rector
41+
->runFixture(__DIR__ . '/Fixtures/FullyQualifiedMakeCall.input.php')
42+
->assertContains('use Tempest\Mapper\make;')
43+
->assertContains('return make(Author::class)');
44+
}
45+
}

0 commit comments

Comments
 (0)