swc_ecma_transforms_compat/es3/
member_expr_lits.rsuse swc_ecma_ast::*;
use swc_ecma_utils::is_valid_ident;
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith};
use swc_trace_macro::swc_trace;
#[tracing::instrument(level = "info", skip_all)]
pub fn member_expression_literals() -> impl Fold {
    MemberExprLit
}
#[derive(Default, Clone, Copy)]
struct MemberExprLit;
#[swc_trace]
impl Fold for MemberExprLit {
    noop_fold_type!();
    fn fold_member_expr(&mut self, e: MemberExpr) -> MemberExpr {
        let e = e.fold_children_with(self);
        if let MemberProp::Ident(i) = e.prop {
            if i.sym.is_reserved() || i.sym.is_reserved_in_strict_mode(true)
                        || i.sym.is_reserved_in_es3()
                        || !is_valid_ident(&i.sym)
            {
                return MemberExpr {
                    prop: MemberProp::Computed(ComputedPropName {
                        span: i.span,
                        expr: Box::new(Expr::Lit(Lit::Str(Str {
                            span: i.span,
                            raw: None,
                            value: i.sym,
                        }))),
                    }),
                    ..e
                };
            } else {
                return MemberExpr {
                    prop: MemberProp::Ident(swc_ecma_utils::quote_ident!(i.span, i.sym)),
                    ..e
                };
            }
        };
        e
    }
}
#[cfg(test)]
mod tests {
    use swc_ecma_transforms_testing::test;
    use super::*;
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| MemberExprLit,
        basic,
        r#"obj["foo"] = "isValid";
obj.const = "isKeyword";
obj["var"] = "isKeyword";"#,
        r#"obj["foo"] = "isValid";
obj["const"] = "isKeyword";
obj["var"] = "isKeyword";"#,
        ok_if_code_eq
    );
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| MemberExprLit,
        issue_206,
        "const number = foo[bar1][baz1]",
        "const number = foo[bar1][baz1]"
    );
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| MemberExprLit,
        issue_211,
        "_query[idx]=$this.attr('data-ref');",
        "_query[idx]=$this.attr('data-ref');"
    );
}