swc_ecma_parser 0.16.0

Feature-complete es2019 parser.
Documentation
use super::*;
use crate::parser::test_parser;
use swc_common::DUMMY_SP as span;
use testing::assert_eq_ignore_span;

fn jsx(src: &'static str) -> Box<Expr> {
    test_parser(
        src,
        crate::Syntax::Es(crate::EsConfig {
            jsx: true,
            ..Default::default()
        }),
        |p| {
            p.parse_expr().map_err(|mut e| {
                e.emit();
            })
        },
    )
}

#[test]
fn self_closing_01() {
    assert_eq_ignore_span!(
        jsx("<a />"),
        box Expr::JSXElement(box JSXElement {
            span,
            opening: JSXOpeningElement {
                span,
                name: JSXElementName::Ident(Ident::new("a".into(), span)),
                self_closing: true,
                attrs: vec![],
                type_args: None,
            },
            children: vec![],
            closing: None,
        })
    );
}

#[test]
fn normal_01() {
    assert_eq_ignore_span!(
        jsx("<a>foo</a>"),
        box Expr::JSXElement(box JSXElement {
            span,
            opening: JSXOpeningElement {
                span,
                name: JSXElementName::Ident(Ident::new("a".into(), span)),
                self_closing: false,
                attrs: vec![],
                type_args: None,
            },
            children: vec![JSXElementChild::JSXText(JSXText {
                span,
                raw: "foo".into(),
                value: "foo".into(),
            })],
            closing: Some(JSXClosingElement {
                span,
                name: JSXElementName::Ident(Ident::new("a".into(), span)),
            })
        })
    );
}

#[test]
fn escape_in_attr() {
    assert_eq_ignore_span!(
        jsx(r#"<div id="w &lt; w" />;"#),
        box Expr::JSXElement(box JSXElement {
            span,
            opening: JSXOpeningElement {
                span,
                attrs: vec![JSXAttrOrSpread::JSXAttr(JSXAttr {
                    span,
                    name: JSXAttrName::Ident(Ident::new("id".into(), span)),
                    value: Some(box Expr::Lit(Lit::Str(Str {
                        span,
                        value: "w < w".into(),
                        has_escape: false,
                    }))),
                })],
                name: JSXElementName::Ident(Ident::new("div".into(), span)),
                self_closing: true,
                type_args: None,
            },
            children: vec![],
            closing: None
        })
    );
}