From b7e812a917bd1dd84c070218bef9735d86c539ad Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 23 Mar 2019 15:18:13 +0100 Subject: [PATCH] fixed variadic support --- CHANGELOG | 1 + src/Node/Expression/CallExpression.php | 12 +++++++---- src/Node/Expression/VariadicExpression.php | 24 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/Node/Expression/VariadicExpression.php diff --git a/CHANGELOG b/CHANGELOG index 92b3a598e..a46bc0e4d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ * 2.7.3 (2019-XX-XX) + * fixed variadic support * fixed CheckToStringNode implementation (broken when a function/filter is variadic) * 2.7.3 (2019-03-21) diff --git a/src/Node/Expression/CallExpression.php b/src/Node/Expression/CallExpression.php index 69c505855..131d78e46 100644 --- a/src/Node/Expression/CallExpression.php +++ b/src/Node/Expression/CallExpression.php @@ -146,7 +146,7 @@ abstract class CallExpression extends AbstractExpression throw new \LogicException($message); } - $callableParameters = $this->getCallableParameters($callable, $isVariadic); + list($callableParameters, $isPhpVariadic) = $this->getCallableParameters($callable, $isVariadic); $arguments = []; $names = []; $missingArguments = []; @@ -191,7 +191,7 @@ abstract class CallExpression extends AbstractExpression } if ($isVariadic) { - $arbitraryArguments = new ArrayExpression([], -1); + $arbitraryArguments = $isPhpVariadic ? new VariadicExpression([], -1) : new ArrayExpression([], -1); foreach ($parameters as $key => $value) { if (\is_int($key)) { $arbitraryArguments->addElement($value); @@ -234,7 +234,7 @@ abstract class CallExpression extends AbstractExpression { list($r) = $this->reflectCallable($callable); if (null === $r) { - return []; + return [[], false]; } $parameters = $r->getParameters(); @@ -252,10 +252,14 @@ abstract class CallExpression extends AbstractExpression array_shift($parameters); } } + $isPhpVariadic = false; if ($isVariadic) { $argument = end($parameters); if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) { array_pop($parameters); + } else if ($argument && $argument->isVariadic()) { + array_pop($parameters); + $isPhpVariadic = true; } else { $callableName = $r->name; if ($r instanceof \ReflectionMethod) { @@ -266,7 +270,7 @@ abstract class CallExpression extends AbstractExpression } } - return $parameters; + return [$parameters, $isPhpVariadic]; } private function reflectCallable($callable) diff --git a/src/Node/Expression/VariadicExpression.php b/src/Node/Expression/VariadicExpression.php new file mode 100644 index 000000000..3351e1a67 --- /dev/null +++ b/src/Node/Expression/VariadicExpression.php @@ -0,0 +1,24 @@ +raw('...'); + + parent::compile($compiler); + } +}