mago-syntax 1.0.0-alpha.5

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::*;
use crate::ast::sequence::TokenSeparatedSequence;
use crate::error::ParseError;
use crate::parser::internal::expression::parse_expression;
use crate::parser::internal::terminator::parse_terminator;
use crate::parser::internal::token_stream::TokenStream;
use crate::parser::internal::utils;

pub fn parse_unset(stream: &mut TokenStream<'_, '_>) -> Result<Unset, ParseError> {
    let unset = utils::expect_keyword(stream, T!["unset"])?;
    let left_parenthesis = utils::expect_span(stream, T!["("])?;

    let mut values = vec![];
    let mut commas = vec![];
    loop {
        if matches!(utils::peek(stream)?.kind, T![")"]) {
            break;
        }

        values.push(parse_expression(stream)?);

        match utils::peek(stream)?.kind {
            T![","] => {
                commas.push(utils::expect_any(stream)?);
            }
            _ => {
                break;
            }
        }
    }

    let right_parenthesis = utils::expect_span(stream, T![")"])?;
    let terminator = parse_terminator(stream)?;

    Ok(Unset {
        unset,
        left_parenthesis,
        values: TokenSeparatedSequence::new(values, commas),
        right_parenthesis,
        terminator,
    })
}