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

Breadcrumb

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

trait Scanner

JSX scanner trait

@author Marco Marchiò <marco.mm89@gmail.com>

Hierarchy

  • trait \Peast\Syntax\JSX\Scanner

File

vendor/mck89/peast/lib/Peast/Syntax/JSX/Scanner.php, line 19

Namespace

Peast\Syntax\JSX
View source
trait Scanner {
    
    /**
     * Tries to reconsume the current token as a jsx text if possible
     * 
     * @return Token|null
     */
    public function reconsumeCurrentTokenAsJSXText() {
        
        //Current and next tokens must be reset and the open brackets count must be correct
        
        //like they were never scanned
        foreach (array(
            $this->currentToken,
            $this->nextToken,
        ) as $token) {
            if ($token && isset($this->brackets[$token->value])) {
                if ($refBracket = $this->brackets[$token->value]) {
                    $this->openBrackets[$refBracket]++;
                }
                else {
                    $this->openBrackets[$token->value]--;
                }
            }
        }
        $this->nextToken = null;
        $this->currentToken = null;
        $startPosition = $this->getPosition();
        $this->setScanPosition($startPosition);
        $result = $this->consumeUntil(array(
            "{",
            "<",
        ), false, false);
        if ($result) {
            $this->currentToken = new Token(Token::TYPE_JSX_TEXT, $result[0]);
            $this->currentToken->location->start = $startPosition;
            $this->currentToken->location->end = $this->getPosition(true);
        }
        return $this->currentToken;
    }
    
    /**
     * Reconsumes the current token in jsx mode
     * 
     * @return Token|null
     */
    public function reconsumeCurrentTokenInJSXMode() {
        $this->jsx = true;
        $this->nextToken = null;
        $this->currentToken = null;
        $startPosition = $this->getPosition();
        $this->setScanPosition($startPosition);
        $token = $this->getToken();
        $this->jsx = false;
        return $token;
    }
    
    /**
     * String scanning method in jsx mode
     * 
     * @return Token|null
     */
    public function scanJSXString() {
        return $this->scanString(false);
    }
    
    /**
     * String punctuator method in jsx mode
     * 
     * @return Token|null
     */
    public function scanJSXPunctuator() {
        
        //The ">" character in jsx mode must be emitted in its own token
        
        //without matching longer sequences like ">>"
        $char = $this->charAt();
        if ($char === ">") {
            $this->index++;
            $this->column++;
            return new Token(Token::TYPE_PUNCTUATOR, $char);
        }
        return $this->scanPunctuator();
    }
    
    /**
     * Identifier scanning method in jsx mode
     * 
     * @return Token|null
     */
    public function scanJSXIdentifier() {
        $buffer = "";
        $char = $this->charAt();
        if ($char !== null && $this->isIdentifierChar($char)) {
            do {
                $buffer .= $char;
                $this->index++;
                $this->column++;
                $char = $this->charAt();
            } while ($char !== null && ($this->isIdentifierChar($char, false) || $char === "-"));
        }
        return $buffer === "" ? null : new Token(Token::TYPE_JSX_IDENTIFIER, $buffer);
    }

}

Members

Title Sort descending Modifiers Object type Summary
Scanner::reconsumeCurrentTokenAsJSXText public function Tries to reconsume the current token as a jsx text if possible
Scanner::reconsumeCurrentTokenInJSXMode public function Reconsumes the current token in jsx mode
Scanner::scanJSXIdentifier public function Identifier scanning method in jsx mode
Scanner::scanJSXPunctuator public function String punctuator method in jsx mode
Scanner::scanJSXString public function String scanning method in jsx mode
RSS feed
Powered by Drupal