Skip to content

Commit 64c9794

Browse files
[DowngradePhp74] Handle merge const on DowngradeArraySpreadStringKeyRector + DowngradeArraySpreadRector (#298)
* [DowngradePhp74] Handle merge const on DowngradeArraySpreadStringKeyRector + DowngradeArraySpreadRector * update fixture * update fixture * update fixture * remove comment * [ci-review] Rector Rectify * Fix * [ci-review] Rector Rectify * avoid invalid append * Revert "avoid invalid append" This reverts commit d2d205f. * clean up --------- Co-authored-by: GitHub Action <[email protected]>
1 parent abb7e47 commit 64c9794

File tree

2 files changed

+104
-7
lines changed

2 files changed

+104
-7
lines changed

rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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,7 +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+
$newArray->setAttributes($array->getAttributes());
178+
179+
foreach ($array->items as $item) {
180+
$newArray->items[] = $item;
170181
$type = $this->resolveItemType($item);
171182
if (! $type instanceof FullyQualifiedObjectType) {
172183
continue;
@@ -188,16 +199,16 @@ private function refactorArrayConstValue(Array_ $array): ?Array_
188199
$const = $constant->consts[0];
189200

190201
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);
202+
array_pop($newArray->items);
203+
$newArray->items = array_merge($newArray->items, $const->value->items);
193204

194205
$hasChanged = true;
195206
}
196207
}
197208
}
198209

199210
if ($hasChanged) {
200-
return $array;
211+
return $newArray;
201212
}
202213

203214
return null;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace Rector\Tests\Issues\IssueDowngradeArraySpread\Fixture;
4+
5+
use PhpCsFixer\Tokenizer\CT;
6+
use PhpCsFixer\Tokenizer\FCT;
7+
8+
class MergeConst
9+
{
10+
private const PROPERTY_TYPE_DECLARATION_KINDS = [
11+
\T_STRING,
12+
\T_NS_SEPARATOR,
13+
CT::T_NULLABLE_TYPE,
14+
CT::T_ARRAY_TYPEHINT,
15+
CT::T_TYPE_ALTERNATION,
16+
CT::T_TYPE_INTERSECTION,
17+
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN,
18+
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE
19+
];
20+
21+
private const EXPECTED_KINDS_GENERIC = [
22+
\T_ABSTRACT,
23+
\T_FINAL,
24+
\T_PRIVATE,
25+
\T_PROTECTED,
26+
\T_PUBLIC,
27+
\T_STATIC,
28+
\T_VAR,
29+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC,
30+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED,
31+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE,
32+
FCT::T_READONLY,
33+
FCT::T_PRIVATE_SET,
34+
FCT::T_PROTECTED_SET,
35+
FCT::T_PUBLIC_SET
36+
];
37+
38+
private const EXPECTED_KINDS_PROPERTY_KINDS = [
39+
...self::EXPECTED_KINDS_GENERIC,
40+
...self::PROPERTY_TYPE_DECLARATION_KINDS
41+
];
42+
}
43+
44+
?>
45+
-----
46+
<?php
47+
48+
namespace Rector\Tests\Issues\IssueDowngradeArraySpread\Fixture;
49+
50+
use PhpCsFixer\Tokenizer\CT;
51+
use PhpCsFixer\Tokenizer\FCT;
52+
53+
class MergeConst
54+
{
55+
private const PROPERTY_TYPE_DECLARATION_KINDS = [
56+
\T_STRING,
57+
\T_NS_SEPARATOR,
58+
CT::T_NULLABLE_TYPE,
59+
CT::T_ARRAY_TYPEHINT,
60+
CT::T_TYPE_ALTERNATION,
61+
CT::T_TYPE_INTERSECTION,
62+
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN,
63+
CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE
64+
];
65+
66+
private const EXPECTED_KINDS_GENERIC = [
67+
\T_ABSTRACT,
68+
\T_FINAL,
69+
\T_PRIVATE,
70+
\T_PROTECTED,
71+
\T_PUBLIC,
72+
\T_STATIC,
73+
\T_VAR,
74+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC,
75+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED,
76+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE,
77+
FCT::T_READONLY,
78+
FCT::T_PRIVATE_SET,
79+
FCT::T_PROTECTED_SET,
80+
FCT::T_PUBLIC_SET
81+
];
82+
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];
84+
}
85+
86+
?>

0 commit comments

Comments
 (0)