Skip to content

Commit ffb6316

Browse files
authored
Move beforeTraverse() to global Node since beforeTraverse() not overrideable (#443)
* Move beforeTraverse() to global Node since beforeTraverse() not overrideable * bump to rector ^2.2.13 * Fix code compatible
1 parent 12b1574 commit ffb6316

File tree

7 files changed

+113
-129
lines changed

7 files changed

+113
-129
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"description": "Rector upgrades rules for Laravel Framework",
66
"require": {
77
"php": ">=8.3",
8-
"rector/rector": "^2.2.7",
8+
"rector/rector": "^2.2.13",
99
"webmozart/assert": "^1.11",
1010
"symplify/rule-doc-generator-contracts": "^11.2"
1111
},

src/NodeAnalyzer/ExpectedClassMethodAnalyzer.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
final readonly class ExpectedClassMethodAnalyzer
1919
{
2020
public function __construct(
21-
private SimpleCallableNodeTraverser $simpleCallableNodeTraverser,
2221
private NodeNameResolver $nodeNameResolver,
2322
private NodeTypeResolver $nodeTypeResolver,
2423
) {}
@@ -31,7 +30,7 @@ public function findExpectedJobCallsWithClassMethod(ClassMethod $classMethod): ?
3130
$notExpectedMethodCalls = [];
3231
$reasonsToNotContinue = false;
3332

34-
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (Node $node) use (
33+
SimpleCallableNodeTraverser::traverseNodesWithCallable($classMethod, function (Node $node) use (
3534
&$expectedMethodCalls,
3635
&$notExpectedMethodCalls,
3736
&$reasonsToNotContinue,
@@ -87,7 +86,7 @@ public function findExpectedEventCallsWithClassMethod(ClassMethod $classMethod):
8786
$notExpectedMethodCalls = [];
8887
$reasonsToNotContinue = false;
8988

90-
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (Node $node) use (
89+
SimpleCallableNodeTraverser::traverseNodesWithCallable($classMethod, function (Node $node) use (
9190
&$expectedMethodCalls,
9291
&$notExpectedMethodCalls,
9392
&$reasonsToNotContinue,

src/NodeFactory/ModelFactoryNodeFactory.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public function __construct(
3434
private NodeNameResolver $nodeNameResolver,
3535
private NodeFactory $nodeFactory,
3636
private ValueResolver $valueResolver,
37-
private SimpleCallableNodeTraverser $simpleCallableNodeTraverser
3837
) {}
3938

4039
public function createEmptyFactory(string $name, Expr $expr): Class_
@@ -116,7 +115,7 @@ public function createEmptyConfigure(): ClassMethod
116115

117116
public function appendConfigure(ClassMethod $classMethod, string $name, Closure|ArrowFunction $callable): void
118117
{
119-
$this->simpleCallableNodeTraverser->traverseNodesWithCallable(
118+
SimpleCallableNodeTraverser::traverseNodesWithCallable(
120119
(array) $classMethod->stmts,
121120
function (Node $node) use ($callable, $name): ?Return_ {
122121
if (! $node instanceof Return_) {
@@ -145,7 +144,7 @@ function (Node $node) use ($callable, $name): ?Return_ {
145144
*/
146145
private function fakerVariableToPropertyFetch(array $stmts, Param $param): void
147146
{
148-
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use (
147+
SimpleCallableNodeTraverser::traverseNodesWithCallable($stmts, function (Node $node) use (
149148
$param
150149
): ?PropertyFetch {
151150
if (! $node instanceof Variable) {

src/Rector/ArrayDimFetch/RequestVariablesToRequestFacadeRector.php

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace RectorLaravel\Rector\ArrayDimFetch;
44

5-
use Override;
65
use PhpParser\Node;
76
use PhpParser\Node\Arg;
87
use PhpParser\Node\Expr;
@@ -13,6 +12,8 @@
1312
use PhpParser\Node\Expr\Variable;
1413
use PhpParser\Node\Scalar;
1514
use PhpParser\Node\Scalar\String_;
15+
use PHPStan\Analyser\Scope;
16+
use Rector\NodeTypeResolver\Node\AttributeKey;
1617
use RectorLaravel\AbstractRector;
1718
use RectorLaravel\ValueObject\ReplaceRequestKeyAndMethodValue;
1819
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@@ -58,44 +59,39 @@ public function getRuleDefinition(): RuleDefinition
5859
);
5960
}
6061

61-
#[Override]
62-
public function beforeTraverse(array $nodes): array
62+
public function getNodeTypes(): array
63+
{
64+
return [Node::class, ArrayDimFetch::class, Variable::class, Isset_::class];
65+
}
66+
67+
public function refactor(Node $node): StaticCall|NotIdentical|null
6368
{
64-
parent::beforeTraverse($nodes);
69+
if (! $node instanceof ArrayDimFetch && ! $node instanceof Variable && ! $node instanceof Isset_) {
70+
$scope = $node->getAttribute(AttributeKey::SCOPE);
71+
if ($scope instanceof Scope && $scope->isInFirstLevelStatement()) {
72+
$this->traverseNodesWithCallable($node, function (Node $subNode) {
73+
if ($subNode instanceof ArrayDimFetch) {
6574

66-
$this->traverseNodesWithCallable($nodes, function (Node $node) {
67-
if ($node instanceof ArrayDimFetch) {
75+
if ($subNode->dim instanceof Scalar) {
76+
return null;
77+
}
6878

69-
if ($node->dim instanceof Scalar) {
70-
return null;
71-
}
79+
$this->traverseNodesWithCallable($subNode, function (Node $subSubNode) {
80+
if ($subSubNode instanceof Variable) {
81+
$subSubNode->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_SCALAR, true);
7282

73-
$this->traverseNodesWithCallable($node, function (Node $subNode) {
74-
if ($subNode instanceof Variable) {
75-
$subNode->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_SCALAR, true);
83+
return $subSubNode;
84+
}
7685

77-
return $subNode;
86+
return null;
87+
});
7888
}
79-
80-
return null;
8189
});
8290
}
83-
});
8491

85-
return $nodes;
86-
}
87-
88-
public function getNodeTypes(): array
89-
{
90-
return [ArrayDimFetch::class, Variable::class, Isset_::class];
91-
}
92+
return null;
93+
}
9294

93-
/**
94-
* @param ArrayDimFetch|Variable $node
95-
* @return StaticCall|NotIdentical|1|null
96-
*/
97-
public function refactor(Node $node): StaticCall|NotIdentical|int|null
98-
{
9995
if ($node instanceof Variable) {
10096
if ($node->getAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_SCALAR) === true) {
10197
return null;
@@ -121,10 +117,7 @@ public function refactor(Node $node): StaticCall|NotIdentical|int|null
121117
return $replaceValue;
122118
}
123119

124-
/**
125-
* @return ReplaceRequestKeyAndMethodValue|1|null
126-
*/
127-
public function findAllKeys(ArrayDimFetch $arrayDimFetch): ReplaceRequestKeyAndMethodValue|int|null
120+
public function findAllKeys(ArrayDimFetch $arrayDimFetch): ?ReplaceRequestKeyAndMethodValue
128121
{
129122
if (! $arrayDimFetch->dim instanceof Scalar) {
130123
return null;
@@ -177,10 +170,7 @@ private function getGetterMethodName(Variable $variable): ?string
177170
};
178171
}
179172

180-
/**
181-
* @return StaticCall|NotIdentical|1|null
182-
*/
183-
private function processIsset(Isset_ $isset): StaticCall|NotIdentical|int|null
173+
private function processIsset(Isset_ $isset): StaticCall|NotIdentical|null
184174
{
185175
if (count($isset->vars) < 1) {
186176
return null;

src/Rector/ArrayDimFetch/ServerVariableToRequestFacadeRector.php

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace RectorLaravel\Rector\ArrayDimFetch;
44

5-
use Override;
65
use PhpParser\Node;
76
use PhpParser\Node\Arg;
87
use PhpParser\Node\Expr;
@@ -12,6 +11,8 @@
1211
use PhpParser\Node\Expr\StaticCall;
1312
use PhpParser\Node\Scalar\InterpolatedString;
1413
use PhpParser\Node\Stmt\Unset_;
14+
use PHPStan\Analyser\Scope;
15+
use Rector\NodeTypeResolver\Node\AttributeKey;
1516
use RectorLaravel\AbstractRector;
1617
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1718
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -40,41 +41,37 @@ public function getRuleDefinition(): RuleDefinition
4041

4142
public function getNodeTypes(): array
4243
{
43-
return [ArrayDimFetch::class];
44+
return [Node::class, ArrayDimFetch::class];
4445
}
4546

46-
#[Override]
47-
public function beforeTraverse(array $nodes): array
47+
public function refactor(Node $node): ?StaticCall
4848
{
49-
parent::beforeTraverse($nodes);
50-
51-
$this->traverseNodesWithCallable($nodes, function (Node $node) {
52-
if (in_array($node::class, [Assign::class, Isset_::class, Unset_::class, InterpolatedString::class], true)
53-
&& (! $node instanceof Assign || $node->var instanceof ArrayDimFetch && $this->isName($node->var->var, '_SERVER'))) {
49+
if (! $node instanceof ArrayDimFetch) {
50+
$scope = $node->getAttribute(AttributeKey::SCOPE);
51+
if ($scope instanceof Scope && $scope->isInFirstLevelStatement()) {
5452
$this->traverseNodesWithCallable($node, function (Node $subNode) {
55-
if (! $subNode instanceof ArrayDimFetch) {
56-
return null;
57-
}
53+
if (in_array($subNode::class, [Assign::class, Isset_::class, Unset_::class, InterpolatedString::class], true)
54+
&& (! $subNode instanceof Assign || $subNode->var instanceof ArrayDimFetch && $this->isName($subNode->var->var, '_SERVER'))) {
55+
$this->traverseNodesWithCallable($subNode, function (Node $subSubNode) {
56+
if (! $subSubNode instanceof ArrayDimFetch) {
57+
return null;
58+
}
5859

59-
$subNode->setAttribute(self::IS_IN_SERVER_VARIABLE, true);
60+
$subSubNode->setAttribute(self::IS_IN_SERVER_VARIABLE, true);
6061

61-
return $subNode;
62-
});
62+
return $subSubNode;
63+
});
64+
65+
return $subNode;
66+
}
6367

64-
return $node;
68+
return null;
69+
});
6570
}
6671

6772
return null;
68-
});
69-
70-
return $nodes;
71-
}
73+
}
7274

73-
/**
74-
* @param ArrayDimFetch $node
75-
*/
76-
public function refactor(Node $node): ?StaticCall
77-
{
7875
if (! $this->isName($node->var, '_SERVER')) {
7976
return null;
8077
}

src/Rector/ArrayDimFetch/SessionVariableToSessionFacadeRector.php

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace RectorLaravel\Rector\ArrayDimFetch;
44

5-
use Override;
65
use PhpParser\Node;
76
use PhpParser\Node\Arg;
87
use PhpParser\Node\Expr;
@@ -14,6 +13,8 @@
1413
use PhpParser\Node\Expr\Variable;
1514
use PhpParser\Node\Stmt\Expression;
1615
use PhpParser\Node\Stmt\Unset_;
16+
use PHPStan\Analyser\Scope;
17+
use Rector\NodeTypeResolver\Node\AttributeKey;
1718
use RectorLaravel\AbstractRector;
1819
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1920
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -56,40 +57,10 @@ public function getRuleDefinition(): RuleDefinition
5657
);
5758
}
5859

59-
#[Override]
60-
public function beforeTraverse(array $nodes): array
61-
{
62-
parent::beforeTraverse($nodes);
63-
64-
$this->traverseNodesWithCallable($nodes, function (Node $node) {
65-
if (! $node instanceof ArrayDimFetch) {
66-
return null;
67-
}
68-
69-
if (! $node->dim instanceof Expr) {
70-
$node->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_EXPR, true);
71-
$this->traverseNodesWithCallable($node, function (Node $subNode) {
72-
if (! $subNode instanceof Variable) {
73-
return null;
74-
}
75-
76-
$subNode->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_EXPR, true);
77-
78-
return $subNode;
79-
});
80-
81-
return $node;
82-
}
83-
84-
return null;
85-
});
86-
87-
return $nodes;
88-
}
89-
9060
public function getNodeTypes(): array
9161
{
9262
return [
63+
Node::class,
9364
Isset_::class,
9465
Unset_::class,
9566
ArrayDimFetch::class,
@@ -104,6 +75,36 @@ public function getNodeTypes(): array
10475
*/
10576
public function refactor(Node $node): StaticCall|Expression|null
10677
{
78+
$scope = $node->getAttribute(AttributeKey::SCOPE);
79+
if ($scope instanceof Scope && $scope->isInFirstLevelStatement()) {
80+
$this->traverseNodesWithCallable($node, function (Node $subNode) {
81+
if (! $subNode instanceof ArrayDimFetch) {
82+
return null;
83+
}
84+
85+
if (! $subNode->dim instanceof Expr) {
86+
$subNode->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_EXPR, true);
87+
$this->traverseNodesWithCallable($subNode, function (Node $subSubNode) {
88+
if (! $subSubNode instanceof Variable) {
89+
return null;
90+
}
91+
92+
$subSubNode->setAttribute(self::IS_INSIDE_ARRAY_DIM_FETCH_WITH_DIM_NOT_EXPR, true);
93+
94+
return $subSubNode;
95+
});
96+
97+
return $subNode;
98+
}
99+
100+
return null;
101+
});
102+
}
103+
104+
if (! $node instanceof Isset_ && ! $node instanceof Unset_ && ! $node instanceof ArrayDimFetch && ! $node instanceof Assign && ! $node instanceof FuncCall && ! $node instanceof Variable) {
105+
return null;
106+
}
107+
107108
if ($node instanceof ArrayDimFetch) {
108109
return $this->processDimFetch($node);
109110
}

0 commit comments

Comments
 (0)