function Parser::subparse
2 calls to Parser::subparse()
- Parser::parse in vendor/
twig/ twig/ src/ Parser.php - Parser::subparseIgnoreUnknownTwigCallables in vendor/
twig/ twig/ src/ Parser.php
File
-
vendor/
twig/ twig/ src/ Parser.php, line 145
Class
- Parser
- @author Fabien Potencier <fabien@symfony.com>
Namespace
TwigCode
public function subparse($test, bool $dropNeedle = false) : Node {
$lineno = $this->getCurrentToken()
->getLine();
$rv = [];
while (!$this->stream
->isEOF()) {
switch ($this->getCurrentToken()
->getType()) {
case Token::TEXT_TYPE:
$token = $this->stream
->next();
$rv[] = new TextNode($token->getValue(), $token->getLine());
break;
case Token::VAR_START_TYPE:
$token = $this->stream
->next();
$expr = $this->expressionParser
->parseExpression();
$this->stream
->expect(Token::VAR_END_TYPE);
$rv[] = new PrintNode($expr, $token->getLine());
break;
case Token::BLOCK_START_TYPE:
$this->stream
->next();
$token = $this->getCurrentToken();
if (Token::NAME_TYPE !== $token->getType()) {
throw new SyntaxError('A block must start with a tag name.', $token->getLine(), $this->stream
->getSourceContext());
}
if (null !== $test && $test($token)) {
if ($dropNeedle) {
$this->stream
->next();
}
if (1 === \count($rv)) {
return $rv[0];
}
return new Nodes($rv, $lineno);
}
if (!($subparser = $this->env
->getTokenParser($token->getValue()))) {
if (null !== $test) {
$e = new SyntaxError(\sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream
->getSourceContext());
$callable = (new ReflectionCallable(new TwigTest('decision', $test)))->getCallable();
if (\is_array($callable) && $callable[0] instanceof TokenParserInterface) {
$e->appendMessage(\sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $callable[0]->getTag(), $lineno));
}
}
else {
$e = new SyntaxError(\sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream
->getSourceContext());
$e->addSuggestions($token->getValue(), array_keys($this->env
->getTokenParsers()));
}
throw $e;
}
$this->stream
->next();
$subparser->setParser($this);
$node = $subparser->parse($token);
if (!$node) {
trigger_deprecation('twig/twig', '3.12', 'Returning "null" from "%s" is deprecated and forbidden by "TokenParserInterface".', $subparser::class);
}
else {
$node->setNodeTag($subparser->getTag());
$rv[] = $node;
}
break;
default:
throw new SyntaxError('The lexer or the parser ended up in an unsupported state.', $this->getCurrentToken()
->getLine(), $this->stream
->getSourceContext());
}
}
if (1 === \count($rv)) {
return $rv[0];
}
return new Nodes($rv, $lineno);
}