Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Parser.php

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

Twig

Code

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);
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal