Skip to content

Commit 4f36984

Browse files
committed
Fix
1 parent 221d5c8 commit 4f36984

File tree

3 files changed

+19
-37
lines changed

3 files changed

+19
-37
lines changed

rules-tests/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector/Fixture/on_class_constant.php.inc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@ abstract class OnClassConstant
2424
{
2525
private const TYPE_END_TOKENS = [')', [T_CALLABLE], [T_NS_SEPARATOR], [T_STATIC], [T_STRING], [CT::T_ARRAY_TYPEHINT]];
2626

27-
private const TYPE_TOKENS = [
28-
'|', '&', '(', ')', [T_CALLABLE], [T_NS_SEPARATOR], [T_STATIC], [T_STRING], [CT::T_ARRAY_TYPEHINT],
29-
[CT::T_TYPE_ALTERNATION], [CT::T_TYPE_INTERSECTION],
30-
[T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT],
31-
];
27+
private const TYPE_TOKENS = ['|', '&', '(', ')', [T_CALLABLE], [T_NS_SEPARATOR], [T_STATIC], [T_STRING], [CT::T_ARRAY_TYPEHINT], [CT::T_TYPE_ALTERNATION], [CT::T_TYPE_INTERSECTION], [T_WHITESPACE], [T_COMMENT], [T_DOC_COMMENT]];
3228
}
3329

3430
?>

rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use PhpParser\Node\Name;
1313
use PhpParser\Node\Stmt\ClassConst;
1414
use PhpParser\Node\Stmt\ClassLike;
15-
use PHPStan\Analyser\MutatingScope;
1615
use PHPStan\Type\Type;
1716
use Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer;
1817
use Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory;
@@ -23,6 +22,7 @@
2322
use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
2423
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
2524
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
25+
use PHPStan\Analyser\MutatingScope;
2626

2727
/**
2828
* @changelog https://wiki.php.net/rfc/spread_operator_for_array
@@ -123,12 +123,19 @@ private function refactorUnderClassConst(ClassConst $classConst): ?ClassConst
123123

124124
$hasChanged = false;
125125

126-
foreach ($arrays as $array) {
127-
$refactorArrayConstValue = $this->refactorArrayConstValue($array);
126+
$this->traverseNodesWithCallable($classConst->consts, function (Node $subNode) use (&$hasChanged): ?Node {
127+
if (! $subNode instanceof Array_) {
128+
return null;
129+
}
130+
131+
$refactorArrayConstValue = $this->refactorArrayConstValue($subNode);
128132
if ($refactorArrayConstValue instanceof Array_) {
129133
$hasChanged = true;
134+
return $refactorArrayConstValue;
130135
}
131-
}
136+
137+
return null;
138+
});
132139

133140
if ($hasChanged) {
134141
return $classConst;
@@ -166,9 +173,11 @@ private function refactorArrayConstValue(Array_ $array): ?Array_
166173
{
167174
$hasChanged = false;
168175

169-
foreach ($array->items as $key => $item) {
176+
$newArray = new Array_();
177+
foreach ($array->items as $item) {
170178
$type = $this->resolveItemType($item);
171179
if (! $type instanceof FullyQualifiedObjectType) {
180+
$newArray->items[] = $item;
172181
continue;
173182
}
174183

@@ -179,6 +188,7 @@ private function refactorArrayConstValue(Array_ $array): ?Array_
179188
/** @var Identifier $name */
180189
$classLike = $this->astResolver->resolveClassFromName($type->getClassName());
181190
if (! $classLike instanceof ClassLike) {
191+
$newArray->items[] = $item;
182192
continue;
183193
}
184194

@@ -188,16 +198,15 @@ private function refactorArrayConstValue(Array_ $array): ?Array_
188198
$const = $constant->consts[0];
189199

190200
if ($const->name->toString() === $name->toString() && $const->value instanceof Array_) {
191-
unset($array->items[$key]);
192-
array_splice($array->items, $key, 0, $const->value->items);
201+
$newArray->items = array_merge($newArray->items, $const->value->items);
193202

194203
$hasChanged = true;
195204
}
196205
}
197206
}
198207

199208
if ($hasChanged) {
200-
return $array;
209+
return $newArray;
201210
}
202211

203212
return null;

tests/Issues/IssueDowngradeArraySpread/Fixture/merge_const.php.inc

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -80,30 +80,7 @@ class MergeConst
8080
FCT::T_PUBLIC_SET
8181
];
8282

83-
private const EXPECTED_KINDS_PROPERTY_KINDS = [
84-
\T_ABSTRACT,
85-
\T_FINAL,
86-
\T_PRIVATE,
87-
\T_PROTECTED,
88-
\T_PUBLIC,
89-
\T_STATIC,
90-
\T_VAR,
91-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC,
92-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED,
93-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE,
94-
FCT::T_READONLY,
95-
FCT::T_PRIVATE_SET,
96-
FCT::T_PROTECTED_SET,
97-
FCT::T_PUBLIC_SET,
98-
\T_STRING,
99-
\T_NS_SEPARATOR,
100-
CT::T_NULLABLE_TYPE,
101-
CT::T_ARRAY_TYPEHINT,
102-
CT::T_TYPE_ALTERNATION,
103-
CT::T_TYPE_INTERSECTION,
104-
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN,
105-
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE
106-
];
83+
private const EXPECTED_KINDS_PROPERTY_KINDS = [\T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_STATIC, \T_VAR, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE, FCT::T_READONLY, FCT::T_PRIVATE_SET, FCT::T_PROTECTED_SET, FCT::T_PUBLIC_SET, \T_STRING, \T_NS_SEPARATOR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE];
10784
}
10885

10986
?>

0 commit comments

Comments
 (0)