1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
use crate::util::is_valid_ident;
use swc_common::{Fold, FoldWith};
use swc_ecma_ast::*;
#[derive(Default, Clone, Copy)]
pub struct PropertyLiteral;
noop_fold_type!(PropertyLiteral);
impl Fold<Module> for PropertyLiteral {
fn fold(&mut self, node: Module) -> Module {
validate!(node.fold_children(self))
}
}
impl Fold<PropName> for PropertyLiteral {
fn fold(&mut self, n: PropName) -> PropName {
let n = validate!(n.fold_children(self));
match n {
PropName::Str(Str {
value: sym, span, ..
}) => {
if sym.is_reserved_for_es3() || !is_valid_ident(&sym) {
PropName::Str(Str {
span,
value: sym,
has_escape: false,
})
} else {
PropName::Ident(Ident::new(sym, span))
}
}
PropName::Ident(i) => {
let Ident { sym, span, .. } = i;
if sym.is_reserved_for_es3() || sym.contains('-') || sym.contains('.') {
PropName::Str(Str {
span,
value: sym,
has_escape: false,
})
} else {
PropName::Ident(Ident { span, sym, ..i })
}
}
_ => n,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
test!(
::swc_ecma_parser::Syntax::default(),
|_| PropertyLiteral,
babel_basic,
r#"var foo = {
// changed
"bar": function () {},
"1": function () {},
// not changed
"default": 1,
[a]: 2,
foo: 1
};"#,
r#"var foo = {
bar: function () {},
'1': function () {},
"default": 1,
[a]: 2,
foo: 1
};"#,
ok_if_code_eq
);
test!(
::swc_ecma_parser::Syntax::default(),
|_| PropertyLiteral,
str_lit,
r#"'use strict';
var x = {
'foo.bar': true
};"#,
r#"'use strict';
var x = {
'foo.bar': true
};"#,
ok_if_code_eq
);
}