mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-16 05:44:59 +01:00
60 lines
2.5 KiB
PHP
60 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\DowngradePhp80\NodeAnalyzer;
|
|
|
|
use PhpParser\Node\Arg;
|
|
use PHPStan\Reflection\FunctionReflection;
|
|
use PHPStan\Reflection\MethodReflection;
|
|
use PHPStan\Reflection\Native\NativeFunctionReflection;
|
|
use PHPStan\Reflection\ParametersAcceptorSelector;
|
|
use Rector\NodeNameResolver\NodeNameResolver;
|
|
use ReflectionFunction;
|
|
final class UnnamedArgumentResolver
|
|
{
|
|
/**
|
|
* @var \Rector\NodeNameResolver\NodeNameResolver
|
|
*/
|
|
private $nodeNameResolver;
|
|
/**
|
|
* @var \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs
|
|
*/
|
|
private $namedToUnnamedArgs;
|
|
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs $namedToUnnamedArgs)
|
|
{
|
|
$this->nodeNameResolver = $nodeNameResolver;
|
|
$this->namedToUnnamedArgs = $namedToUnnamedArgs;
|
|
}
|
|
/**
|
|
* @param Arg[] $currentArgs
|
|
* @return Arg[]
|
|
* @param \PHPStan\Reflection\FunctionReflection|\PHPStan\Reflection\MethodReflection $functionLikeReflection
|
|
*/
|
|
public function resolveFromReflection($functionLikeReflection, array $currentArgs) : array
|
|
{
|
|
$parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($functionLikeReflection->getVariants());
|
|
$unnamedArgs = [];
|
|
$parameters = $parametersAcceptor->getParameters();
|
|
$isNativeFunctionReflection = $functionLikeReflection instanceof \PHPStan\Reflection\Native\NativeFunctionReflection;
|
|
if ($isNativeFunctionReflection) {
|
|
$functionLikeReflection = new \ReflectionFunction($functionLikeReflection->getName());
|
|
}
|
|
/** @var Arg[] $unnamedArgs */
|
|
$unnamedArgs = [];
|
|
$toFillArgs = [];
|
|
foreach ($currentArgs as $key => $arg) {
|
|
if ($arg->name === null) {
|
|
$unnamedArgs[$key] = new \PhpParser\Node\Arg($arg->value, $arg->byRef, $arg->unpack, $arg->getAttributes(), null);
|
|
continue;
|
|
}
|
|
/** @var string $argName */
|
|
$argName = $this->nodeNameResolver->getName($arg->name);
|
|
$toFillArgs[] = $argName;
|
|
}
|
|
$unnamedArgs = $this->namedToUnnamedArgs->fillFromNamedArgs($parameters, $currentArgs, $toFillArgs, $unnamedArgs);
|
|
$unnamedArgs = $this->namedToUnnamedArgs->fillFromJumpedNamedArgs($functionLikeReflection, $unnamedArgs, $isNativeFunctionReflection, $parameters);
|
|
\ksort($unnamedArgs);
|
|
return $unnamedArgs;
|
|
}
|
|
}
|