Skip to content

Commit

Permalink
[CodeQuality] Handle Param by reference in target method on CallableT…
Browse files Browse the repository at this point in the history
…hisArrayToAnonymousFunctionRector (#1974)

Co-authored-by: GitHub Action <action@github.com>
  • Loading branch information
samsonasik and actions-user committed Mar 28, 2022
1 parent df0d552 commit b97ce48
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace Rector\Tests\CodeQuality\Rector\Array_\CallableThisArrayToAnonymousFunctionRector\Fixture;

class ParamByReferenceInTargetMethod
{
public function run()
{
$arr = ['string'];
array_walk_recursive($arr, [$this, 'append']);
var_dump($arr);
}

private function append (string &$str) {
$str .= " append this";
}
}

?>
-----
<?php

namespace Rector\Tests\CodeQuality\Rector\Array_\CallableThisArrayToAnonymousFunctionRector\Fixture;

class ParamByReferenceInTargetMethod
{
public function run()
{
$arr = ['string'];
array_walk_recursive($arr, function (string &$str) {
return $this->append($str);
});
var_dump($arr);
}

private function append (string &$str) {
$str .= " append this";
}
}

?>
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ private function refactorNew(New_ $new): ?New_
return null;
}

$new->args = $this->argumentSorter->sortArgsByExpectedParamOrder($new->args, $expectedArgOrParamOrder);
$new->args = $this->argumentSorter->sortArgsByExpectedParamOrder($new->getArgs(), $expectedArgOrParamOrder);

return $new;
}
Expand All @@ -143,7 +143,7 @@ private function refactorMethodCall(MethodCall $methodCall): ?MethodCall
}

$newArgs = $this->argumentSorter->sortArgsByExpectedParamOrder(
$methodCall->args,
$methodCall->getArgs(),
$expectedArgOrParamOrder
);

Expand Down
13 changes: 12 additions & 1 deletion rules/Php72/NodeFactory/AnonymousFunctionFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\StaticTypeMapper\StaticTypeMapper;
use ReflectionParameter;
use Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
use Symplify\PackageBuilder\Reflection\PrivatesAccessor;

final class AnonymousFunctionFactory
{
Expand All @@ -68,7 +70,8 @@ public function __construct(
private readonly SimplePhpParser $simplePhpParser,
private readonly NodeComparator $nodeComparator,
private readonly AstResolver $astResolver,
private readonly BetterStandardPrinter $betterStandardPrinter
private readonly BetterStandardPrinter $betterStandardPrinter,
private readonly PrivatesAccessor $privatesAccessor
) {
}

Expand Down Expand Up @@ -330,6 +333,7 @@ private function createParams(PhpMethodReflection $phpMethodReflection, array $p
$param = new Param(new Variable($parameterReflection->getName()));
$this->applyParamType($param, $parameterReflection);
$this->applyParamDefaultValue($param, $parameterReflection, $key, $classMethod);
$this->applyParamByReference($param, $parameterReflection);

$params[] = $param;
}
Expand All @@ -349,6 +353,13 @@ private function applyParamType(Param $param, ParameterReflection $parameterRefl
);
}

private function applyParamByReference(Param $param, ParameterReflection $parameterReflection): void
{
/** @var ReflectionParameter $reflection */
$reflection = $this->privatesAccessor->getPrivateProperty($parameterReflection, 'reflection');
$param->byRef = $reflection->isPassedByReference();
}

private function applyParamDefaultValue(
Param $param,
ParameterReflection $parameterReflection,
Expand Down

0 comments on commit b97ce48

Please sign in to comment.