swc_ecma_transforms_base/
feature.rs1#![allow(non_upper_case_globals)]
2use bitflags::bitflags;
3use swc_ecma_ast::EsVersion::{self, *};
4
5bitflags! {
6 #[derive(Default, Clone, Copy)]
7 pub struct FeatureFlag: u64 {
8 const TemplateLiterals = 1 << 0;
10
11 const Literals = 1 << 1;
13
14 const FunctionName = 1 << 2;
16
17 const ArrowFunctions = 1 << 3;
19
20 const BlockScopedFunctions = 1 << 4;
22
23 const Classes = 1 << 5;
25
26 const ObjectSuper = 1 << 6;
28
29 const ShorthandProperties = 1 << 7;
31
32 const DuplicateKeys = 1 << 8;
34
35 const ComputedProperties = 1 << 9;
37
38 const ForOf = 1 << 10;
40
41 const StickyRegex = 1 << 11;
43
44 const DotAllRegex = 1 << 12;
46
47 const UnicodeRegex = 1 << 13;
49
50 const Spread = 1 << 14;
52
53 const Parameters = 1 << 15;
55
56 const Destructuring = 1 << 16;
58
59 const BlockScoping = 1 << 17;
61
62 const TypeOfSymbol = 1 << 18;
64
65 const NewTarget = 1 << 19;
67
68 const Regenerator = 1 << 20;
70
71 const ExponentiationOperator = 1 << 21;
73
74 const AsyncToGenerator = 1 << 22;
76
77 const AsyncGeneratorFunctions = 1 << 23;
79
80 const ObjectRestSpread = 1 << 24;
82
83 const UnicodePropertyRegex = 1 << 25;
85
86 const JsonStrings = 1 << 26;
88
89 const OptionalCatchBinding = 1 << 27;
91
92 const NamedCapturingGroupsRegex = 1 << 28;
94
95 const MemberExpressionLiterals = 1 << 29;
97
98 const PropertyLiterals = 1 << 30;
100
101 const ReservedWords = 1 << 31;
103
104 const ExportNamespaceFrom = 1 << 32;
106
107 const NullishCoalescing = 1 << 33;
109
110 const LogicalAssignmentOperators = 1 << 34;
112
113 const OptionalChaining = 1 << 35;
115
116 const ClassProperties = 1 << 36;
118
119 const NumericSeparator = 1 << 37;
121
122 const PrivateMethods = 1 << 38;
124
125 const ClassStaticBlock = 1 << 39;
127
128 const PrivatePropertyInObject = 1 << 40;
130
131 const UnicodeEscapes = 1 << 41;
133
134 const BugfixAsyncArrowsInClass = 1 << 42;
136
137 const BugfixEdgeDefaultParam = 1 << 43;
139
140 const BugfixTaggedTemplateCaching = 1 << 44;
142
143 const BugfixSafariIdDestructuringCollisionInFunctionExpression = 1 << 45;
145
146 const BugfixTransformEdgeFunctionName = 1 << 46; const BugfixTransformSafariBlockShadowing = 1 << 47; const BugfixTransformSafariForShadowing = 1 << 48; const BugfixTransformV8SpreadParametersInOptionalChaining = 1 << 49; }
158}
159
160pub fn enable_available_feature_from_es_version(version: EsVersion) -> FeatureFlag {
161 let mut feature = FeatureFlag::empty();
162
163 if version < Es5 {
164 return feature;
165 }
166
167 feature |= FeatureFlag::PropertyLiterals
168 | FeatureFlag::MemberExpressionLiterals
169 | FeatureFlag::ReservedWords;
170
171 if version < Es2015 {
172 return feature;
173 }
174
175 feature |= FeatureFlag::ArrowFunctions
176 | FeatureFlag::BlockScopedFunctions
177 | FeatureFlag::BlockScoping
178 | FeatureFlag::Classes
179 | FeatureFlag::ComputedProperties
180 | FeatureFlag::Destructuring
181 | FeatureFlag::DuplicateKeys
182 | FeatureFlag::ForOf
183 | FeatureFlag::FunctionName
184 | FeatureFlag::NewTarget
185 | FeatureFlag::ObjectSuper
186 | FeatureFlag::Parameters
187 | FeatureFlag::Regenerator
188 | FeatureFlag::ShorthandProperties
189 | FeatureFlag::Spread
190 | FeatureFlag::StickyRegex
191 | FeatureFlag::TemplateLiterals
192 | FeatureFlag::TypeOfSymbol
193 | FeatureFlag::UnicodeRegex;
194
195 if version < Es2016 {
196 return feature;
197 }
198
199 feature |= FeatureFlag::ExponentiationOperator;
200
201 if version < Es2017 {
202 return feature;
203 }
204
205 feature |= FeatureFlag::AsyncToGenerator;
207
208 if version < Es2018 {
209 return feature;
210 }
211
212 feature |= FeatureFlag::ObjectRestSpread
213 | FeatureFlag::DotAllRegex
214 | FeatureFlag::NamedCapturingGroupsRegex
215 | FeatureFlag::UnicodePropertyRegex;
216
217 if version < Es2019 {
218 return feature;
219 }
220
221 feature |= FeatureFlag::OptionalCatchBinding;
222
223 if version < Es2020 {
224 return feature;
225 }
226
227 feature |= FeatureFlag::ExportNamespaceFrom
228 | FeatureFlag::NullishCoalescing
229 | FeatureFlag::OptionalChaining;
230
231 if version < Es2021 {
232 return feature;
233 }
234
235 feature |= FeatureFlag::LogicalAssignmentOperators;
236
237 if version < Es2022 {
238 return feature;
239 }
240
241 feature |= FeatureFlag::ClassProperties
242 | FeatureFlag::ClassStaticBlock
243 | FeatureFlag::PrivatePropertyInObject;
244
245 feature
246}