From e52657e9b05b47332be59e4ea635a6168e383275 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 3 Aug 2026 17:16:53 +0200 Subject: [PATCH] [CodingStyle] Deprecate ArraySpreadInsteadOfArrayMergeRector, as personal preference that makes array merges harder to read --- ..._explicit_array_and_explicit_array.php.inc | 27 ---- ...latten_explicit_array_and_variable.php.inc | 31 ---- ...latten_variable_and_explicit_array.php.inc | 31 ---- .../FixturePhp74/integer_keys.php.inc | 33 ---- ...kip_doblock_based_type_array_merge.php.inc | 15 -- .../FixturePhp74/skip_get_iterator.php.inc | 16 -- .../skip_iterator_to_array.php.inc | 13 -- .../FixturePhp74/skip_parse_url.php.inc | 21 --- .../skip_simple_array_merge.php.inc | 11 -- .../skip_spread_array_merge.php.inc | 20 --- .../FixturePhp74/skip_string_keys.php.inc | 22 --- .../skip_string_keys_from_functions.php.inc | 20 --- .../FixturePhp81/any_key.php.inc | 65 -------- ..._explicit_array_and_explicit_array.php.inc | 27 ---- ...latten_explicit_array_and_variable.php.inc | 31 ---- ...latten_variable_and_explicit_array.php.inc | 31 ---- .../FixturePhp81/integer_keys.php.inc | 33 ---- .../FixturePhp81/parse_url.php.inc | 45 ------ .../FixturePhp81/simple_array_merge.php.inc | 27 ---- .../skip_first_class_callable.php.inc | 11 -- .../FixturePhp81/skip_get_iterator.php.inc | 16 -- .../skip_iterator_to_array.php.inc | 13 -- .../skip_spread_array_merge.php.inc | 20 --- .../FixturePhp81/string_keys.php.inc | 47 ------ .../string_keys_from_functions.php.inc | 45 ------ ...raySpreadInsteadOfArrayMergeRectorTest.php | 28 ---- ...raySpreadInsteadOfArrayMergeRectorTest.php | 28 ---- .../config/configured_rule_php74.php | 12 -- .../config/configured_rule_php81.php | 12 -- .../ArraySpreadInsteadOfArrayMergeRector.php | 142 +----------------- 30 files changed, 8 insertions(+), 885 deletions(-) delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_explicit_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_variable.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_variable_and_explicit_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/integer_keys.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_doblock_based_type_array_merge.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_get_iterator.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_iterator_to_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_parse_url.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_simple_array_merge.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_spread_array_merge.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_string_keys.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_string_keys_from_functions.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/any_key.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_explicit_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_variable.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_variable_and_explicit_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/integer_keys.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/parse_url.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/simple_array_merge.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_first_class_callable.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_get_iterator.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_iterator_to_array.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_spread_array_merge.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/string_keys.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/string_keys_from_functions.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php74ArraySpreadInsteadOfArrayMergeRectorTest.php delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php81ArraySpreadInsteadOfArrayMergeRectorTest.php delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php74.php delete mode 100644 rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php81.php diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_explicit_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_explicit_array.php.inc deleted file mode 100644 index 53bc84db9a3..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_explicit_array.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_variable.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_variable.php.inc deleted file mode 100644 index fbfe131c566..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_explicit_array_and_variable.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_variable_and_explicit_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_variable_and_explicit_array.php.inc deleted file mode 100644 index 9939c19ccd7..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/flatten_variable_and_explicit_array.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/integer_keys.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/integer_keys.php.inc deleted file mode 100644 index 7247b1847e2..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/integer_keys.php.inc +++ /dev/null @@ -1,33 +0,0 @@ - 'two', 3 => 'four']; - $iter2 = [5 => 'six', 7 => 'eight']; - - return array_merge($iter1, $iter2); - } -} - -?> ------ - 'two', 3 => 'four']; - $iter2 = [5 => 'six', 7 => 'eight']; - - return [...$iter1, ...$iter2]; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_doblock_based_type_array_merge.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_doblock_based_type_array_merge.php.inc deleted file mode 100644 index f70373dfaf8..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_doblock_based_type_array_merge.php.inc +++ /dev/null @@ -1,15 +0,0 @@ - $iter1 - * @param array $iter2 - */ - public function run($iter1, $iter2) - { - $values = array_merge($iter1, $iter2); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_get_iterator.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_get_iterator.php.inc deleted file mode 100644 index 6832db354a1..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_get_iterator.php.inc +++ /dev/null @@ -1,16 +0,0 @@ -files() - ->in(__DIR__ . '/Source'); - - $files = iterator_to_array($finder->getIterator()); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_iterator_to_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_iterator_to_array.php.inc deleted file mode 100644 index e1b83677e7a..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_iterator_to_array.php.inc +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_parse_url.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_parse_url.php.inc deleted file mode 100644 index 3b2190acd04..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_parse_url.php.inc +++ /dev/null @@ -1,21 +0,0 @@ -parseUrl($url), $this->parseUrl($redirectLocation)); - } - - /** - * @return array - */ - private function parseUrl(string $url): array - { - $urlParts = parse_url($url); - - return array_filter($urlParts); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_simple_array_merge.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_simple_array_merge.php.inc deleted file mode 100644 index 090982fa4c7..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_simple_array_merge.php.inc +++ /dev/null @@ -1,11 +0,0 @@ - 'two', 'three' => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return array_merge($iter1, $iter2); - } - - public function go() - { - $iter1 = [1 => 'two', 3 => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return array_merge($iter1, $iter2); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_string_keys_from_functions.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_string_keys_from_functions.php.inc deleted file mode 100644 index ec11183a35e..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp74/skip_string_keys_from_functions.php.inc +++ /dev/null @@ -1,20 +0,0 @@ -1]; -} -function y(): array -{ - return ['a'=>1]; -} - -class SkipStringKeysFromFunctions -{ - public function run() - { - return array_merge(y(), x()); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/any_key.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/any_key.php.inc deleted file mode 100644 index bd9f366fa44..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/any_key.php.inc +++ /dev/null @@ -1,65 +0,0 @@ - - */ - public function getA(): array - { - return [1, 2, 3]; - } - - /** - * @return array - */ - public function getB(): array - { - return [4, 5, 6]; - } - - public function run() - { - $a = $this->getA(); - $b = $this->getB(); - - return array_merge($a, $b); - } -} - -?> ------ - - */ - public function getA(): array - { - return [1, 2, 3]; - } - - /** - * @return array - */ - public function getB(): array - { - return [4, 5, 6]; - } - - public function run() - { - $a = $this->getA(); - $b = $this->getB(); - - return [...$a, ...$b]; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_explicit_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_explicit_array.php.inc deleted file mode 100644 index 83c865bf1b3..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_explicit_array.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - 'bar'], ['baz' => 'xxx']); - } -} - -?> ------ - 'bar', 'baz' => 'xxx']; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_variable.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_variable.php.inc deleted file mode 100644 index d53dd08a44b..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_explicit_array_and_variable.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - 'bar']; - - return array_merge(['baz' => 'xxx'], $array); - } -} - -?> ------ - 'bar']; - - return ['baz' => 'xxx', ...$array]; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_variable_and_explicit_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_variable_and_explicit_array.php.inc deleted file mode 100644 index 6530ce73db0..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/flatten_variable_and_explicit_array.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - 'bar']; - - return array_merge($array, ['baz' => 'xxx']); - } -} - -?> ------ - 'bar']; - - return [...$array, 'baz' => 'xxx']; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/integer_keys.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/integer_keys.php.inc deleted file mode 100644 index fa5dc5e62db..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/integer_keys.php.inc +++ /dev/null @@ -1,33 +0,0 @@ - 'two', 3 => 'four']; - $iter2 = [5 => 'six', 7 => 'eight']; - - return array_merge($iter1, $iter2); - } -} - -?> ------ - 'two', 3 => 'four']; - $iter2 = [5 => 'six', 7 => 'eight']; - - return [...$iter1, ...$iter2]; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/parse_url.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/parse_url.php.inc deleted file mode 100644 index 189a49be610..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/parse_url.php.inc +++ /dev/null @@ -1,45 +0,0 @@ -parseUrl($url), $this->parseUrl($redirectLocation)); - } - - /** - * @return array - */ - private function parseUrl(string $url): array - { - $urlParts = parse_url($url); - - return array_filter($urlParts); - } -} -?> ------ -parseUrl($url), ...$this->parseUrl($redirectLocation)]; - } - - /** - * @return array - */ - private function parseUrl(string $url): array - { - $urlParts = parse_url($url); - - return array_filter($urlParts); - } -} -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/simple_array_merge.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/simple_array_merge.php.inc deleted file mode 100644 index 82c80916eb9..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/simple_array_merge.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_first_class_callable.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_first_class_callable.php.inc deleted file mode 100644 index cc09041409d..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_first_class_callable.php.inc +++ /dev/null @@ -1,11 +0,0 @@ -files() - ->in(__DIR__ . '/Source'); - - $files = iterator_to_array($finder->getIterator()); - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_iterator_to_array.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_iterator_to_array.php.inc deleted file mode 100644 index 81e624e5da7..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_iterator_to_array.php.inc +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_spread_array_merge.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_spread_array_merge.php.inc deleted file mode 100644 index b19b82b23d7..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/skip_spread_array_merge.php.inc +++ /dev/null @@ -1,20 +0,0 @@ - 'two', 'three' => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return array_merge($iter1, $iter2); - } - - public function go() - { - $iter1 = [1 => 'two', 3 => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return array_merge($iter1, $iter2); - } -} -?> ------ - 'two', 'three' => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return [...$iter1, ...$iter2]; - } - - public function go() - { - $iter1 = [1 => 'two', 3 => 'four']; - $iter2 = ['five' => 'six', 'seven' => 'eight']; - - return [...$iter1, ...$iter2]; - } -} -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/string_keys_from_functions.php.inc b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/string_keys_from_functions.php.inc deleted file mode 100644 index 36252c49c5c..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/FixturePhp81/string_keys_from_functions.php.inc +++ /dev/null @@ -1,45 +0,0 @@ -1]; -} -function y(): array -{ - return ['a'=>1]; -} - -class StringKeysFromFunctions -{ - public function run() - { - return array_merge(y(), x()); - } -} - -?> ------ -1]; -} -function y(): array -{ - return ['a'=>1]; -} - -class StringKeysFromFunctions -{ - public function run() - { - return [...y(), ...x()]; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php74ArraySpreadInsteadOfArrayMergeRectorTest.php b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php74ArraySpreadInsteadOfArrayMergeRectorTest.php deleted file mode 100644 index 484e79ef123..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php74ArraySpreadInsteadOfArrayMergeRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/FixturePhp74'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule_php74.php'; - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php81ArraySpreadInsteadOfArrayMergeRectorTest.php b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php81ArraySpreadInsteadOfArrayMergeRectorTest.php deleted file mode 100644 index 6da9ce56a18..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/Php81ArraySpreadInsteadOfArrayMergeRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/FixturePhp81'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule_php81.php'; - } -} diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php74.php b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php74.php deleted file mode 100644 index c7dc0c2f534..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php74.php +++ /dev/null @@ -1,12 +0,0 @@ -phpVersion(PhpVersion::PHP_74); - $rectorConfig->rule(ArraySpreadInsteadOfArrayMergeRector::class); -}; diff --git a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php81.php b/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php81.php deleted file mode 100644 index 77290a8ebce..00000000000 --- a/rules-tests/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector/config/configured_rule_php81.php +++ /dev/null @@ -1,12 +0,0 @@ -phpVersion(PhpVersion::PHP_81); - $rectorConfig->rule(ArraySpreadInsteadOfArrayMergeRector::class); -}; diff --git a/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php b/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php index cdcf424659f..19e0c2f653a 100644 --- a/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php +++ b/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php @@ -5,31 +5,18 @@ namespace Rector\CodingStyle\Rector\FuncCall; use PhpParser\Node; -use PhpParser\Node\Arg; -use PhpParser\Node\ArrayItem; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\Ternary; -use PhpParser\Node\Expr\Variable; -use Rector\Php\PhpVersionProvider; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\ValueObject\PhpVersionFeature; -use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\CodingStyle\Rector\FuncCall\ArraySpreadInsteadOfArrayMergeRector\Php74ArraySpreadInsteadOfArrayMergeRectorTest - * @see \Rector\Tests\CodingStyle\Rector\FuncCall\ArraySpreadInsteadOfArrayMergeRector\Php81ArraySpreadInsteadOfArrayMergeRectorTest + * @deprecated This rule is deprecated, as it is a personal preference. The spread operator makes array merges harder to read and look dangerous. */ -final class ArraySpreadInsteadOfArrayMergeRector extends AbstractRector implements MinPhpVersionInterface +final class ArraySpreadInsteadOfArrayMergeRector extends AbstractRector implements DeprecatedInterface { - public function __construct( - private readonly PhpVersionProvider $phpVersionProvider, - ) { - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( @@ -82,122 +69,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if ($this->isName($node, 'array_merge')) { - return $this->refactorArray($node); - } - - return null; - } - - public function provideMinPhpVersion(): int - { - return PhpVersionFeature::ARRAY_SPREAD; - } - - private function refactorArray(FuncCall $funcCall): ?Array_ - { - if ($funcCall->isFirstClassCallable()) { - return null; - } - - $array = new Array_(); - - foreach ($funcCall->args as $arg) { - if (! $arg instanceof Arg) { - continue; - } - - // cannot handle unpacked arguments - if ($arg->unpack) { - return null; - } - - $value = $arg->value; - if ($this->shouldSkipArrayForInvalidKeys($value)) { - return null; - } - - if ($value instanceof Array_) { - $array->items = [...$array->items, ...$value->items]; - - continue; - } - - $value = $this->resolveValue($value); - $array->items[] = $this->createUnpackedArrayItem($value); - } - - return $array; - } - - private function shouldSkipArrayForInvalidKeys(Expr $expr): bool - { - $type = $this->getType($expr); - - if ($type->getIterableKeyType()->isInteger()->yes()) { - // when on PHP 8.0+, pass non-array values already error on the first place - // this check avoid unpack non-array values that cause error on php 7.4 as well, - // @see https://3v4l.org/DuYHu#v7.4.33 - if (! $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ARRAY_ON_ARRAY_MERGE)) { - $nativeType = $this->nodeTypeResolver->getNativeType($expr); - return ! $nativeType->isArray() - ->yes(); - } - - return false; - } - - // php 8.1+ allow mixed key: int, string, and null - return ! $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ARRAY_SPREAD_STRING_KEYS); - } - - private function resolveValue(Expr $expr): Expr - { - if ($expr instanceof FuncCall && $this->isIteratorToArrayFuncCall($expr)) { - /** @var Arg $arg */ - $arg = $expr->args[0]; - /** @var FuncCall $expr */ - $expr = $arg->value; - } - - if (! $expr instanceof Ternary) { - return $expr; - } - - if (! $expr->cond instanceof FuncCall) { - return $expr; - } - - if (! $this->isName($expr->cond, 'is_array')) { - return $expr; - } - - if ($expr->if instanceof Variable && $this->isIteratorToArrayFuncCall($expr->else)) { - return $expr->if; - } - - return $expr; - } - - private function createUnpackedArrayItem(Expr $expr): ArrayItem - { - return new ArrayItem($expr, null, false, [], true); - } - - private function isIteratorToArrayFuncCall(Expr $expr): bool - { - if (! $expr instanceof FuncCall) { - return false; - } - - if (! $this->isName($expr, 'iterator_to_array')) { - return false; - } - - if ($expr->isFirstClassCallable()) { - return false; - } - - return isset($expr->getArgs()[0]); + throw new ShouldNotHappenException(sprintf( + '"%s" rule is deprecated, as it is a personal preference that makes array merges harder to read', + self::class + )); } }