boa_parser 0.21.1

ECMAScript parser for the Boa JavaScript engine.
Documentation
use crate::parser::tests::check_script_parser;
use boa_ast::{
    Declaration, Expression, Span, Statement, StatementList, StatementListItem,
    declaration::{LexicalDeclaration, Variable},
    expression::{Identifier, Yield, literal::Literal},
    function::{FormalParameterList, FunctionBody, GeneratorExpression},
};
use boa_interner::Interner;
use boa_macros::utf16;
use indoc::indoc;

const PSEUDO_LINEAR_POS: boa_ast::LinearPosition = boa_ast::LinearPosition::new(0);
const EMPTY_LINEAR_SPAN: boa_ast::LinearSpan =
    boa_ast::LinearSpan::new(PSEUDO_LINEAR_POS, PSEUDO_LINEAR_POS);

#[test]
fn check_generator_function_expression() {
    let interner = &mut Interner::default();
    let r#gen = interner.get_or_intern_static("gen", utf16!("gen"));
    check_script_parser(
        indoc! {"
            const gen = function*() {
                yield 1;
            };
        "},
        vec![
            Declaration::Lexical(LexicalDeclaration::Const(
                vec![Variable::from_identifier(
                    Identifier::new(r#gen, Span::new((1, 7), (1, 10))),
                    Some(
                        GeneratorExpression::new(
                            Some(Identifier::new(r#gen, Span::new((1, 7), (1, 10)))),
                            FormalParameterList::default(),
                            FunctionBody::new(
                                StatementList::new(
                                    [StatementListItem::Statement(
                                        Statement::Expression(Expression::from(Yield::new(
                                            Some(
                                                Literal::new(1, Span::new((2, 11), (2, 12))).into(),
                                            ),
                                            false,
                                            Span::new((2, 5), (2, 12)),
                                        )))
                                        .into(),
                                    )],
                                    PSEUDO_LINEAR_POS,
                                    false,
                                ),
                                Span::new((1, 25), (3, 2)),
                            ),
                            EMPTY_LINEAR_SPAN,
                            false,
                            Span::new((1, 13), (3, 2)),
                        )
                        .into(),
                    ),
                )]
                .try_into()
                .unwrap(),
            ))
            .into(),
        ],
        interner,
    );
}

#[test]
fn check_generator_function_delegate_yield_expression() {
    let interner = &mut Interner::default();
    let r#gen = interner.get_or_intern_static("gen", utf16!("gen"));
    check_script_parser(
        indoc! {"
            const gen = function*() {
                yield* 1;
            };
        "},
        vec![
            Declaration::Lexical(LexicalDeclaration::Const(
                vec![Variable::from_identifier(
                    Identifier::new(r#gen, Span::new((1, 7), (1, 10))),
                    Some(
                        GeneratorExpression::new(
                            Some(Identifier::new(r#gen, Span::new((1, 7), (1, 10)))),
                            FormalParameterList::default(),
                            FunctionBody::new(
                                StatementList::new(
                                    [StatementListItem::Statement(
                                        Statement::Expression(Expression::from(Yield::new(
                                            Some(
                                                Literal::new(1, Span::new((2, 12), (2, 13))).into(),
                                            ),
                                            true,
                                            Span::new((2, 5), (2, 13)),
                                        )))
                                        .into(),
                                    )],
                                    PSEUDO_LINEAR_POS,
                                    false,
                                ),
                                Span::new((1, 25), (3, 2)),
                            ),
                            EMPTY_LINEAR_SPAN,
                            false,
                            Span::new((1, 13), (3, 2)),
                        )
                        .into(),
                    ),
                )]
                .try_into()
                .unwrap(),
            ))
            .into(),
        ],
        interner,
    );
}