From cf1eb0908b6bbbc0a9813ddc4de9503f4944ee43 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 03:22:03 +0000 Subject: [PATCH 01/14] Working rule --- .../Fixture/fixture.php.inc | 48 +++++++ .../skip_functions_with_no_return.php.inc | 17 +++ ...functions_with_too_many_statements.php.inc | 19 +++ .../skip_functions_without_calls.php.inc | 12 ++ .../skip_mismatched_args_and_params.php.inc | 21 +++ .../supports_varadic_and_unpack.php.inc | 22 ++++ ...FuncLikeToFirstClassCallableRectorTest.php | 28 ++++ .../config/configured_rule.php | 9 ++ .../FuncLikeToFirstClassCallableRector.php | 124 ++++++++++++++++++ 9 files changed, 300 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_no_return.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php create mode 100644 rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..f5bf7a683a0 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc @@ -0,0 +1,48 @@ + FooBar::foo($foo); + +$bar = null; + +fn ($foo) => $bar->foo($foo); + +function ($foo) use ($bar) +{ + return $bar->foo($foo); +}; + +function ($foo, $bar, $ray) +{ + return FooBar::foo($foo, $bar); +}; + +fn ($foo, $bar, $ray) => FooBar::foo($foo); + +?> +----- +foo(...); + +$bar->foo(...); + +FooBar::foo(...); + +FooBar::foo(...); + +?> diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_no_return.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_no_return.php.inc new file mode 100644 index 00000000000..09fb16157e8 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_no_return.php.inc @@ -0,0 +1,17 @@ +foo($foo); +}; + +?> diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc new file mode 100644 index 00000000000..60e47255604 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc @@ -0,0 +1,19 @@ +foo($foo); +}; + +?> diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc new file mode 100644 index 00000000000..46c70f4069b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc @@ -0,0 +1,12 @@ + $foo; + +?> diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc new file mode 100644 index 00000000000..9d8bd9d6492 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc @@ -0,0 +1,21 @@ + FooBar::foo($bar, $foo); + +$bar = null; + +fn ($foo, $bar) => $bar->foo($bar, $foo); + +function ($foo, $barFoo) use ($bar) +{ + return $bar->foo($barFoo, $foo); +}; + +?> diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc new file mode 100644 index 00000000000..16ae64aef7f --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc @@ -0,0 +1,22 @@ + FooBar::foo(...$foo); + +?> +----- + diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php new file mode 100644 index 00000000000..92a5639fce2 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php new file mode 100644 index 00000000000..6bbfee27ee8 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([FuncLikeToFirstClassCallableRector::class]); diff --git a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php new file mode 100644 index 00000000000..c99071340ae --- /dev/null +++ b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php @@ -0,0 +1,124 @@ +extractMethodCallFromFuncLike($node); + + if (! $extractedMethodCall instanceof MethodCall && ! $extractedMethodCall instanceof StaticCall) { + return null; + } + + if ($extractedMethodCall instanceof MethodCall) { + return new MethodCall($extractedMethodCall->var, $extractedMethodCall->name, [new VariadicPlaceholder()]); + } + + return new StaticCall($extractedMethodCall->class, $extractedMethodCall->name, [new VariadicPlaceholder()]); + } + + private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): MethodCall|StaticCall|null + { + if ($node instanceof ArrowFunction) { + if ( + ($node->expr instanceof MethodCall || $node->expr instanceof StaticCall) && + ! $node->expr->isFirstClassCallable() && + $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs())) { + return $node->expr; + } + + return null; + } + + if (count($node->stmts) != 1 || ! $node->getStmts()[0] instanceof Return_) { + return null; + } + + $callLike = $node->getStmts()[0] + ->expr; + + if (! $callLike instanceof MethodCall && ! $callLike instanceof StaticCall) { + return null; + } + + if ( + ! $callLike->isFirstClassCallable() && + $this->sameParamsForArgs($node->getParams(), $callLike->getArgs())) { + return $callLike; + } + + return null; + } + + /** + * @param Node\Param[] $params + * @param Node\Arg[] $args + */ + private function sameParamsForArgs(array $params, array $args): bool + { + Assert::allIsInstanceOf($args, Arg::class); + Assert::allIsInstanceOf($params, Param::class); + + if (count($args) > count($params)) { + return false; + } + + if (count($args) === 1 && $args[0]->unpack) { + return $params[0]->variadic; + } + + foreach ($args as $key => $arg) { + if (! $this->nodeComparator->areNodesEqual($arg->value, $params[$key]->var)) { + return false; + } + } + + return true; + } +} From 2b841452987328997c697926794c96c2305e0479 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 03:52:49 +0000 Subject: [PATCH 02/14] fix scenario --- ...ip_method_call_var_is_funclike_arg.php.inc | 10 +++++++ .../FuncLikeToFirstClassCallableRector.php | 27 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc new file mode 100644 index 00000000000..6b1755a7971 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc @@ -0,0 +1,10 @@ +foo(); +}; + +?> diff --git a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php index c99071340ae..83f1b505c8e 100644 --- a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php +++ b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php @@ -69,7 +69,9 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met if ( ($node->expr instanceof MethodCall || $node->expr instanceof StaticCall) && ! $node->expr->isFirstClassCallable() && - $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs())) { + $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs()) && + $this->isNonDependantMethod($node->expr, $node->getParams()) + ) { return $node->expr; } @@ -89,7 +91,8 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met if ( ! $callLike->isFirstClassCallable() && - $this->sameParamsForArgs($node->getParams(), $callLike->getArgs())) { + $this->sameParamsForArgs($node->getParams(), $callLike->getArgs()) && + $this->isNonDependantMethod($callLike, $node->getParams())) { return $callLike; } @@ -121,4 +124,24 @@ private function sameParamsForArgs(array $params, array $args): bool return true; } + + /** + * @param Param[] $params + */ + private function isNonDependantMethod(StaticCall|MethodCall $expr, array $params): bool + { + Assert::allIsInstanceOf($params, Param::class); + + if ($expr instanceof StaticCall) { + return true; + } + + foreach ($params as $param) { + if ($this->nodeComparator->areNodesEqual($param->var, $expr->var)) { + return false; + } + } + + return true; + } } From 387f054c99174935dd1ed410316e383a3cd677b1 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 03:56:01 +0000 Subject: [PATCH 03/14] Added to Code Quality Set --- src/Config/Level/CodeQualityLevel.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Config/Level/CodeQualityLevel.php b/src/Config/Level/CodeQualityLevel.php index 34a47f3d8ee..e797a635475 100644 --- a/src/Config/Level/CodeQualityLevel.php +++ b/src/Config/Level/CodeQualityLevel.php @@ -42,6 +42,7 @@ use Rector\CodeQuality\Rector\FuncCall\SimplifyStrposLowerRector; use Rector\CodeQuality\Rector\FuncCall\SingleInArrayToCompareRector; use Rector\CodeQuality\Rector\FuncCall\UnwrapSprintfOneArgumentRector; +use Rector\CodeQuality\Rector\FunctionLike\FuncLikeToFirstClassCallableRector; use Rector\CodeQuality\Rector\Identical\BooleanNotIdenticalToNotIdenticalRector; use Rector\CodeQuality\Rector\Identical\FlipTypeControlToUseExclusiveTypeRector; use Rector\CodeQuality\Rector\Identical\SimplifyArraySearchRector; @@ -175,6 +176,7 @@ final class CodeQualityLevel CompleteMissingIfElseBracketRector::class, RemoveUselessIsObjectCheckRector::class, StaticToSelfStaticMethodCallOnFinalClassRector::class, + FuncLikeToFirstClassCallableRector::class, ]; /** From 01072fd61414faf82ad2ac4d06692ab2a5838bf8 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 03:56:45 +0000 Subject: [PATCH 04/14] Rule applied to codebase --- src/Configuration/RectorConfigBuilder.php | 3 +-- src/Util/ArrayParametersMerger.php | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Configuration/RectorConfigBuilder.php b/src/Configuration/RectorConfigBuilder.php index 493fc5ff757..f873a4e3f5a 100644 --- a/src/Configuration/RectorConfigBuilder.php +++ b/src/Configuration/RectorConfigBuilder.php @@ -171,8 +171,7 @@ public function __invoke(RectorConfig $rectorConfig): void { if ($this->setGroups !== [] || $this->setProviders !== []) { $setProviderCollector = new SetProviderCollector(array_map( - static fn (string $setProvider): SetProviderInterface => - $rectorConfig->make($setProvider), + $rectorConfig->make(...), \array_keys($this->setProviders) )); diff --git a/src/Util/ArrayParametersMerger.php b/src/Util/ArrayParametersMerger.php index a8986832f64..e57fc88dc05 100644 --- a/src/Util/ArrayParametersMerger.php +++ b/src/Util/ArrayParametersMerger.php @@ -15,11 +15,7 @@ final class ArrayParametersMerger public function merge(mixed $left, mixed $right): mixed { if (is_array($left) && is_array($right)) { - return $this->mergeLeftToRightWithCallable( - $left, - $right, - fn ($leftValue, $rightValue): mixed => $this->merge($leftValue, $rightValue) - ); + return $this->mergeLeftToRightWithCallable($left, $right, $this->merge(...)); } if ($left !== null) { From 5cf3d76a61bd7b996fbaaa3815be9b7fb797b21e Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 03:58:29 +0000 Subject: [PATCH 05/14] small test addition --- .../Fixture/skip_method_call_var_is_funclike_arg.php.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc index 6b1755a7971..7a495a50db3 100644 --- a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc @@ -7,4 +7,6 @@ function ($foo) return $foo->foo(); }; +fn ($foo) => $foo->foo(); + ?> From 8e16ed2c0427827748b18515a798c016b6171136 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 04:01:54 +0000 Subject: [PATCH 06/14] another quick test --- .../Fixture/skip_functions_with_too_many_statements.php.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc index 60e47255604..ac5c6417890 100644 --- a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc @@ -8,6 +8,8 @@ function ($foo) return FooBar::foo($foo); }; +fn ($foo) => FooBar::foo($foo) && true; + $bar = null; function ($foo) use ($bar) From 9941eb19a5de09775d66581da0f6e7214d1d27f3 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 04:36:07 +0000 Subject: [PATCH 07/14] Fixes edge case --- ...nc => skip_call_dependency_on_arg.php.inc} | 15 +++++++++++ .../FuncLikeToFirstClassCallableRector.php | 27 ++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) rename rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/{skip_method_call_var_is_funclike_arg.php.inc => skip_call_dependency_on_arg.php.inc} (53%) diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc similarity index 53% rename from rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc rename to rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc index 7a495a50db3..087c2321d43 100644 --- a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_method_call_var_is_funclike_arg.php.inc +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc @@ -7,6 +7,21 @@ function ($foo) return $foo->foo(); }; +function ($foo) +{ + return (new $foo)->foo(); +}; + fn ($foo) => $foo->foo(); +function ($foo) +{ + return $foo::foo(); +}; + +function ($foo) +{ + return ($foo . '\\Foo')::foo(); +}; + ?> diff --git a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php index 83f1b505c8e..03b19cc011f 100644 --- a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php +++ b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php @@ -126,18 +126,37 @@ private function sameParamsForArgs(array $params, array $args): bool } /** + * Makes sure the parameter isn't used to make the call e.g. in the var or class + * * @param Param[] $params */ private function isNonDependantMethod(StaticCall|MethodCall $expr, array $params): bool { Assert::allIsInstanceOf($params, Param::class); - if ($expr instanceof StaticCall) { - return true; - } + $found = false; foreach ($params as $param) { - if ($this->nodeComparator->areNodesEqual($param->var, $expr->var)) { + if ($expr instanceof MethodCall) { + $this->traverseNodesWithCallable($expr->var, function (Node $node) use ($param, &$found): null { + if ($this->nodeComparator->areNodesEqual($node, $param->var)) { + $found = true; + } + + return null; + }); + } + if ($expr instanceof StaticCall) { + $this->traverseNodesWithCallable($expr->class, function (Node $node) use ($param, &$found): null { + if ($this->nodeComparator->areNodesEqual($node, $param->var)) { + $found = true; + } + + return null; + }); + } + + if ($found) { return false; } } From 8f7155c18dd7df305e1c40d2acfed762cc02ca94 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 13:00:39 +0000 Subject: [PATCH 08/14] remove from set --- src/Config/Level/CodeQualityLevel.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Config/Level/CodeQualityLevel.php b/src/Config/Level/CodeQualityLevel.php index e797a635475..b5a581f6677 100644 --- a/src/Config/Level/CodeQualityLevel.php +++ b/src/Config/Level/CodeQualityLevel.php @@ -176,7 +176,6 @@ final class CodeQualityLevel CompleteMissingIfElseBracketRector::class, RemoveUselessIsObjectCheckRector::class, StaticToSelfStaticMethodCallOnFinalClassRector::class, - FuncLikeToFirstClassCallableRector::class, ]; /** From 0d4b5360ccb3fa7f9bde59cbd1d899bb7bf190fa Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 13:00:59 +0000 Subject: [PATCH 09/14] Revert "Rule applied to codebase" This reverts commit 00c003f951d355d99cb59e4fe35aec636ded52d4. --- src/Configuration/RectorConfigBuilder.php | 3 ++- src/Util/ArrayParametersMerger.php | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Configuration/RectorConfigBuilder.php b/src/Configuration/RectorConfigBuilder.php index f873a4e3f5a..493fc5ff757 100644 --- a/src/Configuration/RectorConfigBuilder.php +++ b/src/Configuration/RectorConfigBuilder.php @@ -171,7 +171,8 @@ public function __invoke(RectorConfig $rectorConfig): void { if ($this->setGroups !== [] || $this->setProviders !== []) { $setProviderCollector = new SetProviderCollector(array_map( - $rectorConfig->make(...), + static fn (string $setProvider): SetProviderInterface => + $rectorConfig->make($setProvider), \array_keys($this->setProviders) )); diff --git a/src/Util/ArrayParametersMerger.php b/src/Util/ArrayParametersMerger.php index e57fc88dc05..a8986832f64 100644 --- a/src/Util/ArrayParametersMerger.php +++ b/src/Util/ArrayParametersMerger.php @@ -15,7 +15,11 @@ final class ArrayParametersMerger public function merge(mixed $left, mixed $right): mixed { if (is_array($left) && is_array($right)) { - return $this->mergeLeftToRightWithCallable($left, $right, $this->merge(...)); + return $this->mergeLeftToRightWithCallable( + $left, + $right, + fn ($leftValue, $rightValue): mixed => $this->merge($leftValue, $rightValue) + ); } if ($left !== null) { From 10e64a209967a3907749f0f03372e21606d80b9c Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 13:21:15 +0000 Subject: [PATCH 10/14] cs --- src/Config/Level/CodeQualityLevel.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Config/Level/CodeQualityLevel.php b/src/Config/Level/CodeQualityLevel.php index b5a581f6677..34a47f3d8ee 100644 --- a/src/Config/Level/CodeQualityLevel.php +++ b/src/Config/Level/CodeQualityLevel.php @@ -42,7 +42,6 @@ use Rector\CodeQuality\Rector\FuncCall\SimplifyStrposLowerRector; use Rector\CodeQuality\Rector\FuncCall\SingleInArrayToCompareRector; use Rector\CodeQuality\Rector\FuncCall\UnwrapSprintfOneArgumentRector; -use Rector\CodeQuality\Rector\FunctionLike\FuncLikeToFirstClassCallableRector; use Rector\CodeQuality\Rector\Identical\BooleanNotIdenticalToNotIdenticalRector; use Rector\CodeQuality\Rector\Identical\FlipTypeControlToUseExclusiveTypeRector; use Rector\CodeQuality\Rector\Identical\SimplifyArraySearchRector; From 6f68d958ae834079d1e2590e66b6c243273672fc Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 13:21:30 +0000 Subject: [PATCH 11/14] skip named args --- .../Fixture/skip_named_args.php.inc | 17 ++++++++++++++++ .../FuncLikeToFirstClassCallableRector.php | 20 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_named_args.php.inc diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_named_args.php.inc b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_named_args.php.inc new file mode 100644 index 00000000000..5e1393d3444 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_named_args.php.inc @@ -0,0 +1,17 @@ +foo(foo: $foo); +}; + +function ($foo) +{ + return Foo::foo(foo: $foo); +}; + +?> diff --git a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php index 03b19cc011f..f56cecee513 100644 --- a/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php +++ b/rules/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Identifier; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\VariadicPlaceholder; @@ -69,6 +70,7 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met if ( ($node->expr instanceof MethodCall || $node->expr instanceof StaticCall) && ! $node->expr->isFirstClassCallable() && + $this->notUsingNamedArgs($node->expr->getArgs()) && $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs()) && $this->isNonDependantMethod($node->expr, $node->getParams()) ) { @@ -91,6 +93,7 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met if ( ! $callLike->isFirstClassCallable() && + $this->notUsingNamedArgs($callLike->getArgs()) && $this->sameParamsForArgs($node->getParams(), $callLike->getArgs()) && $this->isNonDependantMethod($callLike, $node->getParams())) { return $callLike; @@ -146,6 +149,7 @@ private function isNonDependantMethod(StaticCall|MethodCall $expr, array $params return null; }); } + if ($expr instanceof StaticCall) { $this->traverseNodesWithCallable($expr->class, function (Node $node) use ($param, &$found): null { if ($this->nodeComparator->areNodesEqual($node, $param->var)) { @@ -163,4 +167,20 @@ private function isNonDependantMethod(StaticCall|MethodCall $expr, array $params return true; } + + /** + * @param Arg[] $args + */ + private function notUsingNamedArgs(array $args): bool + { + Assert::allIsInstanceOf($args, Arg::class); + + foreach ($args as $arg) { + if ($arg->name instanceof Identifier) { + return false; + } + } + + return true; + } } From bc14b08f6ec62dcc49fc2f9074a17451a50c14b9 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 12 Jan 2025 13:39:05 +0000 Subject: [PATCH 12/14] move namespace --- .../Fixture/fixture.php.inc | 4 ++-- .../Fixture/skip_call_dependency_on_arg.php.inc | 2 +- .../Fixture/skip_functions_with_no_return.php.inc | 2 +- .../Fixture/skip_functions_with_too_many_statements.php.inc | 2 +- .../Fixture/skip_functions_without_calls.php.inc | 2 +- .../Fixture/skip_mismatched_args_and_params.php.inc | 2 +- .../Fixture/skip_named_args.php.inc | 2 +- .../Fixture/supports_varadic_and_unpack.php.inc | 4 ++-- .../FuncLikeToFirstClassCallableRectorTest.php | 2 +- .../config/configured_rule.php | 2 +- .../FunctionLike/FuncLikeToFirstClassCallableRector.php | 4 ++-- 11 files changed, 14 insertions(+), 14 deletions(-) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc (80%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc (81%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_no_return.php.inc (71%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_with_too_many_statements.php.inc (79%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc (62%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc (81%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_named_args.php.inc (73%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc (64%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php (90%) rename rules-tests/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php (73%) rename rules/{CodeQuality => CodingStyle}/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php (97%) diff --git a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc similarity index 80% rename from rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc rename to rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc index f5bf7a683a0..d8c2497cf7d 100644 --- a/rules-tests/CodeQuality/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc @@ -1,6 +1,6 @@ FooBar::foo($foo); ----- FooBar::foo(...$foo); ----- Date: Wed, 15 Jan 2025 23:02:25 +0000 Subject: [PATCH 13/14] Blocks Byref parameter usage --- .../Fixture/skip_byref_usage.php.inc | 10 ++++++++++ .../FuncLikeToFirstClassCallableRector.php | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc new file mode 100644 index 00000000000..37375bb72d5 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc @@ -0,0 +1,10 @@ + diff --git a/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php index aa32710441b..a7005552134 100644 --- a/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php +++ b/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php @@ -71,6 +71,7 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met ($node->expr instanceof MethodCall || $node->expr instanceof StaticCall) && ! $node->expr->isFirstClassCallable() && $this->notUsingNamedArgs($node->expr->getArgs()) && + $this->notUsingByRef($node->getParams()) && $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs()) && $this->isNonDependantMethod($node->expr, $node->getParams()) ) { @@ -94,6 +95,7 @@ private function extractMethodCallFromFuncLike(Closure|ArrowFunction $node): Met if ( ! $callLike->isFirstClassCallable() && $this->notUsingNamedArgs($callLike->getArgs()) && + $this->notUsingByRef($node->getParams()) && $this->sameParamsForArgs($node->getParams(), $callLike->getArgs()) && $this->isNonDependantMethod($callLike, $node->getParams())) { return $callLike; @@ -168,6 +170,22 @@ private function isNonDependantMethod(StaticCall|MethodCall $expr, array $params return true; } + /** + * @param Param[] $params + */ + private function notUsingByRef(array $params): bool + { + Assert::allIsInstanceOf($params, Param::class); + + foreach ($params as $param) { + if ($param->byRef) { + return false; + } + } + + return true; + } + /** * @param Arg[] $args */ From 970a27ad176bbbedc3c6b95a6156f6ae5e43995c Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Sun, 19 Jan 2025 13:07:50 +0000 Subject: [PATCH 14/14] Rename of rule --- .../Fixture/skip_byref_usage.php.inc | 10 --------- .../skip_functions_without_calls.php.inc | 12 ---------- .../supports_varadic_and_unpack.php.inc | 22 ------------------- .../config/configured_rule.php | 9 -------- .../Fixture/fixture.php.inc | 4 ++-- .../Fixture/skip_byref_usage.php.inc | 10 +++++++++ .../skip_call_dependency_on_arg.php.inc | 2 +- .../skip_functions_with_no_return.php.inc | 2 +- ...functions_with_too_many_statements.php.inc | 2 +- .../skip_functions_without_calls.php.inc | 12 ++++++++++ .../skip_mismatched_args_and_params.php.inc | 2 +- .../Fixture/skip_named_args.php.inc | 2 +- .../supports_varadic_and_unpack.php.inc | 22 +++++++++++++++++++ ...ionLikeToFirstClassCallableRectorTest.php} | 4 ++-- .../config/configured_rule.php | 9 ++++++++ ...unctionLikeToFirstClassCallableRector.php} | 4 ++-- .../Fixture/count_to_empty_array_compare.php | 16 ++++++++++++++ 17 files changed, 80 insertions(+), 64 deletions(-) delete mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/fixture.php.inc (68%) create mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/skip_call_dependency_on_arg.php.inc (69%) rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/skip_functions_with_no_return.php.inc (54%) rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/skip_functions_with_too_many_statements.php.inc (66%) create mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/skip_mismatched_args_and_params.php.inc (71%) rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector => FunctionLikeToFirstClassCallableRector}/Fixture/skip_named_args.php.inc (58%) create mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc rename rules-tests/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php => FunctionLikeToFirstClassCallableRector/FunctionLikeToFirstClassCallableRectorTest.php} (74%) create mode 100644 rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/config/configured_rule.php rename rules/CodingStyle/Rector/FunctionLike/{FuncLikeToFirstClassCallableRector.php => FunctionLikeToFirstClassCallableRector.php} (96%) create mode 100644 tests/Issues/CountArrayLongToShort/Fixture/count_to_empty_array_compare.php diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc deleted file mode 100644 index 37375bb72d5..00000000000 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_byref_usage.php.inc +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc deleted file mode 100644 index cc58cafaca7..00000000000 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_functions_without_calls.php.inc +++ /dev/null @@ -1,12 +0,0 @@ - $foo; - -?> diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc deleted file mode 100644 index 027591aca0a..00000000000 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/supports_varadic_and_unpack.php.inc +++ /dev/null @@ -1,22 +0,0 @@ - FooBar::foo(...$foo); - -?> ------ - diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php b/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php deleted file mode 100644 index f393f771220..00000000000 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([FuncLikeToFirstClassCallableRector::class]); diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/fixture.php.inc similarity index 68% rename from rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc rename to rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/fixture.php.inc index d8c2497cf7d..826ee48c6b3 100644 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/fixture.php.inc +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/fixture.php.inc @@ -1,6 +1,6 @@ FooBar::foo($foo); ----- diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc similarity index 69% rename from rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc rename to rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc index a2685221741..b00a25bf272 100644 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_call_dependency_on_arg.php.inc @@ -1,6 +1,6 @@ $foo; + +?> diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc similarity index 71% rename from rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc rename to rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc index 7bafeb9751c..d7b5d0b6314 100644 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/Fixture/skip_mismatched_args_and_params.php.inc @@ -1,6 +1,6 @@ FooBar::foo(...$foo); + +?> +----- + diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/FunctionLikeToFirstClassCallableRectorTest.php similarity index 74% rename from rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php rename to rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/FunctionLikeToFirstClassCallableRectorTest.php index 5876bd134e3..4a7409804f0 100644 --- a/rules-tests/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector/FuncLikeToFirstClassCallableRectorTest.php +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/FunctionLikeToFirstClassCallableRectorTest.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Rector\Tests\CodingStyle\Rector\FunctionLike\FuncLikeToFirstClassCallableRector; +namespace Rector\Tests\CodingStyle\Rector\FunctionLike\FunctionLikeToFirstClassCallableRector; use Iterator; use PHPUnit\Framework\Attributes\DataProvider; use Rector\Testing\PHPUnit\AbstractRectorTestCase; -final class FuncLikeToFirstClassCallableRectorTest extends AbstractRectorTestCase +final class FunctionLikeToFirstClassCallableRectorTest extends AbstractRectorTestCase { #[DataProvider('provideData')] public function test(string $filePath): void diff --git a/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/config/configured_rule.php b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/config/configured_rule.php new file mode 100644 index 00000000000..0a8dd0b84a6 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([FunctionLikeToFirstClassCallableRector::class]); diff --git a/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php b/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php similarity index 96% rename from rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php rename to rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php index a7005552134..7b75ee46877 100644 --- a/rules/CodingStyle/Rector/FunctionLike/FuncLikeToFirstClassCallableRector.php +++ b/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php @@ -20,9 +20,9 @@ use Webmozart\Assert\Assert; /** - * @see \Rector\Tests\CodingStyle\Rector\FunctionLike\FuncLikeToFirstClassCallableRector\FuncLikeToFirstClassCallableRectorTest + * @see \Rector\Tests\CodingStyle\Rector\FunctionLike\FunctionLikeToFirstClassCallableRector\FunctionLikeToFirstClassCallableRectorTest */ -final class FuncLikeToFirstClassCallableRector extends AbstractRector +final class FunctionLikeToFirstClassCallableRector extends AbstractRector { public function getRuleDefinition(): RuleDefinition { diff --git a/tests/Issues/CountArrayLongToShort/Fixture/count_to_empty_array_compare.php b/tests/Issues/CountArrayLongToShort/Fixture/count_to_empty_array_compare.php new file mode 100644 index 00000000000..a1401e08023 --- /dev/null +++ b/tests/Issues/CountArrayLongToShort/Fixture/count_to_empty_array_compare.php @@ -0,0 +1,16 @@ +