Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\VarDumper\Caster; Chris@0: Chris@0: use Symfony\Component\VarDumper\Cloner\Stub; Chris@0: Chris@0: /** Chris@0: * Represents a list of function arguments. Chris@0: * Chris@0: * @author Nicolas Grekas
Chris@0: */ Chris@0: class ArgsStub extends EnumStub Chris@0: { Chris@17: private static $parameters = []; Chris@0: Chris@0: public function __construct(array $args, $function, $class) Chris@0: { Chris@0: list($variadic, $params) = self::getParameters($function, $class); Chris@0: Chris@17: $values = []; Chris@0: foreach ($args as $k => $v) { Chris@0: $values[$k] = !is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v; Chris@0: } Chris@0: if (null === $params) { Chris@0: parent::__construct($values, false); Chris@0: Chris@0: return; Chris@0: } Chris@17: if (\count($values) < \count($params)) { Chris@17: $params = \array_slice($params, 0, \count($values)); Chris@17: } elseif (\count($values) > \count($params)) { Chris@17: $values[] = new EnumStub(array_splice($values, \count($params)), false); Chris@0: $params[] = $variadic; Chris@0: } Chris@17: if (['...'] === $params) { Chris@0: $this->dumpKeys = false; Chris@0: $this->value = $values[0]->value; Chris@0: } else { Chris@0: $this->value = array_combine($params, $values); Chris@0: } Chris@0: } Chris@0: Chris@0: private static function getParameters($function, $class) Chris@0: { Chris@0: if (isset(self::$parameters[$k = $class.'::'.$function])) { Chris@0: return self::$parameters[$k]; Chris@0: } Chris@0: Chris@0: try { Chris@0: $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function); Chris@0: } catch (\ReflectionException $e) { Chris@17: return [null, null]; Chris@0: } Chris@0: Chris@0: $variadic = '...'; Chris@17: $params = []; Chris@0: foreach ($r->getParameters() as $v) { Chris@0: $k = '$'.$v->name; Chris@0: if ($v->isPassedByReference()) { Chris@0: $k = '&'.$k; Chris@0: } Chris@0: if (method_exists($v, 'isVariadic') && $v->isVariadic()) { Chris@0: $variadic .= $k; Chris@0: } else { Chris@0: $params[] = $k; Chris@0: } Chris@0: } Chris@0: Chris@17: return self::$parameters[$k] = [$variadic, $params]; Chris@0: } Chris@0: }