Skip to content

Commit 55e1b4f

Browse files
committed
Draft: lets try and renameclassrector with configuration, not sure this will work.
1 parent 37670e2 commit 55e1b4f

File tree

6 files changed

+240
-0
lines changed

6 files changed

+240
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DrupalRector\Drupal10\Rector\Deprecation;
6+
7+
use DrupalRector\Contract\VersionedConfigurationInterface;
8+
use DrupalRector\Drupal10\Rector\ValueObject\RenameClassRectorConfiguration;
9+
use DrupalRector\Rector\AbstractDrupalCoreRector;
10+
use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration;
11+
use PhpParser\Node;
12+
use PhpParser\Node\FunctionLike;
13+
use PhpParser\Node\Name\FullyQualified;
14+
use PhpParser\Node\Stmt\ClassLike;
15+
use PhpParser\Node\Stmt\Expression;
16+
use PhpParser\Node\Stmt\If_;
17+
use PhpParser\Node\Stmt\Property;
18+
use Rector\Configuration\RenamedClassesDataCollector;
19+
use Rector\NodeTypeResolver\Node\AttributeKey;
20+
use Rector\Renaming\NodeManipulator\ClassRenamer;
21+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
22+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
23+
24+
class RenameClassRector extends AbstractDrupalCoreRector
25+
{
26+
/**
27+
* @var array|DrupalIntroducedVersionConfiguration[]
28+
*/
29+
protected array $configuration;
30+
31+
/**
32+
* @readonly
33+
*
34+
* @var RenamedClassesDataCollector
35+
*/
36+
private $renamedClassesDataCollector;
37+
/**
38+
* @readonly
39+
*
40+
* @var ClassRenamer
41+
*/
42+
private $classRenamer;
43+
44+
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer)
45+
{
46+
$this->renamedClassesDataCollector = $renamedClassesDataCollector;
47+
$this->classRenamer = $classRenamer;
48+
}
49+
50+
/**
51+
* {@inheritdoc}
52+
*/
53+
public function getNodeTypes(): array
54+
{
55+
return [FullyQualified::class, Property::class, FunctionLike::class, Expression::class, ClassLike::class, If_::class];
56+
}
57+
58+
public function configure(array $configuration): void
59+
{
60+
foreach ($configuration as $value) {
61+
if (!($value instanceof RenameClassRectorConfiguration)) {
62+
throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', RenameClassRectorConfiguration::class));
63+
}
64+
}
65+
66+
parent::configure($configuration);
67+
}
68+
69+
public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration)
70+
{
71+
$oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses();
72+
if ($oldToNewClasses !== []) {
73+
/** @var \PHPStan\Analyser\Scope $scope */
74+
$scope = $node->getAttribute(AttributeKey::SCOPE);
75+
$return = $this->classRenamer->renameNode($node, $oldToNewClasses, $scope);
76+
if (!is_null($return)) {
77+
$scope->getFile();
78+
79+
return $return;
80+
}
81+
}
82+
83+
return null;
84+
}
85+
86+
/**
87+
* {@inheritdoc}
88+
*/
89+
public function getRuleDefinition(): RuleDefinition
90+
{
91+
return new RuleDefinition('Fixes deprecated watchdog_exception(\'update\', $exception) calls', [
92+
new ConfiguredCodeSample(
93+
<<<'CODE_BEFORE'
94+
watchdog_exception('update', $exception);
95+
CODE_BEFORE
96+
,
97+
<<<'CODE_AFTER'
98+
use \Drupal\Core\Utility\Error;
99+
$logger = \Drupal::logger('update');
100+
Error::logException($logger, $exception);
101+
CODE_AFTER
102+
,
103+
[
104+
new DrupalIntroducedVersionConfiguration('10.1.0'),
105+
]
106+
),
107+
]);
108+
}
109+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DrupalRector\Drupal10\Rector\ValueObject;
6+
7+
use DrupalRector\Contract\VersionedConfigurationInterface;
8+
9+
class RenameClassRectorConfiguration implements VersionedConfigurationInterface
10+
{
11+
private string $introducedVersion;
12+
13+
private string $oldClass;
14+
15+
private string $newClass;
16+
17+
public function __construct(string $introducedVersion, string $oldClass, string $newClass)
18+
{
19+
$this->introducedVersion = $introducedVersion;
20+
$this->oldClass = $oldClass;
21+
$this->newClass = $newClass;
22+
}
23+
24+
public function getIntroducedVersion(): string
25+
{
26+
return $this->introducedVersion;
27+
}
28+
29+
public function getOldClass(): string
30+
{
31+
return $this->oldClass;
32+
}
33+
34+
public function getNewClass(): string
35+
{
36+
return $this->newClass;
37+
}
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\WatchdogExceptionRector;
6+
7+
use Iterator;
8+
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
9+
10+
class RenameClassRectorTest extends AbstractRectorTestCase
11+
{
12+
/**
13+
* @covers ::refactor
14+
*
15+
* @dataProvider provideData
16+
*/
17+
public function test(string $filePath): void
18+
{
19+
$this->doTestFile($filePath);
20+
}
21+
22+
/**
23+
* @return Iterator<<string>>
24+
*/
25+
public static function provideData(): \Iterator
26+
{
27+
return self::yieldFilesFromDirectory(__DIR__.'/fixture');
28+
}
29+
30+
public function provideConfigFilePath(): string
31+
{
32+
// must be implemented
33+
return __DIR__.'/config/configured_rule.php';
34+
}
35+
}
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 DrupalRector\Drupal10\Rector\ValueObject\RenameClassRectorConfiguration;
6+
use DrupalRector\Tests\Rector\Deprecation\DeprecationBase;
7+
use Rector\Config\RectorConfig;
8+
9+
return static function (RectorConfig $rectorConfig): void {
10+
DeprecationBase::addClass(DrupalRector\Drupal10\Rector\Deprecation\RenameClassRector::class, $rectorConfig, false, [
11+
new RenameClassRectorConfiguration('10.1.0', 'Drupal\\Tests\\field\\Traits\\EntityReferenceTestTrait', 'Drupal\\Tests\\field\\Traits\\EntityReferenceFieldCreationTrait'),
12+
new RenameClassRectorConfiguration('10.1.0', 'Drupal\\OldClass', 'Drupal\\NewClass'),
13+
]);
14+
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
4+
5+
class EntityReferenceItemTest extends FieldKernelTestBase {
6+
7+
use EntityReferenceTestTrait;
8+
9+
}
10+
11+
?>
12+
-----
13+
<?php
14+
15+
use Drupal\Tests\field\Traits\EntityReferenceFieldCreationTrait;
16+
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
17+
18+
class EntityReferenceItemTest extends FieldKernelTestBase {
19+
20+
use EntityReferenceFieldCreationTrait;
21+
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
4+
5+
class EntityReferenceItemTest extends FieldKernelTestBase {
6+
7+
protected \Drupal\OldClass $class;
8+
9+
}
10+
11+
?>
12+
-----
13+
<?php
14+
15+
use Drupal\Tests\field\Traits\EntityReferenceFieldCreationTrait;
16+
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
17+
18+
class EntityReferenceItemTest extends FieldKernelTestBase {
19+
20+
protected \Drupal\NewClass $class;
21+
22+
}

0 commit comments

Comments
 (0)