diff --git a/rules-tests/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector/Fixture/skip_by_ref_from_param_variable.php.inc b/rules-tests/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector/Fixture/skip_by_ref_from_param_variable.php.inc new file mode 100644 index 00000000000..1362e570fc3 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector/Fixture/skip_by_ref_from_param_variable.php.inc @@ -0,0 +1,14 @@ + $second; + } +} diff --git a/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php b/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php index e4c9eaf1378..cb8e16ee622 100644 --- a/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php +++ b/rules/CodingStyle/Rector/ClassMethod/BinaryOpStandaloneAssignsToDirectRector.php @@ -105,6 +105,15 @@ public function refactor(Node $node): ?Node return null; } + $resolveParamByRefVariables = $this->resolveParamByRefVariables($node); + if ($this->isNames($binaryOp->left, $resolveParamByRefVariables)) { + return null; + } + + if ($this->isNames($binaryOp->right, $resolveParamByRefVariables)) { + return null; + } + $binaryOp->left = $firstVariableAndExprAssign->getExpr(); $binaryOp->right = $secondVariableAndExprAssign->getExpr(); @@ -117,6 +126,32 @@ public function provideMinPhpVersion(): int return PhpVersionFeature::VARIADIC_PARAM; } + /** + * @return string[] + */ + private function resolveParamByRefVariables(ClassMethod|Function_|Closure $node): array + { + $paramByRefVariables = []; + foreach ($node->params as $param) { + if (! $param->var instanceof Variable) { + continue; + } + + if (! $param->byRef) { + continue; + } + + $paramName = $this->getName($param->var); + if ($paramName === null) { + continue; + } + + $paramByRefVariables[] = $paramName; + } + + return $paramByRefVariables; + } + private function matchToVariableAssignExpr(Stmt $stmt): ?VariableAndExprAssign { if (! $stmt instanceof Expression) {