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::Yield;
use crate::ast::ast::YieldFrom;
use crate::ast::ast::YieldPair;
use crate::ast::ast::YieldValue;
use crate::error::ParseError;
use crate::parser::Parser;
use crate::token::Precedence;

impl<'input, 'arena> Parser<'input, 'arena> {
    pub(crate) fn parse_yield(&mut self) -> Result<Yield<'arena>, ParseError> {
        let r#yield = self.expect_keyword(T!["yield"])?;

        let next = self.stream.lookahead(0)?.ok_or_else(|| self.stream.unexpected(None, &[]))?;
        Ok(match next.kind {
            T![";" | "?>"] => Yield::Value(YieldValue { r#yield, value: None }),
            T!["from"] => Yield::From(YieldFrom {
                r#yield,
                from: self.expect_keyword(T!["from"])?,
                iterator: self.arena.alloc(self.parse_expression_with_precedence(Precedence::YieldFrom)?),
            }),
            _ => {
                let key_or_value = self.parse_expression_with_precedence(Precedence::Yield)?;

                if matches!(self.stream.peek_kind(0)?, Some(T!["=>"])) {
                    Yield::Pair(YieldPair {
                        r#yield,
                        key: self.arena.alloc(key_or_value),
                        arrow: self.stream.eat_span(T!["=>"])?,
                        value: self.arena.alloc(self.parse_expression_with_precedence(Precedence::Yield)?),
                    })
                } else {
                    Yield::Value(YieldValue { r#yield, value: Some(self.arena.alloc(key_or_value)) })
                }
            }
        })
    }
}