mago-syntax 1.20.1

A correct, fast, and memory-efficient PHP syntax implementation, including Lexer, Parser, AST, and utilities for Mago.
Documentation
use crate::T;
use crate::ast::ast::Attribute;
use crate::ast::ast::AttributeList;
use crate::ast::sequence::Sequence;
use crate::error::ParseError;
use crate::parser::Parser;

impl<'input, 'arena> Parser<'input, 'arena> {
    pub(crate) fn parse_attribute_list_sequence(
        &mut self,
    ) -> Result<Sequence<'arena, AttributeList<'arena>>, ParseError> {
        let mut inner = self.new_vec();
        while let Some(T!["#["]) = self.stream.peek_kind(0)? {
            inner.push(self.parse_attribute_list()?);
        }

        Ok(Sequence::new(inner))
    }

    pub(crate) fn parse_attribute_list(&mut self) -> Result<AttributeList<'arena>, ParseError> {
        let result = self.parse_comma_separated_sequence(T!["#["], T!["]"], |p| p.parse_attribute())?;

        Ok(AttributeList { hash_left_bracket: result.open, attributes: result.sequence, right_bracket: result.close })
    }

    pub(crate) fn parse_attribute(&mut self) -> Result<Attribute<'arena>, ParseError> {
        Ok(Attribute { name: self.parse_identifier()?, argument_list: self.parse_optional_argument_list()? })
    }
}