function ForTokenParser::parse
Overrides TokenParserInterface::parse
File
-
vendor/
twig/ twig/ src/ TokenParser/ ForTokenParser.php, line 33
Class
- ForTokenParser
- Loops over each item of a sequence.
Namespace
Twig\TokenParserCode
public function parse(Token $token) : Node {
$lineno = $token->getLine();
$stream = $this->parser
->getStream();
$targets = $this->parser
->getExpressionParser()
->parseAssignmentExpression();
$stream->expect(Token::OPERATOR_TYPE, 'in');
$seq = $this->parser
->getExpressionParser()
->parseExpression();
$stream->expect(Token::BLOCK_END_TYPE);
$body = $this->parser
->subparse([
$this,
'decideForFork',
]);
if ('else' == $stream->next()
->getValue()) {
$stream->expect(Token::BLOCK_END_TYPE);
$else = $this->parser
->subparse([
$this,
'decideForEnd',
], true);
}
else {
$else = null;
}
$stream->expect(Token::BLOCK_END_TYPE);
if (\count($targets) > 1) {
$keyTarget = $targets->getNode('0');
$keyTarget = new AssignContextVariable($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
$valueTarget = $targets->getNode('1');
}
else {
$keyTarget = new AssignContextVariable('_key', $lineno);
$valueTarget = $targets->getNode('0');
}
$valueTarget = new AssignContextVariable($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
return new ForNode($keyTarget, $valueTarget, $seq, null, $body, $else, $lineno);
}