mago-syntax 1.20.1

A correct, fast, and memory-efficient PHP syntax implementation, including Lexer, Parser, AST, and utilities for Mago.
Documentation
use mago_database::file::HasFileId;

use crate::T;
use crate::ast::ast::FullyQualifiedIdentifier;
use crate::ast::ast::Identifier;
use crate::ast::ast::LocalIdentifier;
use crate::ast::ast::QualifiedIdentifier;
use crate::error::ParseError;
use crate::parser::Parser;

impl<'input, 'arena> Parser<'input, 'arena> {
    pub(crate) fn parse_identifier(&mut self) -> Result<Identifier<'arena>, ParseError> {
        let token = self.stream.lookahead(0)?.ok_or_else(|| self.stream.unexpected(None, &[]))?;

        Ok(match &token.kind {
            T![QualifiedIdentifier] => Identifier::Qualified(self.parse_qualified_identifier()?),
            T![FullyQualifiedIdentifier] => Identifier::FullyQualified(self.parse_fully_qualified_identifier()?),
            _ => Identifier::Local(self.parse_local_identifier()?),
        })
    }

    pub(crate) fn parse_local_identifier(&mut self) -> Result<LocalIdentifier<'arena>, ParseError> {
        let token = self.stream.consume()?;

        if !token.kind.is_identifier_maybe_reserved() {
            return Err(self.stream.unexpected(Some(token), &[T![Identifier]]));
        }

        Ok(LocalIdentifier { span: token.span_for(self.stream.file_id()), value: token.value })
    }

    pub(crate) fn parse_qualified_identifier(&mut self) -> Result<QualifiedIdentifier<'arena>, ParseError> {
        let token = self.stream.eat(T![QualifiedIdentifier])?;

        Ok(QualifiedIdentifier { span: token.span_for(self.stream.file_id()), value: token.value })
    }

    pub(crate) fn parse_fully_qualified_identifier(&mut self) -> Result<FullyQualifiedIdentifier<'arena>, ParseError> {
        let token = self.stream.eat(T![FullyQualifiedIdentifier])?;

        Ok(FullyQualifiedIdentifier { span: token.span_for(self.stream.file_id()), value: token.value })
    }
}