Skip to content

Commit fd3e742

Browse files
committed
Updated Rector to commit 4399f28
rectorphp/rector-src@4399f28 [Core] Apply CREATED_BY_RULE attribute as array collection of applied Rector rule (#1600)
1 parent b1cba49 commit fd3e742

File tree

13 files changed

+93
-57
lines changed

13 files changed

+93
-57
lines changed

rules/DeadCode/NodeAnalyzer/ExprUsedInNextNodeAnalyzer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function isUsed(\PhpParser\Node\Expr $expr) : bool
4141
}
4242
private function hasIfChangedByRemoveAlwaysElseRector(\PhpParser\Node\Stmt\If_ $if) : bool
4343
{
44-
$createdByRule = $if->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE);
45-
return $createdByRule === \Rector\EarlyReturn\Rector\If_\RemoveAlwaysElseRector::class;
44+
$createdByRule = $if->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE) ?? [];
45+
return \in_array(\Rector\EarlyReturn\Rector\If_\RemoveAlwaysElseRector::class, $createdByRule, \true);
4646
}
4747
}

rules/DowngradePhp80/Rector/FuncCall/DowngradeArrayFilterNullableCallbackRector.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,21 @@ public function refactor(\PhpParser\Node $node)
8282
if (!isset($args[1])) {
8383
return null;
8484
}
85-
$createdByRule = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE);
86-
if ($createdByRule === self::class) {
85+
$createdByRule = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE) ?? [];
86+
if (\in_array(self::class, $createdByRule, \true)) {
8787
return null;
8888
}
8989
// direct null check ConstFetch
9090
if ($args[1]->value instanceof \PhpParser\Node\Expr\ConstFetch && $this->valueResolver->isNull($args[1]->value)) {
9191
$args = [$args[0]];
9292
$node->args = $args;
93-
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, self::class);
9493
return $node;
9594
}
9695
if ($this->shouldSkipSecondArg($args[1]->value)) {
9796
return null;
9897
}
9998
$node->args[1] = new \PhpParser\Node\Arg($this->createNewArgFirstTernary($args));
10099
$node->args[2] = new \PhpParser\Node\Arg($this->createNewArgSecondTernary($args));
101-
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, self::class);
102100
return $node;
103101
}
104102
private function shouldSkipSecondArg(\PhpParser\Node\Expr $expr) : bool

rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
use PhpParser\Node\Stmt\Return_;
1414
use PhpParser\Node\Stmt\Throw_;
1515
use Rector\Core\Rector\AbstractRector;
16-
use Rector\NodeTypeResolver\Node\AttributeKey;
1716
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1817
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
1918
/**
@@ -70,7 +69,6 @@ public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
7069
$originalNode = clone $node;
7170
$if = new \PhpParser\Node\Stmt\If_($node->cond);
7271
$if->stmts = $node->stmts;
73-
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, self::class);
7472
$this->nodesToAddCollector->addNodeBeforeNode($if, $node);
7573
$this->mirrorComments($if, $node);
7674
/** @var ElseIf_ $firstElseIf */
@@ -91,7 +89,6 @@ public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
9189
if ($node->else !== null) {
9290
$this->nodesToAddCollector->addNodesAfterNode($node->else->stmts, $node);
9391
$node->else = null;
94-
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, self::class);
9592
return $node;
9693
}
9794
return null;

src/Application/VersionResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ final class VersionResolver
1616
/**
1717
* @var string
1818
*/
19-
public const PACKAGE_VERSION = '311ffc6ec3270cef54b3e243cf042d247195b6ac';
19+
public const PACKAGE_VERSION = '4399f28ee1aeec1bfe4446a97d741cee60c5eaf5';
2020
/**
2121
* @var string
2222
*/
23-
public const RELEASE_DATE = '2021-12-31 15:52:50';
23+
public const RELEASE_DATE = '2021-12-31 11:23:19';
2424
public static function resolvePackageVersion() : string
2525
{
2626
$process = new \RectorPrefix20211231\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\Core\NodeDecorator;
5+
6+
use PhpParser\Node;
7+
use Rector\NodeTypeResolver\Node\AttributeKey;
8+
final class CreatedByRuleDecorator
9+
{
10+
public function decorate(\PhpParser\Node $node, string $rectorClass) : void
11+
{
12+
$mergeCreatedByRule = \array_merge($node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE) ?? [], [$rectorClass]);
13+
$mergeCreatedByRule = \array_unique($mergeCreatedByRule);
14+
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, $mergeCreatedByRule);
15+
}
16+
}

src/PhpParser/NodeVisitor/CreatedByRuleNodeVisitor.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,27 @@
55

66
use PhpParser\Node;
77
use PhpParser\NodeVisitorAbstract;
8-
use Rector\NodeTypeResolver\Node\AttributeKey;
8+
use Rector\Core\NodeDecorator\CreatedByRuleDecorator;
99
final class CreatedByRuleNodeVisitor extends \PhpParser\NodeVisitorAbstract
1010
{
11+
/**
12+
* @readonly
13+
* @var \Rector\Core\NodeDecorator\CreatedByRuleDecorator
14+
*/
15+
private $createdByRuleDecorator;
1116
/**
1217
* @readonly
1318
* @var string
1419
*/
1520
private $rectorClass;
16-
public function __construct(string $rectorClass)
21+
public function __construct(\Rector\Core\NodeDecorator\CreatedByRuleDecorator $createdByRuleDecorator, string $rectorClass)
1722
{
23+
$this->createdByRuleDecorator = $createdByRuleDecorator;
1824
$this->rectorClass = $rectorClass;
1925
}
2026
public function enterNode(\PhpParser\Node $node)
2127
{
22-
$node->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE, $this->rectorClass);
28+
$this->createdByRuleDecorator->decorate($node, $this->rectorClass);
2329
return $node;
2430
}
2531
}

src/Rector/AbstractRector.php

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Rector\Core\Exclusion\ExclusionManager;
2727
use Rector\Core\Logging\CurrentRectorProvider;
2828
use Rector\Core\NodeAnalyzer\ChangedNodeAnalyzer;
29+
use Rector\Core\NodeDecorator\CreatedByRuleDecorator;
2930
use Rector\Core\Php\PhpVersionProvider;
3031
use Rector\Core\PhpParser\Comparing\NodeComparator;
3132
use Rector\Core\PhpParser\Node\BetterNodeFinder;
@@ -170,10 +171,14 @@ abstract class AbstractRector extends \PhpParser\NodeVisitorAbstract implements
170171
* @var \Rector\Core\ProcessAnalyzer\RectifiedAnalyzer
171172
*/
172173
private $rectifiedAnalyzer;
174+
/**
175+
* @var \Rector\Core\NodeDecorator\CreatedByRuleDecorator
176+
*/
177+
private $createdByRuleDecorator;
173178
/**
174179
* @required
175180
*/
176-
public function autowire(\Rector\PostRector\Collector\NodesToRemoveCollector $nodesToRemoveCollector, \Rector\PostRector\Collector\NodesToAddCollector $nodesToAddCollector, \Rector\NodeRemoval\NodeRemover $nodeRemover, \Rector\Core\Application\FileSystem\RemovedAndAddedFilesCollector $removedAndAddedFilesCollector, \Rector\Core\PhpParser\Printer\BetterStandardPrinter $betterStandardPrinter, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\NodeTypeResolver\NodeTypeResolver $nodeTypeResolver, \RectorPrefix20211231\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory, \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory $phpDocInfoFactory, \RectorPrefix20211231\Symfony\Component\Console\Style\SymfonyStyle $symfonyStyle, \Rector\Core\Php\PhpVersionProvider $phpVersionProvider, \Rector\Core\Exclusion\ExclusionManager $exclusionManager, \Rector\StaticTypeMapper\StaticTypeMapper $staticTypeMapper, \RectorPrefix20211231\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider, \Rector\Core\Logging\CurrentRectorProvider $currentRectorProvider, \Rector\Core\Configuration\CurrentNodeProvider $currentNodeProvider, \RectorPrefix20211231\Symplify\Skipper\Skipper\Skipper $skipper, \Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver, \Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator, \Rector\Core\Provider\CurrentFileProvider $currentFileProvider, \Rector\Core\NodeAnalyzer\ChangedNodeAnalyzer $changedNodeAnalyzer, \Rector\Core\Validation\InfiniteLoopValidator $infiniteLoopValidator, \Rector\Core\ProcessAnalyzer\RectifiedAnalyzer $rectifiedAnalyzer) : void
181+
public function autowire(\Rector\PostRector\Collector\NodesToRemoveCollector $nodesToRemoveCollector, \Rector\PostRector\Collector\NodesToAddCollector $nodesToAddCollector, \Rector\NodeRemoval\NodeRemover $nodeRemover, \Rector\Core\Application\FileSystem\RemovedAndAddedFilesCollector $removedAndAddedFilesCollector, \Rector\Core\PhpParser\Printer\BetterStandardPrinter $betterStandardPrinter, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\NodeTypeResolver\NodeTypeResolver $nodeTypeResolver, \RectorPrefix20211231\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\Core\PhpParser\Node\NodeFactory $nodeFactory, \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory $phpDocInfoFactory, \RectorPrefix20211231\Symfony\Component\Console\Style\SymfonyStyle $symfonyStyle, \Rector\Core\Php\PhpVersionProvider $phpVersionProvider, \Rector\Core\Exclusion\ExclusionManager $exclusionManager, \Rector\StaticTypeMapper\StaticTypeMapper $staticTypeMapper, \RectorPrefix20211231\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider, \Rector\Core\Logging\CurrentRectorProvider $currentRectorProvider, \Rector\Core\Configuration\CurrentNodeProvider $currentNodeProvider, \RectorPrefix20211231\Symplify\Skipper\Skipper\Skipper $skipper, \Rector\Core\PhpParser\Node\Value\ValueResolver $valueResolver, \Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator, \Rector\Core\Provider\CurrentFileProvider $currentFileProvider, \Rector\Core\NodeAnalyzer\ChangedNodeAnalyzer $changedNodeAnalyzer, \Rector\Core\Validation\InfiniteLoopValidator $infiniteLoopValidator, \Rector\Core\ProcessAnalyzer\RectifiedAnalyzer $rectifiedAnalyzer, \Rector\Core\NodeDecorator\CreatedByRuleDecorator $createdByRuleDecorator) : void
177182
{
178183
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
179184
$this->nodesToAddCollector = $nodesToAddCollector;
@@ -200,6 +205,7 @@ public function autowire(\Rector\PostRector\Collector\NodesToRemoveCollector $no
200205
$this->changedNodeAnalyzer = $changedNodeAnalyzer;
201206
$this->infiniteLoopValidator = $infiniteLoopValidator;
202207
$this->rectifiedAnalyzer = $rectifiedAnalyzer;
208+
$this->createdByRuleDecorator = $createdByRuleDecorator;
203209
}
204210
/**
205211
* @return Node[]|null
@@ -235,7 +241,12 @@ public final function enterNode(\PhpParser\Node $node)
235241
$originalAttributes = $node->getAttributes();
236242
$originalNode = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::ORIGINAL_NODE) ?? clone $node;
237243
$node = $this->refactor($node);
244+
// nothing to change → continue
245+
if ($node === null) {
246+
return null;
247+
}
238248
if (\is_array($node)) {
249+
$this->createdByRuleDecorator->decorate($originalNode, static::class);
239250
$originalNodeHash = \spl_object_hash($originalNode);
240251
$this->nodesToReturn[$originalNodeHash] = $node;
241252
if ($node !== []) {
@@ -246,29 +257,28 @@ public final function enterNode(\PhpParser\Node $node)
246257
// will be replaced in leaveNode() the original node must be passed
247258
return $originalNode;
248259
}
249-
// nothing to change → continue
250-
if (!$node instanceof \PhpParser\Node) {
251-
return null;
260+
// not changed, return node early
261+
if (!$this->changedNodeAnalyzer->hasNodeChanged($originalNode, $node)) {
262+
return $node;
252263
}
253-
// changed!
254-
if ($this->changedNodeAnalyzer->hasNodeChanged($originalNode, $node)) {
255-
$rectorWithLineChange = new \Rector\ChangesReporting\ValueObject\RectorWithLineChange(\get_class($this), $originalNode->getLine());
256-
$this->file->addRectorClassWithLine($rectorWithLineChange);
257-
// update parents relations - must run before connectParentNodes()
258-
$this->mirrorAttributes($originalAttributes, $node);
259-
$this->connectParentNodes($node);
260-
// is different node type? do not traverse children to avoid looping
261-
if (\get_class($originalNode) !== \get_class($node)) {
262-
$this->infiniteLoopValidator->process($node, $originalNode, static::class);
263-
// search "infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
264-
$originalNodeHash = \spl_object_hash($originalNode);
265-
if ($originalNode instanceof \PhpParser\Node\Stmt && $node instanceof \PhpParser\Node\Expr) {
266-
$node = new \PhpParser\Node\Stmt\Expression($node);
267-
}
268-
$this->nodesToReturn[$originalNodeHash] = $node;
269-
return $node;
270-
}
264+
$this->createdByRuleDecorator->decorate($node, static::class);
265+
$rectorWithLineChange = new \Rector\ChangesReporting\ValueObject\RectorWithLineChange(\get_class($this), $originalNode->getLine());
266+
$this->file->addRectorClassWithLine($rectorWithLineChange);
267+
// update parents relations - must run before connectParentNodes()
268+
$this->mirrorAttributes($originalAttributes, $node);
269+
$this->connectParentNodes($node);
270+
// is equals node type? return node early
271+
if (\get_class($originalNode) === \get_class($node)) {
272+
return $node;
273+
}
274+
// is different node type? do not traverse children to avoid looping
275+
$this->infiniteLoopValidator->process($node, $originalNode, static::class);
276+
// search "infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
277+
$originalNodeHash = \spl_object_hash($originalNode);
278+
if ($originalNode instanceof \PhpParser\Node\Stmt && $node instanceof \PhpParser\Node\Expr) {
279+
$node = new \PhpParser\Node\Stmt\Expression($node);
271280
}
281+
$this->nodesToReturn[$originalNodeHash] = $node;
272282
return $node;
273283
}
274284
/**

src/Validation/InfiniteLoopValidator.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PhpParser\NodeTraverser;
88
use Rector\Core\Contract\Rector\RectorInterface;
99
use Rector\Core\Exception\NodeTraverser\InfiniteLoopTraversingException;
10+
use Rector\Core\NodeDecorator\CreatedByRuleDecorator;
1011
use Rector\Core\PhpParser\Node\BetterNodeFinder;
1112
use Rector\Core\PhpParser\NodeVisitor\CreatedByRuleNodeVisitor;
1213
use Rector\DowngradePhp74\Rector\ArrowFunction\ArrowFunctionToAnonymousFunctionRector;
@@ -24,9 +25,15 @@ final class InfiniteLoopValidator
2425
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
2526
*/
2627
private $betterNodeFinder;
27-
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder)
28+
/**
29+
* @readonly
30+
* @var \Rector\Core\NodeDecorator\CreatedByRuleDecorator
31+
*/
32+
private $createdByRuleDecorator;
33+
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\Core\NodeDecorator\CreatedByRuleDecorator $createdByRuleDecorator)
2834
{
2935
$this->betterNodeFinder = $betterNodeFinder;
36+
$this->createdByRuleDecorator = $createdByRuleDecorator;
3037
}
3138
/**
3239
* @param class-string<RectorInterface> $rectorClass
@@ -36,9 +43,9 @@ public function process(\PhpParser\Node $node, \PhpParser\Node $originalNode, st
3643
if (\in_array($rectorClass, self::ALLOWED_INFINITE_RECTOR_CLASSES, \true)) {
3744
return;
3845
}
39-
$createdByRule = $originalNode->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE);
46+
$createdByRule = $originalNode->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CREATED_BY_RULE) ?? [];
4047
// special case
41-
if ($createdByRule === $rectorClass) {
48+
if (\in_array($rectorClass, $createdByRule, \true)) {
4249
// does it contain the same node type as input?
4350
$originalNodeClass = \get_class($originalNode);
4451
$hasNestedOriginalNodeType = $this->betterNodeFinder->findInstanceOf($node, $originalNodeClass);
@@ -54,7 +61,7 @@ public function process(\PhpParser\Node $node, \PhpParser\Node $originalNode, st
5461
private function decorateNode(\PhpParser\Node $node, string $rectorClass) : void
5562
{
5663
$nodeTraverser = new \PhpParser\NodeTraverser();
57-
$createdByRuleNodeVisitor = new \Rector\Core\PhpParser\NodeVisitor\CreatedByRuleNodeVisitor($rectorClass);
64+
$createdByRuleNodeVisitor = new \Rector\Core\PhpParser\NodeVisitor\CreatedByRuleNodeVisitor($this->createdByRuleDecorator, $rectorClass);
5865
$nodeTraverser->addVisitor($createdByRuleNodeVisitor);
5966
$nodeTraverser->traverse([$node]);
6067
}

vendor/autoload.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44

55
require_once __DIR__ . '/composer/autoload_real.php';
66

7-
return ComposerAutoloaderInit7f0a65a2c8923817a71d3b6fea426d18::getLoader();
7+
return ComposerAutoloaderInite97b4cfe3136a985b3f861761a5bbc76::getLoader();

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,6 +1696,7 @@
16961696
'Rector\\Core\\NodeAnalyzer\\PropertyPresenceChecker' => $baseDir . '/src/NodeAnalyzer/PropertyPresenceChecker.php',
16971697
'Rector\\Core\\NodeAnalyzer\\VariableAnalyzer' => $baseDir . '/src/NodeAnalyzer/VariableAnalyzer.php',
16981698
'Rector\\Core\\NodeAnalyzer\\VariadicAnalyzer' => $baseDir . '/src/NodeAnalyzer/VariadicAnalyzer.php',
1699+
'Rector\\Core\\NodeDecorator\\CreatedByRuleDecorator' => $baseDir . '/src/NodeDecorator/CreatedByRuleDecorator.php',
16991700
'Rector\\Core\\NodeDecorator\\NamespacedNameDecorator' => $baseDir . '/src/NodeDecorator/NamespacedNameDecorator.php',
17001701
'Rector\\Core\\NodeDecorator\\PropertyTypeDecorator' => $baseDir . '/src/NodeDecorator/PropertyTypeDecorator.php',
17011702
'Rector\\Core\\NodeManipulator\\ArrayDestructVariableFilter' => $baseDir . '/src/NodeManipulator/ArrayDestructVariableFilter.php',

0 commit comments

Comments
 (0)