Skip to content

Commit

Permalink
add rector to transform TableRegistry::get to TableRegistry::getTable…
Browse files Browse the repository at this point in the history
…Locator()->get (#295)
  • Loading branch information
LordSimal authored Sep 6, 2024
1 parent d31c3b0 commit c2f65ec
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 0 deletions.
3 changes: 3 additions & 0 deletions config/rector/sets/cakephp50.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

use Cake\Upgrade\Rector\Rector\MethodCall\OptionsArrayToNamedParametersRector;
use Cake\Upgrade\Rector\Rector\MethodCall\RemoveMethodCallRector;
use Cake\Upgrade\Rector\Rector\MethodCall\TableRegistryLocatorRector;
use Cake\Upgrade\Rector\ValueObject\OptionsArrayToNamedParameters;
use Cake\Upgrade\Rector\ValueObject\RemoveMethodCall;
use PHPStan\Type\ArrayType;
Expand Down Expand Up @@ -113,4 +114,6 @@
new RemoveMethodCall('Cake\TestSuite\TestCase', 'useCommandRunner'),
new RemoveMethodCall('Cake\TestSuite\TestCase', 'useHttpServer'),
]);

$rectorConfig->rule(TableRegistryLocatorRector::class);
};
59 changes: 59 additions & 0 deletions src/Rector/Rector/MethodCall/TableRegistryLocatorRector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace Cake\Upgrade\Rector\Rector\MethodCall;

use PhpParser\Node;
use PhpParser\Node\Expr\StaticCall;
use Rector\Rector\AbstractRector;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

final class TableRegistryLocatorRector extends AbstractRector
{
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Refactor `TableRegistry::get()` to `TableRegistry::getTableLocator()->get()`', [
new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
TableRegistry::get('something');
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
TableRegistry::getTableLocator()->get('something');
CODE_SAMPLE
)
]);
}

public function getNodeTypes(): array
{
return [StaticCall::class];
}

public function refactor(Node $node): ?Node
{
if(! $node instanceof StaticCall) {
return null;
}

// Ensure it's a static call we're looking for: TableRegistry::get(...)
if (! $this->isStaticCallMatch($node, 'Cake\ORM\TableRegistry', 'get')) {
return null;
}

// Create new static call TableRegistry::getTableLocator()->get(...)
return $this->nodeFactory->createMethodCall(
$this->nodeFactory->createStaticCall('Cake\ORM\TableRegistry', 'getTableLocator'),
'get',
$node->args
);
}

private function isStaticCallMatch(StaticCall $staticCall, string $className, string $methodName): bool
{
// Check if the static call is `TableRegistry::get`
return $this->isName($staticCall->class, $className) && $this->isName($staticCall->name, $methodName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,9 @@ class SomeComponent extends \Cake\Controller\Component
protected $components;

protected $_defaultConfig = [];

public function tableRegistryTest(): void
{
\Cake\ORM\TableRegistry::get('MyTable');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,9 @@ class SomeComponent extends \Cake\Controller\Component
protected array $components;

protected array $_defaultConfig = [];

public function tableRegistryTest(): void
{
\Cake\ORM\TableRegistry::getTableLocator()->get('MyTable');
}
}

0 comments on commit c2f65ec

Please sign in to comment.