Skip to content

Commit 206ad9f

Browse files
committed
minor #4772 Enforce more precise type on ListExpression (fabpot)
This PR was merged into the 3.x branch. Discussion ---------- Enforce more precise type on ListExpression Commits ------- dcfc419 Enforce more precise type on ListExpression
2 parents f8fb235 + dcfc419 commit 206ad9f

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

src/ExpressionParser/Prefix/GroupingExpressionParser.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Twig\ExpressionParser\PrefixExpressionParserInterface;
1818
use Twig\Node\Expression\AbstractExpression;
1919
use Twig\Node\Expression\ListExpression;
20+
use Twig\Node\Expression\Variable\AssignContextVariable;
2021
use Twig\Node\Expression\Variable\ContextVariable;
2122
use Twig\Parser;
2223
use Twig\Token;
@@ -36,7 +37,7 @@ public function parse(Parser $parser, Token $token): AbstractExpression
3637
return $expr->setExplicitParentheses();
3738
}
3839

39-
return new ListExpression([$expr], $token->getLine());
40+
return new ListExpression([self::toAssignContextVariable($expr)], $token->getLine());
4041
}
4142

4243
// determine if we are parsing an arrow function arguments
@@ -58,7 +59,16 @@ public function parse(Parser $parser, Token $token): AbstractExpression
5859
throw new SyntaxError('A list of variables must be followed by an arrow.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
5960
}
6061

61-
return new ListExpression($names, $token->getLine());
62+
return new ListExpression(array_map(self::toAssignContextVariable(...), $names), $token->getLine());
63+
}
64+
65+
private static function toAssignContextVariable(AbstractExpression $expr): AssignContextVariable
66+
{
67+
if (!$expr instanceof ContextVariable) {
68+
throw new SyntaxError('A list must only contain variables.', $expr->getTemplateLine(), $expr->getSourceContext());
69+
}
70+
71+
return $expr instanceof AssignContextVariable ? $expr : new AssignContextVariable($expr->getAttribute('name'), $expr->getTemplateLine());
6272
}
6373

6474
public function getName(): string

src/Node/Expression/ArrowFunctionExpression.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ class ArrowFunctionExpression extends AbstractExpression
2626
{
2727
public function __construct(AbstractExpression $expr, Node $names, $lineno)
2828
{
29-
if (!$names instanceof ListExpression && !$names instanceof ContextVariable) {
30-
throw new SyntaxError('The arrow function argument must be a list of variables or a single variable.', $names->getTemplateLine(), $names->getSourceContext());
31-
}
32-
3329
if ($names instanceof ContextVariable) {
3430
$names = new ListExpression([new AssignContextVariable($names->getAttribute('name'), $names->getTemplateLine())], $lineno);
3531
}
3632

33+
if (!$names instanceof ListExpression) {
34+
throw new SyntaxError('The arrow function argument must be a list of variables or a single variable.', $names->getTemplateLine(), $names->getSourceContext());
35+
}
36+
3737
parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno);
3838
}
3939

src/Node/Expression/ListExpression.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
namespace Twig\Node\Expression;
1313

1414
use Twig\Compiler;
15-
use Twig\Node\Expression\Variable\ContextVariable;
15+
use Twig\Node\Expression\Variable\AssignContextVariable;
1616

1717
class ListExpression extends AbstractExpression
1818
{
1919
/**
20-
* @param array<ContextVariable> $items
20+
* @param array<AssignContextVariable> $items
2121
*/
2222
public function __construct(array $items, int $lineno)
2323
{

0 commit comments

Comments
 (0)