[rust][wip] Codegen conversion from HermesParser (C++)
Joe Savona committed
Aug 1, 2023 at 13:55 UTC
e353f3702eeae21a18f508886f1983d8c19cdb58
15 files changed
+4311
-187
compiler/forget/Cargo.lock
+1
@@ -528,6 +528,7 @@ version = "0.1.0"
528
dependencies = [
529
"forget_diagnostics",
530
"forget_estree",
531
+ "forget_estree_codegen",
532
"hermes",
533
"juno_support",
534
]
compiler/forget/crates/forget_build_hir/src/context.rs
+4
@@ -65,4 +65,8 @@ impl<'ast> Visitor<'ast> for ContextVisitor<'ast> {
65
_ => {}
66
}
67
}
68
+
69
+ fn visit_literal(&mut self, _literal: &'ast forget_estree::Literal) {
70
+ // no-op
71
+ }
72
}
compiler/forget/crates/forget_estree/src/generated.rs
+424
-40
@@ -3,7 +3,7 @@
3
use std::num::NonZeroU32;
4
use serde::ser::{Serializer, SerializeMap};
5
use serde::{Serialize, Deserialize};
6
-use crate::{JsValue, Binding, SourceRange};
6
+use crate::{JsValue, Binding, SourceRange, Number};
7
#[derive(Serialize, Deserialize, Clone, Debug)]
8
#[serde(deny_unknown_fields)]
9
pub struct SourceLocation {
@@ -19,6 +19,14 @@ pub struct Position {
19
}
20
#[derive(Serialize, Deserialize, Clone, Debug)]
21
#[serde(deny_unknown_fields)]
22
+pub struct Class {
23
+ pub id: Option<Identifier>,
24
+ #[serde(rename = "superClass")]
25
+ pub super_class: Option<Expression>,
26
+ pub body: ClassBody,
27
+}
28
+#[derive(Serialize, Deserialize, Clone, Debug)]
29
+#[serde(deny_unknown_fields)]
30
pub struct Function {
31
pub id: Option<Identifier>,
32
pub params: Vec<Pattern>,
@@ -101,6 +109,88 @@ impl Serialize for Literal {
109
}
110
}
111
#[derive(Deserialize, Clone, Debug)]
112
+pub struct NumericLiteral {
113
+ pub value: Number,
114
+ #[serde(default)]
115
+ pub loc: Option<SourceLocation>,
116
+ #[serde(default)]
117
+ pub range: Option<SourceRange>,
118
+}
119
+impl Serialize for NumericLiteral {
120
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
121
+ where
122
+ S: Serializer,
123
+ {
124
+ let mut state = serializer.serialize_map(None)?;
125
+ state.serialize_entry("type", "NumericLiteral")?;
126
+ state.serialize_entry("value", &self.value)?;
127
+ state.serialize_entry("loc", &self.loc)?;
128
+ state.serialize_entry("range", &self.range)?;
129
+ state.end()
130
+ }
131
+}
132
+#[derive(Deserialize, Clone, Debug)]
133
+pub struct BooleanLiteral {
134
+ pub value: bool,
135
+ #[serde(default)]
136
+ pub loc: Option<SourceLocation>,
137
+ #[serde(default)]
138
+ pub range: Option<SourceRange>,
139
+}
140
+impl Serialize for BooleanLiteral {
141
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
142
+ where
143
+ S: Serializer,
144
+ {
145
+ let mut state = serializer.serialize_map(None)?;
146
+ state.serialize_entry("type", "BooleanLiteral")?;
147
+ state.serialize_entry("value", &self.value)?;
148
+ state.serialize_entry("loc", &self.loc)?;
149
+ state.serialize_entry("range", &self.range)?;
150
+ state.end()
151
+ }
152
+}
153
+#[derive(Deserialize, Clone, Debug)]
154
+pub struct NullLiteral {
155
+ #[serde(default)]
156
+ pub loc: Option<SourceLocation>,
157
+ #[serde(default)]
158
+ pub range: Option<SourceRange>,
159
+}
160
+impl Serialize for NullLiteral {
161
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
162
+ where
163
+ S: Serializer,
164
+ {
165
+ let mut state = serializer.serialize_map(None)?;
166
+ state.serialize_entry("type", "NullLiteral")?;
167
+ state.serialize_entry("loc", &self.loc)?;
168
+ state.serialize_entry("range", &self.range)?;
169
+ state.end()
170
+ }
171
+}
172
+#[derive(Deserialize, Clone, Debug)]
173
+pub struct StringLiteral {
174
+ pub value: String,
175
+ #[serde(default)]
176
+ pub loc: Option<SourceLocation>,
177
+ #[serde(default)]
178
+ pub range: Option<SourceRange>,
179
+}
180
+impl Serialize for StringLiteral {
181
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
182
+ where
183
+ S: Serializer,
184
+ {
185
+ let mut state = serializer.serialize_map(None)?;
186
+ state.serialize_entry("type", "StringLiteral")?;
187
+ state.serialize_entry("value", &self.value)?;
188
+ state.serialize_entry("loc", &self.loc)?;
189
+ state.serialize_entry("range", &self.range)?;
190
+ state.end()
191
+ }
192
+}
193
+#[derive(Deserialize, Clone, Debug)]
194
pub struct Program {
195
pub body: Vec<ModuleItem>,
196
#[serde(rename = "sourceType")]
@@ -610,32 +700,6 @@ impl Serialize for FunctionDeclaration {
700
}
701
}
702
#[derive(Deserialize, Clone, Debug)]
613
-pub struct Class {
614
- pub id: Option<Identifier>,
615
- #[serde(rename = "superClass")]
616
- pub super_class: Option<Expression>,
617
- pub body: ClassBody,
618
- #[serde(default)]
619
- pub loc: Option<SourceLocation>,
620
- #[serde(default)]
621
- pub range: Option<SourceRange>,
622
-}
623
-impl Serialize for Class {
624
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
625
- where
626
- S: Serializer,
627
- {
628
- let mut state = serializer.serialize_map(None)?;
629
- state.serialize_entry("type", "Class")?;
630
- state.serialize_entry("id", &self.id)?;
631
- state.serialize_entry("superClass", &self.super_class)?;
632
- state.serialize_entry("body", &self.body)?;
633
- state.serialize_entry("loc", &self.loc)?;
634
- state.serialize_entry("range", &self.range)?;
635
- state.end()
636
- }
637
-}
638
-#[derive(Deserialize, Clone, Debug)]
703
pub struct ClassDeclaration {
704
#[serde(flatten)]
705
pub class: Class,
@@ -1062,9 +1126,6 @@ pub struct MemberExpression {
1126
pub property: Expression,
1127
#[serde(rename = "computed")]
1128
pub is_computed: bool,
1065
- #[serde(rename = "optional")]
1066
- #[serde(default)]
1067
- pub is_optional: bool,
1129
#[serde(default)]
1130
pub loc: Option<SourceLocation>,
1131
#[serde(default)]
@@ -1080,7 +1141,6 @@ impl Serialize for MemberExpression {
1141
state.serialize_entry("object", &self.object)?;
1142
state.serialize_entry("property", &self.property)?;
1143
state.serialize_entry("computed", &self.is_computed)?;
1083
- state.serialize_entry("optional", &self.is_optional)?;
1144
state.serialize_entry("loc", &self.loc)?;
1145
state.serialize_entry("range", &self.range)?;
1146
state.end()
@@ -1115,9 +1175,6 @@ impl Serialize for ConditionalExpression {
1175
pub struct CallExpression {
1176
pub callee: ExpressionOrSuper,
1177
pub arguments: Vec<ExpressionOrSpread>,
1118
- #[serde(rename = "optional")]
1119
- #[serde(default)]
1120
- pub is_optional: bool,
1178
#[serde(default)]
1179
pub loc: Option<SourceLocation>,
1180
#[serde(default)]
@@ -1132,7 +1189,6 @@ impl Serialize for CallExpression {
1189
state.serialize_entry("type", "CallExpression")?;
1190
state.serialize_entry("callee", &self.callee)?;
1191
state.serialize_entry("arguments", &self.arguments)?;
1135
- state.serialize_entry("optional", &self.is_optional)?;
1192
state.serialize_entry("loc", &self.loc)?;
1193
state.serialize_entry("range", &self.range)?;
1194
state.end()
@@ -1250,7 +1306,7 @@ impl Serialize for YieldExpression {
1306
#[derive(Deserialize, Clone, Debug)]
1307
pub struct ImportDeclaration {
1308
pub specifiers: Vec<ImportDeclarationSpecifier>,
1253
- pub source: Literal,
1309
+ pub source: _Literal,
1310
#[serde(default)]
1311
pub loc: Option<SourceLocation>,
1312
#[serde(default)]
@@ -1339,7 +1395,7 @@ impl Serialize for ImportNamespaceSpecifier {
1395
pub struct ExportNamedDeclaration {
1396
pub declaration: Option<Declaration>,
1397
pub specifiers: Vec<ExportSpecifier>,
1342
- pub source: Option<Literal>,
1398
+ pub source: Option<_Literal>,
1399
#[serde(default)]
1400
pub loc: Option<SourceLocation>,
1401
#[serde(default)]
@@ -1404,7 +1460,7 @@ impl Serialize for ExportDefaultDeclaration {
1460
}
1461
#[derive(Deserialize, Clone, Debug)]
1462
pub struct ExportAllDeclaration {
1407
- pub source: Literal,
1463
+ pub source: _Literal,
1464
#[serde(default)]
1465
pub exported: Option<Identifier>,
1466
#[serde(default)]
@@ -1704,7 +1760,7 @@ pub struct JSXFragment {
1760
pub opening_fragment: JSXOpeningFragment,
1761
pub children: Vec<JSXChildItem>,
1762
#[serde(rename = "closingFragment")]
1707
- pub closing_fragment: Option<JSXClosingFragment>,
1763
+ pub closing_fragment: JSXClosingFragment,
1764
#[serde(default)]
1765
pub loc: Option<SourceLocation>,
1766
#[serde(default)]
@@ -2013,7 +2069,7 @@ impl Serialize for ChainExpression {
2069
#[derive(Deserialize, Clone, Debug)]
2070
pub struct OptionalMemberExpression {
2071
pub object: Expression,
2016
- pub property: Identifier,
2072
+ pub property: Expression,
2073
#[serde(rename = "computed")]
2074
pub is_computed: bool,
2075
#[serde(rename = "optional")]
@@ -2328,6 +2384,7 @@ pub enum Expression {
2384
AssignmentExpression(Box<AssignmentExpression>),
2385
AwaitExpression(Box<AwaitExpression>),
2386
BinaryExpression(Box<BinaryExpression>),
2387
+ BooleanLiteral(Box<BooleanLiteral>),
2388
CallExpression(Box<CallExpression>),
2389
ChainExpression(Box<ChainExpression>),
2390
ClassExpression(Box<ClassExpression>),
@@ -2341,10 +2398,13 @@ pub enum Expression {
2398
MemberExpression(Box<MemberExpression>),
2399
MetaProperty(Box<MetaProperty>),
2400
NewExpression(Box<NewExpression>),
2401
+ NullLiteral(Box<NullLiteral>),
2402
+ NumericLiteral(Box<NumericLiteral>),
2403
ObjectExpression(Box<ObjectExpression>),
2404
OptionalCallExpression(Box<OptionalCallExpression>),
2405
OptionalMemberExpression(Box<OptionalMemberExpression>),
2406
SequenceExpression(Box<SequenceExpression>),
2407
+ StringLiteral(Box<StringLiteral>),
2408
TaggedTemplateExpression(Box<TaggedTemplateExpression>),
2409
TemplateLiteral(Box<TemplateLiteral>),
2410
ThisExpression(Box<ThisExpression>),
@@ -2359,6 +2419,7 @@ enum __ExpressionTag {
2419
AssignmentExpression,
2420
AwaitExpression,
2421
BinaryExpression,
2422
+ BooleanLiteral,
2423
CallExpression,
2424
ChainExpression,
2425
ClassExpression,
@@ -2372,10 +2433,13 @@ enum __ExpressionTag {
2433
MemberExpression,
2434
MetaProperty,
2435
NewExpression,
2436
+ NullLiteral,
2437
+ NumericLiteral,
2438
ObjectExpression,
2439
OptionalCallExpression,
2440
OptionalMemberExpression,
2441
SequenceExpression,
2442
+ StringLiteral,
2443
TaggedTemplateExpression,
2444
TemplateLiteral,
2445
ThisExpression,
@@ -2435,6 +2499,14 @@ impl<'de> serde::Deserialize<'de> for Expression {
2499
)?;
2500
Ok(Expression::BinaryExpression(node))
2501
}
2502
+ __ExpressionTag::BooleanLiteral => {
2503
+ let node: Box<BooleanLiteral> = <Box<
2504
+ BooleanLiteral,
2505
+ > as Deserialize>::deserialize(
2506
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2507
+ )?;
2508
+ Ok(Expression::BooleanLiteral(node))
2509
+ }
2510
__ExpressionTag::CallExpression => {
2511
let node: Box<CallExpression> = <Box<
2512
CallExpression,
@@ -2539,6 +2611,22 @@ impl<'de> serde::Deserialize<'de> for Expression {
2611
)?;
2612
Ok(Expression::NewExpression(node))
2613
}
2614
+ __ExpressionTag::NullLiteral => {
2615
+ let node: Box<NullLiteral> = <Box<
2616
+ NullLiteral,
2617
+ > as Deserialize>::deserialize(
2618
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2619
+ )?;
2620
+ Ok(Expression::NullLiteral(node))
2621
+ }
2622
+ __ExpressionTag::NumericLiteral => {
2623
+ let node: Box<NumericLiteral> = <Box<
2624
+ NumericLiteral,
2625
+ > as Deserialize>::deserialize(
2626
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2627
+ )?;
2628
+ Ok(Expression::NumericLiteral(node))
2629
+ }
2630
__ExpressionTag::ObjectExpression => {
2631
let node: Box<ObjectExpression> = <Box<
2632
ObjectExpression,
@@ -2571,6 +2659,14 @@ impl<'de> serde::Deserialize<'de> for Expression {
2659
)?;
2660
Ok(Expression::SequenceExpression(node))
2661
}
2662
+ __ExpressionTag::StringLiteral => {
2663
+ let node: Box<StringLiteral> = <Box<
2664
+ StringLiteral,
2665
+ > as Deserialize>::deserialize(
2666
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2667
+ )?;
2668
+ Ok(Expression::StringLiteral(node))
2669
+ }
2670
__ExpressionTag::TaggedTemplateExpression => {
2671
let node: Box<TaggedTemplateExpression> = <Box<
2672
TaggedTemplateExpression,
@@ -2624,6 +2720,78 @@ impl<'de> serde::Deserialize<'de> for Expression {
2720
}
2721
#[derive(Serialize, Clone, Debug)]
2722
#[serde(untagged)]
2723
+pub enum _Literal {
2724
+ BooleanLiteral(Box<BooleanLiteral>),
2725
+ Literal(Box<Literal>),
2726
+ NullLiteral(Box<NullLiteral>),
2727
+ NumericLiteral(Box<NumericLiteral>),
2728
+ StringLiteral(Box<StringLiteral>),
2729
+}
2730
+#[derive(Deserialize, Debug)]
2731
+enum ___LiteralTag {
2732
+ Literal,
2733
+ BooleanLiteral,
2734
+ NullLiteral,
2735
+ StringLiteral,
2736
+ NumericLiteral,
2737
+}
2738
+impl<'de> serde::Deserialize<'de> for _Literal {
2739
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2740
+ where
2741
+ D: serde::Deserializer<'de>,
2742
+ {
2743
+ let tagged = serde::Deserializer::deserialize_any(
2744
+ deserializer,
2745
+ serde::__private::de::TaggedContentVisitor::<
2746
+ ___LiteralTag,
2747
+ >::new("type", "_Literal"),
2748
+ )?;
2749
+ match tagged.0 {
2750
+ ___LiteralTag::Literal => {
2751
+ let node: Box<Literal> = <Box<
2752
+ Literal,
2753
+ > as Deserialize>::deserialize(
2754
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2755
+ )?;
2756
+ Ok(_Literal::Literal(node))
2757
+ }
2758
+ ___LiteralTag::BooleanLiteral => {
2759
+ let node: Box<BooleanLiteral> = <Box<
2760
+ BooleanLiteral,
2761
+ > as Deserialize>::deserialize(
2762
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2763
+ )?;
2764
+ Ok(_Literal::BooleanLiteral(node))
2765
+ }
2766
+ ___LiteralTag::NullLiteral => {
2767
+ let node: Box<NullLiteral> = <Box<
2768
+ NullLiteral,
2769
+ > as Deserialize>::deserialize(
2770
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2771
+ )?;
2772
+ Ok(_Literal::NullLiteral(node))
2773
+ }
2774
+ ___LiteralTag::StringLiteral => {
2775
+ let node: Box<StringLiteral> = <Box<
2776
+ StringLiteral,
2777
+ > as Deserialize>::deserialize(
2778
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2779
+ )?;
2780
+ Ok(_Literal::StringLiteral(node))
2781
+ }
2782
+ ___LiteralTag::NumericLiteral => {
2783
+ let node: Box<NumericLiteral> = <Box<
2784
+ NumericLiteral,
2785
+ > as Deserialize>::deserialize(
2786
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
2787
+ )?;
2788
+ Ok(_Literal::NumericLiteral(node))
2789
+ }
2790
+ }
2791
+ }
2792
+}
2793
+#[derive(Serialize, Clone, Debug)]
2794
+#[serde(untagged)]
2795
pub enum Declaration {
2796
ClassDeclaration(Box<ClassDeclaration>),
2797
FunctionDeclaration(Box<FunctionDeclaration>),
@@ -3066,6 +3234,7 @@ enum __ExpressionOrSuperTag {
3234
AssignmentExpression,
3235
AwaitExpression,
3236
BinaryExpression,
3237
+ BooleanLiteral,
3238
CallExpression,
3239
ChainExpression,
3240
ClassExpression,
@@ -3079,10 +3248,13 @@ enum __ExpressionOrSuperTag {
3248
MemberExpression,
3249
MetaProperty,
3250
NewExpression,
3251
+ NullLiteral,
3252
+ NumericLiteral,
3253
ObjectExpression,
3254
OptionalCallExpression,
3255
OptionalMemberExpression,
3256
SequenceExpression,
3257
+ StringLiteral,
3258
TaggedTemplateExpression,
3259
TemplateLiteral,
3260
ThisExpression,
@@ -3147,6 +3319,14 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSuper {
3319
)?;
3320
Ok(ExpressionOrSuper::Expression(Expression::BinaryExpression(node)))
3321
}
3322
+ __ExpressionOrSuperTag::BooleanLiteral => {
3323
+ let node: Box<BooleanLiteral> = <Box<
3324
+ BooleanLiteral,
3325
+ > as Deserialize>::deserialize(
3326
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3327
+ )?;
3328
+ Ok(ExpressionOrSuper::Expression(Expression::BooleanLiteral(node)))
3329
+ }
3330
__ExpressionOrSuperTag::CallExpression => {
3331
let node: Box<CallExpression> = <Box<
3332
CallExpression,
@@ -3255,6 +3435,22 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSuper {
3435
)?;
3436
Ok(ExpressionOrSuper::Expression(Expression::NewExpression(node)))
3437
}
3438
+ __ExpressionOrSuperTag::NullLiteral => {
3439
+ let node: Box<NullLiteral> = <Box<
3440
+ NullLiteral,
3441
+ > as Deserialize>::deserialize(
3442
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3443
+ )?;
3444
+ Ok(ExpressionOrSuper::Expression(Expression::NullLiteral(node)))
3445
+ }
3446
+ __ExpressionOrSuperTag::NumericLiteral => {
3447
+ let node: Box<NumericLiteral> = <Box<
3448
+ NumericLiteral,
3449
+ > as Deserialize>::deserialize(
3450
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3451
+ )?;
3452
+ Ok(ExpressionOrSuper::Expression(Expression::NumericLiteral(node)))
3453
+ }
3454
__ExpressionOrSuperTag::ObjectExpression => {
3455
let node: Box<ObjectExpression> = <Box<
3456
ObjectExpression,
@@ -3295,6 +3491,14 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSuper {
3491
)?;
3492
Ok(ExpressionOrSuper::Expression(Expression::SequenceExpression(node)))
3493
}
3494
+ __ExpressionOrSuperTag::StringLiteral => {
3495
+ let node: Box<StringLiteral> = <Box<
3496
+ StringLiteral,
3497
+ > as Deserialize>::deserialize(
3498
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3499
+ )?;
3500
+ Ok(ExpressionOrSuper::Expression(Expression::StringLiteral(node)))
3501
+ }
3502
__ExpressionOrSuperTag::TaggedTemplateExpression => {
3503
let node: Box<TaggedTemplateExpression> = <Box<
3504
TaggedTemplateExpression,
@@ -3371,6 +3575,7 @@ enum __ExpressionOrSpreadTag {
3575
AssignmentExpression,
3576
AwaitExpression,
3577
BinaryExpression,
3578
+ BooleanLiteral,
3579
CallExpression,
3580
ChainExpression,
3581
ClassExpression,
@@ -3384,10 +3589,13 @@ enum __ExpressionOrSpreadTag {
3589
MemberExpression,
3590
MetaProperty,
3591
NewExpression,
3592
+ NullLiteral,
3593
+ NumericLiteral,
3594
ObjectExpression,
3595
OptionalCallExpression,
3596
OptionalMemberExpression,
3597
SequenceExpression,
3598
+ StringLiteral,
3599
TaggedTemplateExpression,
3600
TemplateLiteral,
3601
ThisExpression,
@@ -3456,6 +3664,14 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSpread {
3664
)?;
3665
Ok(ExpressionOrSpread::Expression(Expression::BinaryExpression(node)))
3666
}
3667
+ __ExpressionOrSpreadTag::BooleanLiteral => {
3668
+ let node: Box<BooleanLiteral> = <Box<
3669
+ BooleanLiteral,
3670
+ > as Deserialize>::deserialize(
3671
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3672
+ )?;
3673
+ Ok(ExpressionOrSpread::Expression(Expression::BooleanLiteral(node)))
3674
+ }
3675
__ExpressionOrSpreadTag::CallExpression => {
3676
let node: Box<CallExpression> = <Box<
3677
CallExpression,
@@ -3564,6 +3780,22 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSpread {
3780
)?;
3781
Ok(ExpressionOrSpread::Expression(Expression::NewExpression(node)))
3782
}
3783
+ __ExpressionOrSpreadTag::NullLiteral => {
3784
+ let node: Box<NullLiteral> = <Box<
3785
+ NullLiteral,
3786
+ > as Deserialize>::deserialize(
3787
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3788
+ )?;
3789
+ Ok(ExpressionOrSpread::Expression(Expression::NullLiteral(node)))
3790
+ }
3791
+ __ExpressionOrSpreadTag::NumericLiteral => {
3792
+ let node: Box<NumericLiteral> = <Box<
3793
+ NumericLiteral,
3794
+ > as Deserialize>::deserialize(
3795
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3796
+ )?;
3797
+ Ok(ExpressionOrSpread::Expression(Expression::NumericLiteral(node)))
3798
+ }
3799
__ExpressionOrSpreadTag::ObjectExpression => {
3800
let node: Box<ObjectExpression> = <Box<
3801
ObjectExpression,
@@ -3604,6 +3836,14 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSpread {
3836
)?;
3837
Ok(ExpressionOrSpread::Expression(Expression::SequenceExpression(node)))
3838
}
3839
+ __ExpressionOrSpreadTag::StringLiteral => {
3840
+ let node: Box<StringLiteral> = <Box<
3841
+ StringLiteral,
3842
+ > as Deserialize>::deserialize(
3843
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
3844
+ )?;
3845
+ Ok(ExpressionOrSpread::Expression(Expression::StringLiteral(node)))
3846
+ }
3847
__ExpressionOrSpreadTag::TaggedTemplateExpression => {
3848
let node: Box<TaggedTemplateExpression> = <Box<
3849
TaggedTemplateExpression,
@@ -3681,6 +3921,7 @@ enum __FunctionBodyTag {
3921
AssignmentExpression,
3922
AwaitExpression,
3923
BinaryExpression,
3924
+ BooleanLiteral,
3925
CallExpression,
3926
ChainExpression,
3927
ClassExpression,
@@ -3694,10 +3935,13 @@ enum __FunctionBodyTag {
3935
MemberExpression,
3936
MetaProperty,
3937
NewExpression,
3938
+ NullLiteral,
3939
+ NumericLiteral,
3940
ObjectExpression,
3941
OptionalCallExpression,
3942
OptionalMemberExpression,
3943
SequenceExpression,
3944
+ StringLiteral,
3945
TaggedTemplateExpression,
3946
TemplateLiteral,
3947
ThisExpression,
@@ -3765,6 +4009,14 @@ impl<'de> serde::Deserialize<'de> for FunctionBody {
4009
)?;
4010
Ok(FunctionBody::Expression(Expression::BinaryExpression(node)))
4011
}
4012
+ __FunctionBodyTag::BooleanLiteral => {
4013
+ let node: Box<BooleanLiteral> = <Box<
4014
+ BooleanLiteral,
4015
+ > as Deserialize>::deserialize(
4016
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4017
+ )?;
4018
+ Ok(FunctionBody::Expression(Expression::BooleanLiteral(node)))
4019
+ }
4020
__FunctionBodyTag::CallExpression => {
4021
let node: Box<CallExpression> = <Box<
4022
CallExpression,
@@ -3869,6 +4121,22 @@ impl<'de> serde::Deserialize<'de> for FunctionBody {
4121
)?;
4122
Ok(FunctionBody::Expression(Expression::NewExpression(node)))
4123
}
4124
+ __FunctionBodyTag::NullLiteral => {
4125
+ let node: Box<NullLiteral> = <Box<
4126
+ NullLiteral,
4127
+ > as Deserialize>::deserialize(
4128
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4129
+ )?;
4130
+ Ok(FunctionBody::Expression(Expression::NullLiteral(node)))
4131
+ }
4132
+ __FunctionBodyTag::NumericLiteral => {
4133
+ let node: Box<NumericLiteral> = <Box<
4134
+ NumericLiteral,
4135
+ > as Deserialize>::deserialize(
4136
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4137
+ )?;
4138
+ Ok(FunctionBody::Expression(Expression::NumericLiteral(node)))
4139
+ }
4140
__FunctionBodyTag::ObjectExpression => {
4141
let node: Box<ObjectExpression> = <Box<
4142
ObjectExpression,
@@ -3901,6 +4169,14 @@ impl<'de> serde::Deserialize<'de> for FunctionBody {
4169
)?;
4170
Ok(FunctionBody::Expression(Expression::SequenceExpression(node)))
4171
}
4172
+ __FunctionBodyTag::StringLiteral => {
4173
+ let node: Box<StringLiteral> = <Box<
4174
+ StringLiteral,
4175
+ > as Deserialize>::deserialize(
4176
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4177
+ )?;
4178
+ Ok(FunctionBody::Expression(Expression::StringLiteral(node)))
4179
+ }
4180
__FunctionBodyTag::TaggedTemplateExpression => {
4181
let node: Box<TaggedTemplateExpression> = <Box<
4182
TaggedTemplateExpression,
@@ -4037,6 +4313,7 @@ enum __ForInitTag {
4313
AssignmentExpression,
4314
AwaitExpression,
4315
BinaryExpression,
4316
+ BooleanLiteral,
4317
CallExpression,
4318
ChainExpression,
4319
ClassExpression,
@@ -4050,10 +4327,13 @@ enum __ForInitTag {
4327
MemberExpression,
4328
MetaProperty,
4329
NewExpression,
4330
+ NullLiteral,
4331
+ NumericLiteral,
4332
ObjectExpression,
4333
OptionalCallExpression,
4334
OptionalMemberExpression,
4335
SequenceExpression,
4336
+ StringLiteral,
4337
TaggedTemplateExpression,
4338
TemplateLiteral,
4339
ThisExpression,
@@ -4114,6 +4394,14 @@ impl<'de> serde::Deserialize<'de> for ForInit {
4394
)?;
4395
Ok(ForInit::Expression(Expression::BinaryExpression(node)))
4396
}
4397
+ __ForInitTag::BooleanLiteral => {
4398
+ let node: Box<BooleanLiteral> = <Box<
4399
+ BooleanLiteral,
4400
+ > as Deserialize>::deserialize(
4401
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4402
+ )?;
4403
+ Ok(ForInit::Expression(Expression::BooleanLiteral(node)))
4404
+ }
4405
__ForInitTag::CallExpression => {
4406
let node: Box<CallExpression> = <Box<
4407
CallExpression,
@@ -4218,6 +4506,22 @@ impl<'de> serde::Deserialize<'de> for ForInit {
4506
)?;
4507
Ok(ForInit::Expression(Expression::NewExpression(node)))
4508
}
4509
+ __ForInitTag::NullLiteral => {
4510
+ let node: Box<NullLiteral> = <Box<
4511
+ NullLiteral,
4512
+ > as Deserialize>::deserialize(
4513
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4514
+ )?;
4515
+ Ok(ForInit::Expression(Expression::NullLiteral(node)))
4516
+ }
4517
+ __ForInitTag::NumericLiteral => {
4518
+ let node: Box<NumericLiteral> = <Box<
4519
+ NumericLiteral,
4520
+ > as Deserialize>::deserialize(
4521
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4522
+ )?;
4523
+ Ok(ForInit::Expression(Expression::NumericLiteral(node)))
4524
+ }
4525
__ForInitTag::ObjectExpression => {
4526
let node: Box<ObjectExpression> = <Box<
4527
ObjectExpression,
@@ -4250,6 +4554,14 @@ impl<'de> serde::Deserialize<'de> for ForInit {
4554
)?;
4555
Ok(ForInit::Expression(Expression::SequenceExpression(node)))
4556
}
4557
+ __ForInitTag::StringLiteral => {
4558
+ let node: Box<StringLiteral> = <Box<
4559
+ StringLiteral,
4560
+ > as Deserialize>::deserialize(
4561
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4562
+ )?;
4563
+ Ok(ForInit::Expression(Expression::StringLiteral(node)))
4564
+ }
4565
__ForInitTag::TaggedTemplateExpression => {
4566
let node: Box<TaggedTemplateExpression> = <Box<
4567
TaggedTemplateExpression,
@@ -4526,6 +4838,7 @@ enum __AssignmentTargetTag {
4838
AssignmentExpression,
4839
AwaitExpression,
4840
BinaryExpression,
4841
+ BooleanLiteral,
4842
CallExpression,
4843
ChainExpression,
4844
ClassExpression,
@@ -4539,10 +4852,13 @@ enum __AssignmentTargetTag {
4852
MemberExpression,
4853
MetaProperty,
4854
NewExpression,
4855
+ NullLiteral,
4856
+ NumericLiteral,
4857
ObjectExpression,
4858
OptionalCallExpression,
4859
OptionalMemberExpression,
4860
SequenceExpression,
4861
+ StringLiteral,
4862
TaggedTemplateExpression,
4863
TemplateLiteral,
4864
ThisExpression,
@@ -4610,6 +4926,14 @@ impl<'de> serde::Deserialize<'de> for AssignmentTarget {
4926
)?;
4927
Ok(AssignmentTarget::Expression(Expression::BinaryExpression(node)))
4928
}
4929
+ __AssignmentTargetTag::BooleanLiteral => {
4930
+ let node: Box<BooleanLiteral> = <Box<
4931
+ BooleanLiteral,
4932
+ > as Deserialize>::deserialize(
4933
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
4934
+ )?;
4935
+ Ok(AssignmentTarget::Expression(Expression::BooleanLiteral(node)))
4936
+ }
4937
__AssignmentTargetTag::CallExpression => {
4938
let node: Box<CallExpression> = <Box<
4939
CallExpression,
@@ -4714,6 +5038,22 @@ impl<'de> serde::Deserialize<'de> for AssignmentTarget {
5038
)?;
5039
Ok(AssignmentTarget::Expression(Expression::NewExpression(node)))
5040
}
5041
+ __AssignmentTargetTag::NullLiteral => {
5042
+ let node: Box<NullLiteral> = <Box<
5043
+ NullLiteral,
5044
+ > as Deserialize>::deserialize(
5045
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5046
+ )?;
5047
+ Ok(AssignmentTarget::Expression(Expression::NullLiteral(node)))
5048
+ }
5049
+ __AssignmentTargetTag::NumericLiteral => {
5050
+ let node: Box<NumericLiteral> = <Box<
5051
+ NumericLiteral,
5052
+ > as Deserialize>::deserialize(
5053
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5054
+ )?;
5055
+ Ok(AssignmentTarget::Expression(Expression::NumericLiteral(node)))
5056
+ }
5057
__AssignmentTargetTag::ObjectExpression => {
5058
let node: Box<ObjectExpression> = <Box<
5059
ObjectExpression,
@@ -4754,6 +5094,14 @@ impl<'de> serde::Deserialize<'de> for AssignmentTarget {
5094
)?;
5095
Ok(AssignmentTarget::Expression(Expression::SequenceExpression(node)))
5096
}
5097
+ __AssignmentTargetTag::StringLiteral => {
5098
+ let node: Box<StringLiteral> = <Box<
5099
+ StringLiteral,
5100
+ > as Deserialize>::deserialize(
5101
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5102
+ )?;
5103
+ Ok(AssignmentTarget::Expression(Expression::StringLiteral(node)))
5104
+ }
5105
__AssignmentTargetTag::TaggedTemplateExpression => {
5106
let node: Box<TaggedTemplateExpression> = <Box<
5107
TaggedTemplateExpression,
@@ -4938,6 +5286,7 @@ enum __JSXExpressionOrEmptyTag {
5286
AssignmentExpression,
5287
AwaitExpression,
5288
BinaryExpression,
5289
+ BooleanLiteral,
5290
CallExpression,
5291
ChainExpression,
5292
ClassExpression,
@@ -4951,10 +5300,13 @@ enum __JSXExpressionOrEmptyTag {
5300
MemberExpression,
5301
MetaProperty,
5302
NewExpression,
5303
+ NullLiteral,
5304
+ NumericLiteral,
5305
ObjectExpression,
5306
OptionalCallExpression,
5307
OptionalMemberExpression,
5308
SequenceExpression,
5309
+ StringLiteral,
5310
TaggedTemplateExpression,
5311
TemplateLiteral,
5312
ThisExpression,
@@ -5023,6 +5375,14 @@ impl<'de> serde::Deserialize<'de> for JSXExpressionOrEmpty {
5375
)?;
5376
Ok(JSXExpressionOrEmpty::Expression(Expression::BinaryExpression(node)))
5377
}
5378
+ __JSXExpressionOrEmptyTag::BooleanLiteral => {
5379
+ let node: Box<BooleanLiteral> = <Box<
5380
+ BooleanLiteral,
5381
+ > as Deserialize>::deserialize(
5382
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5383
+ )?;
5384
+ Ok(JSXExpressionOrEmpty::Expression(Expression::BooleanLiteral(node)))
5385
+ }
5386
__JSXExpressionOrEmptyTag::CallExpression => {
5387
let node: Box<CallExpression> = <Box<
5388
CallExpression,
@@ -5135,6 +5495,22 @@ impl<'de> serde::Deserialize<'de> for JSXExpressionOrEmpty {
5495
)?;
5496
Ok(JSXExpressionOrEmpty::Expression(Expression::NewExpression(node)))
5497
}
5498
+ __JSXExpressionOrEmptyTag::NullLiteral => {
5499
+ let node: Box<NullLiteral> = <Box<
5500
+ NullLiteral,
5501
+ > as Deserialize>::deserialize(
5502
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5503
+ )?;
5504
+ Ok(JSXExpressionOrEmpty::Expression(Expression::NullLiteral(node)))
5505
+ }
5506
+ __JSXExpressionOrEmptyTag::NumericLiteral => {
5507
+ let node: Box<NumericLiteral> = <Box<
5508
+ NumericLiteral,
5509
+ > as Deserialize>::deserialize(
5510
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5511
+ )?;
5512
+ Ok(JSXExpressionOrEmpty::Expression(Expression::NumericLiteral(node)))
5513
+ }
5514
__JSXExpressionOrEmptyTag::ObjectExpression => {
5515
let node: Box<ObjectExpression> = <Box<
5516
ObjectExpression,
@@ -5179,6 +5555,14 @@ impl<'de> serde::Deserialize<'de> for JSXExpressionOrEmpty {
5555
),
5556
)
5557
}
5558
+ __JSXExpressionOrEmptyTag::StringLiteral => {
5559
+ let node: Box<StringLiteral> = <Box<
5560
+ StringLiteral,
5561
+ > as Deserialize>::deserialize(
5562
+ serde::__private::de::ContentDeserializer::<D::Error>::new(tagged.1),
5563
+ )?;
5564
+ Ok(JSXExpressionOrEmpty::Expression(Expression::StringLiteral(node)))
5565
+ }
5566
__JSXExpressionOrEmptyTag::TaggedTemplateExpression => {
5567
let node: Box<TaggedTemplateExpression> = <Box<
5568
TaggedTemplateExpression,
compiler/forget/crates/forget_estree/src/lib.rs
+1
-1
@@ -7,7 +7,7 @@ mod visit;
7
8
pub use binding::{Binding, BindingId};
9
pub use generated::*;
10
-pub use js_value::JsValue;
10
+pub use js_value::{JsValue, Number};
11
pub use range::SourceRange;
12
pub use visit::*;
13
compiler/forget/crates/forget_estree/src/snapshots/forget_estree__tests__fixtures@simple.json.snap
-1
@@ -286,7 +286,6 @@ Output:
286
}
287
},
288
"computed": false,
289
- "optional": false,
289
"loc": {
290
"source": null,
291
"start": {
compiler/forget/crates/forget_estree/src/visit.rs
+12
-7
@@ -3,7 +3,7 @@ use crate::{
3
ExportDefaultDeclaration, ExportNamedDeclaration, Expression, ExpressionOrSpread,
4
ExpressionOrSuper, ForInInit, ForInit, Function, FunctionBody, Identifier, ImportDeclaration,
5
ImportDeclarationSpecifier, ImportOrExportDeclaration, Literal, MethodDefinition, ModuleItem,
6
- Pattern, Program, Statement, SwitchCase, VariableDeclarator,
6
+ Pattern, Program, Statement, SwitchCase, VariableDeclarator, _Literal,
7
};
8
9
/// Trait for visiting an estree
@@ -97,7 +97,7 @@ pub trait Visitor<'ast> {
97
fn visit_import_declaration_specifier(
98
&mut self,
99
specifier: &'ast ImportDeclarationSpecifier,
100
- _source: &'ast Literal,
100
+ _source: &'ast _Literal,
101
) {
102
match specifier {
103
ImportDeclarationSpecifier::ImportSpecifier(specifier) => {
@@ -406,17 +406,22 @@ pub trait Visitor<'ast> {
406
407
fn visit_identifier(&mut self, _identifier: &'ast Identifier) {
408
// nothing to do unless overridden
409
+ todo!("Implement visit_identifier()")
410
}
411
411
- fn visit_import_source(&mut self, literal: &'ast Literal) {
412
- self.visit_literal(literal);
412
+ fn visit_import_source(&mut self, literal: &'ast _Literal) {
413
+ self.visit_any_literal(literal);
414
}
415
415
- fn visit_export_source(&mut self, literal: &'ast Literal) {
416
- self.visit_literal(literal);
416
+ fn visit_export_source(&mut self, literal: &'ast _Literal) {
417
+ self.visit_any_literal(literal);
418
+ }
419
+
420
+ fn visit_any_literal(&mut self, _literal: &'ast _Literal) {
421
+ todo!("Implement visit_any_literal()")
422
}
423
424
fn visit_literal(&mut self, _literal: &'ast Literal) {
420
- // nothing to do unless overridden
425
+ todo!("Implement visit_literal()")
426
}
427
}
compiler/forget/crates/forget_estree_codegen/src/codegen.rs
+306
-1
@@ -20,6 +20,21 @@ pub fn estree() -> String {
20
)
21
}
22
23
+/// Returns prettyplease-formatted Rust source for converting HermesParser results
24
+/// into estree
25
+pub fn estree_hermes() -> String {
26
+ let src = include_str!("./ecmascript.json");
27
+ let grammar: Grammar = serde_json::from_str(src).unwrap();
28
+ let raw = grammar.codegen_hermes().to_string();
29
+
30
+ let parsed = syn::parse_file(&raw).unwrap();
31
+ format!(
32
+ "// {}generated\n#![cfg_attr(rustfmt, rustfmt_skip)]\n{}",
33
+ '\u{0040}',
34
+ prettyplease::unparse(&parsed)
35
+ )
36
+}
37
+
38
#[derive(Serialize, Deserialize, Debug)]
39
#[serde(deny_unknown_fields)]
40
pub struct Grammar {
@@ -59,7 +74,7 @@ impl Grammar {
74
use std::num::NonZeroU32;
75
use serde::ser::{Serializer, SerializeMap};
76
use serde::{Serialize,Deserialize};
62
- use crate::{JsValue, Binding, SourceRange};
77
+ use crate::{JsValue, Binding, SourceRange, Number};
78
79
#(#objects)*
80
@@ -70,6 +85,42 @@ impl Grammar {
85
#(#operators)*
86
}
87
}
88
+
89
+ pub fn codegen_hermes(self) -> TokenStream {
90
+ let nodes: Vec<_> = self
91
+ .nodes
92
+ .iter()
93
+ .filter(|(_, node)| !node.skip_hermes_codegen)
94
+ .map(|(name, node)| node.codegen_hermes(name))
95
+ .collect();
96
+ let enums: Vec<_> = self
97
+ .enums
98
+ .iter()
99
+ .map(|(name, enum_)| enum_.codegen_hermes(name, &self))
100
+ .collect();
101
+ let operators: Vec<_> = self
102
+ .operators
103
+ .iter()
104
+ .map(|(name, operator)| operator.codegen_hermes(name))
105
+ .collect();
106
+
107
+ quote! {
108
+ #![allow(dead_code)]
109
+ #![allow(unused_variables)]
110
+
111
+ use forget_estree::*;
112
+ use hermes;
113
+ use hermes::parser::{NodePtr, NodeKind, NodeLabel };
114
+ use hermes::utf::{utf8_with_surrogates_to_string};
115
+ use crate::generated_extension::*;
116
+
117
+ #(#nodes)*
118
+
119
+ #(#enums)*
120
+
121
+ #(#operators)*
122
+ }
123
+ }
124
}
125
126
#[derive(Serialize, Deserialize, Debug)]
@@ -107,6 +158,12 @@ pub struct Node {
158
159
#[serde(default)]
160
pub fields: IndexMap<String, Field>,
161
+
162
+ #[serde(default)]
163
+ pub skip_hermes_codegen: bool,
164
+
165
+ #[serde(default)]
166
+ pub skip_hermes_enum_variant: bool,
167
}
168
169
impl Node {
@@ -175,11 +232,108 @@ impl Node {
232
}
233
}
234
}
235
+
236
+ pub fn codegen_hermes(&self, name: &str) -> TokenStream {
237
+ let name_str = name;
238
+ let name = format_ident!("{}", name);
239
+ let field_names: Vec<_> = self
240
+ .fields
241
+ .iter()
242
+ .map(|(name, _field)| format_ident!("{}", name))
243
+ .collect();
244
+ let fields: Vec<_> = self
245
+ .fields
246
+ .iter()
247
+ .map(|(name, field)| {
248
+ let (type_name_str, type_kind) = parse_type(&field.type_).unwrap();
249
+ let camelcase_name = field.rename.as_ref().unwrap_or(name);
250
+ let field_name = format_ident!("{}", name);
251
+ let helper = format_ident!("hermes_get_{}_{}", name_str, camelcase_name);
252
+ let type_name = format_ident!("{}", type_name_str);
253
+ if field.skip || field.hermes_default {
254
+ return quote! {
255
+ let #field_name = Default::default();
256
+ };
257
+ }
258
+ if let Some(convert_with) = &field.hermes_convert_with {
259
+ let convert_with = format_ident!("{}", convert_with);
260
+ return quote! {
261
+ let #field_name = #convert_with(cx, unsafe { hermes::parser::#helper(node) } );
262
+ }
263
+ }
264
+ match type_kind {
265
+ TypeKind::Named => {
266
+ match type_name_str.as_ref() {
267
+ "bool" => {
268
+ quote! {
269
+ let #field_name = unsafe { hermes::parser::#helper(node) };
270
+ }
271
+ }
272
+ "Number" => {
273
+ quote! {
274
+ let #field_name = convert_number(unsafe { hermes::parser::#helper(node) });
275
+ }
276
+ }
277
+ "String" => {
278
+ quote! {
279
+ let #field_name = convert_string(cx, unsafe { hermes::parser::#helper(node) });
280
+ }
281
+ }
282
+ _ => {
283
+ quote! {
284
+ let #field_name = #type_name::convert(cx, unsafe { hermes::parser::#helper(node) });
285
+ }
286
+ }
287
+ }
288
+ }
289
+ TypeKind::Option => {
290
+ match type_name_str.as_ref() {
291
+ "String" => {
292
+ quote! {
293
+ let #field_name = convert_option_string(cx, unsafe { hermes::parser::#helper(node) });
294
+ }
295
+ }
296
+ _ => {
297
+ quote! {
298
+ let #field_name = convert_option(unsafe { hermes::parser::#helper(node) }, |node| #type_name::convert(cx, node));
299
+ }
300
+ }
301
+ }
302
+ }
303
+ TypeKind::Vec => {
304
+ quote! {
305
+ let #field_name = convert_vec(unsafe { hermes::parser::#helper(node) }, |node| #type_name::convert(cx, node));
306
+ }
307
+ }
308
+ TypeKind::VecOfOption => {
309
+ quote! {
310
+ let #field_name = convert_vec_of_option(unsafe { hermes::parser::#helper(node) }, |node| #type_name::convert(cx, node));
311
+ }
312
+ }
313
+ }
314
+ })
315
+ .collect();
316
+
317
+ quote! {
318
+ impl FromHermes for #name {
319
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
320
+ let range = convert_range(node);
321
+ #(#fields)*
322
+ Self {
323
+ #(#field_names,)*
324
+ loc: None,
325
+ range: Some(range),
326
+ }
327
+ }
328
+ }
329
+ }
330
+ }
331
}
332
333
#[derive(Serialize, Deserialize, Debug)]
334
#[serde(deny_unknown_fields)]
335
pub struct Field {
336
+ // TODO: deserialize with `parse_type` into a custom type
337
#[serde(rename = "type")]
338
pub type_: String,
339
@@ -198,11 +352,18 @@ pub struct Field {
352
#[serde(default)]
353
#[serde(rename = "TODO")]
354
pub todo: Option<String>,
355
+
356
+ #[serde(default)]
357
+ pub hermes_convert_with: Option<String>,
358
+
359
+ #[serde(default)]
360
+ pub hermes_default: bool,
361
}
362
363
impl Field {
364
pub fn codegen(&self, name: &str) -> TokenStream {
365
let name = format_ident!("{}", name);
366
+ parse_type(&self.type_).unwrap();
367
let type_name: Type = syn::parse_str(&self.type_)
368
.unwrap_or_else(|_| panic!("Expected a type name, got `{}`", &self.type_));
369
@@ -237,6 +398,7 @@ impl Field {
398
399
pub fn codegen_node(&self, name: &str) -> TokenStream {
400
let name = format_ident!("{}", name);
401
+ parse_type(&self.type_).unwrap();
402
let type_name: Type = syn::parse_str(&self.type_)
403
.unwrap_or_else(|_| panic!("Expected a type name, got `{}`", &self.type_));
404
let type_ = quote!(#type_name);
@@ -386,6 +548,86 @@ impl Enum {
548
}
549
}
550
}
551
+
552
+ pub fn codegen_hermes(&self, name: &str, grammar: &Grammar) -> TokenStream {
553
+ let name = format_ident!("{}", name);
554
+
555
+ let mut tag_matches = Vec::new();
556
+ let mut seen = HashSet::new();
557
+
558
+ // Imagine a case like:
559
+ // enum ModuleItem {
560
+ // ImportDeclaration, // struct
561
+ // Statement // another enum
562
+ // }
563
+ // We need to generate matches for all the possible *concrete* `type` values, which means
564
+ // we have to expand nested enums such as `Statement`
565
+ for variant in self.variants.iter() {
566
+ if let Some(nested_enum) = grammar.enums.get(variant) {
567
+ let outer_variant = format_ident!("{}", variant);
568
+ for variant in nested_enum.variants.iter() {
569
+ // Skip variants that appear in multiple nested enums, we deserialize
570
+ // as the first listed outer variant
571
+ if !seen.insert(variant.to_string()) {
572
+ continue;
573
+ }
574
+ // Modeling ESTree only requires a single level of nested enums,
575
+ // so that's all we support. Though in theory we could support arbitrary nesting,
576
+ // since ultimately we're matching based on the final concrete types.
577
+ assert!(!grammar.enums.contains_key(variant));
578
+ let node = grammar.nodes.get(variant).unwrap();
579
+ if node.skip_hermes_enum_variant {
580
+ continue;
581
+ }
582
+
583
+ let inner_variant = format_ident!("{}", variant);
584
+ let node_variant_name = node.type_.as_ref().unwrap_or(variant);
585
+ let node_variant = format_ident!("{}", node_variant_name);
586
+
587
+ tag_matches.push(quote! {
588
+ NodeKind::#node_variant => {
589
+ let node = #inner_variant::convert(cx, node);
590
+ #name::#outer_variant(#outer_variant::#inner_variant(Box::new(node)))
591
+ }
592
+ });
593
+ }
594
+ } else {
595
+ if !seen.insert(variant.to_string()) {
596
+ panic!(
597
+ "Concrete variant {} was already added by a nested enum",
598
+ variant
599
+ );
600
+ }
601
+ let variant_name = format_ident!("{}", variant);
602
+ let node = grammar.nodes.get(variant).unwrap();
603
+ if node.skip_hermes_enum_variant {
604
+ continue;
605
+ }
606
+
607
+ let node_variant_name = node.type_.as_ref().unwrap_or(variant);
608
+ let node_variant = format_ident!("{}", node_variant_name);
609
+
610
+ tag_matches.push(quote! {
611
+ NodeKind::#node_variant => {
612
+ let node = #variant_name::convert(cx, node);
613
+ #name::#variant_name(Box::new(node))
614
+ }
615
+ })
616
+ }
617
+ }
618
+
619
+ quote! {
620
+ impl FromHermes for #name {
621
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
622
+ let node_ref = node.as_ref();
623
+ match node_ref.kind {
624
+ #(#tag_matches),*
625
+ _ => panic!("Unexpected node")
626
+ }
627
+ }
628
+ }
629
+ }
630
+ }
631
}
632
633
#[derive(Serialize, Deserialize, Debug)]
@@ -457,4 +699,67 @@ impl Operator {
699
}
700
}
701
}
702
+
703
+ pub fn codegen_hermes(&self, name: &str) -> TokenStream {
704
+ let mut sorted_variants: Vec<_> = self.variants.iter().collect();
705
+ sorted_variants.sort();
706
+
707
+ let name = format_ident!("{}", name);
708
+
709
+ quote! {
710
+ impl FromHermesLabel for #name {
711
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
712
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
713
+ utf_str.parse().unwrap()
714
+ }
715
+ }
716
+ }
717
+ }
718
+}
719
+
720
+enum TypeKind {
721
+ /// T
722
+ Named,
723
+
724
+ /// Option<T>
725
+ Option,
726
+
727
+ /// Vec<T>
728
+ Vec,
729
+
730
+ /// Vec<Option<T>>
731
+ VecOfOption,
732
+}
733
+
734
+/// Parses a given type into the underlying type name plus a descriptor of the
735
+/// kind of type. Only a subset of Rust types are supported:
736
+/// - T
737
+/// - Option<T>
738
+/// - Vec<T>
739
+/// - Vec<Option<T>>
740
+fn parse_type(type_: &str) -> Result<(String, TypeKind), String> {
741
+ let mut current = type_;
742
+ let mut is_list = false;
743
+ let mut is_option = false;
744
+ if current.starts_with("Vec<") {
745
+ current = ¤t[4..current.len() - 1];
746
+ is_list = true;
747
+ }
748
+ if current.starts_with("Option<") {
749
+ current = ¤t[7..current.len() - 1];
750
+ is_option = true;
751
+ }
752
+ if current.contains("<") {
753
+ Err(format!(
754
+ "Unsupported type `{current}` expected named type (`Identifier`), optional type (`Option<Identifier>`), list type (`Vec<Identifier>`), or optional list (`Vec<Option<Identifier>>`)"
755
+ ))
756
+ } else {
757
+ let kind = match (is_list, is_option) {
758
+ (true, true) => TypeKind::VecOfOption,
759
+ (true, false) => TypeKind::Vec,
760
+ (false, true) => TypeKind::Option,
761
+ (false, false) => TypeKind::Named,
762
+ };
763
+ Ok((current.to_string(), kind))
764
+ }
765
}
compiler/forget/crates/forget_estree_codegen/src/ecmascript.json
+74
-34
@@ -23,6 +23,20 @@
23
}
24
}
25
},
26
+ "Class": {
27
+ "fields": {
28
+ "id": {
29
+ "type": "Option<Identifier>"
30
+ },
31
+ "super_class": {
32
+ "type": "Option<Expression>",
33
+ "rename": "superClass"
34
+ },
35
+ "body": {
36
+ "type": "ClassBody"
37
+ }
38
+ }
39
+ },
40
"Function": {
41
"fields": {
42
"id": {
@@ -89,6 +103,8 @@
103
}
104
},
105
"Literal": {
106
+ "skip_hermes_codegen": true,
107
+ "skip_hermes_enum_variant": true,
108
"fields": {
109
"value": {
110
"type": "JsValue"
@@ -107,6 +123,29 @@
123
}
124
}
125
},
126
+ "NumericLiteral": {
127
+ "fields": {
128
+ "value": {
129
+ "type": "Number"
130
+ }
131
+ }
132
+ },
133
+ "BooleanLiteral": {
134
+ "fields": {
135
+ "value": {
136
+ "type": "bool"
137
+ }
138
+ }
139
+ },
140
+ "NullLiteral": {},
141
+ "StringLiteral": {
142
+ "fields": {
143
+ "value": {
144
+ "type": "String",
145
+ "hermes_convert_with": "convert_string_value"
146
+ }
147
+ }
148
+ },
149
"Program": {
150
"fields": {
151
"body": {
@@ -115,7 +154,8 @@
154
"source_type": {
155
"type": "SourceType",
156
"optional": true,
118
- "rename": "sourceType"
157
+ "rename": "sourceType",
158
+ "hermes_default": true
159
}
160
}
161
},
@@ -126,7 +166,8 @@
166
},
167
"directive": {
168
"type": "Option<String>",
129
- "optional": true
169
+ "optional": true,
170
+ "hermes_default": true
171
}
172
}
173
},
@@ -311,6 +352,7 @@
352
}
353
},
354
"FunctionDeclaration": {
355
+ "skip_hermes_codegen": true,
356
"fields": {
357
"function": {
358
"type": "Function",
@@ -318,21 +360,8 @@
360
}
361
}
362
},
321
- "Class": {
322
- "fields": {
323
- "id": {
324
- "type": "Option<Identifier>"
325
- },
326
- "super_class": {
327
- "type": "Option<Expression>",
328
- "rename": "superClass"
329
- },
330
- "body": {
331
- "type": "ClassBody"
332
- }
333
- }
334
- },
363
"ClassDeclaration": {
364
+ "skip_hermes_codegen": true,
365
"fields": {
366
"class": {
367
"type": "Class",
@@ -341,6 +370,7 @@
370
}
371
},
372
"ClassExpression": {
373
+ "skip_hermes_codegen": true,
374
"fields": {
375
"class": {
376
"type": "Class",
@@ -400,7 +430,8 @@
430
"ArrayExpression": {
431
"fields": {
432
"elements": {
403
- "type": "Vec<Option<ExpressionOrSpread>>"
433
+ "type": "Vec<Option<ExpressionOrSpread>>",
434
+ "hermes_convert_with": "convert_array_expression_elements"
435
}
436
}
437
},
@@ -437,6 +468,7 @@
468
}
469
},
470
"FunctionExpression": {
471
+ "skip_hermes_codegen": true,
472
"fields": {
473
"function": {
474
"type": "Function",
@@ -445,6 +477,7 @@
477
}
478
},
479
"ArrowFunctionExpression": {
480
+ "skip_hermes_codegen": true,
481
"fields": {
482
"function": {
483
"type": "Function",
@@ -532,11 +565,6 @@
565
"is_computed": {
566
"type": "bool",
567
"rename": "computed"
535
- },
536
- "is_optional": {
537
- "type": "bool",
538
- "optional": true,
539
- "rename": "optional"
568
}
569
}
570
},
@@ -560,11 +588,6 @@
588
},
589
"arguments": {
590
"type": "Vec<ExpressionOrSpread>"
563
- },
564
- "is_optional": {
565
- "type": "bool",
566
- "optional": true,
567
- "rename": "optional"
591
}
592
}
593
},
@@ -611,7 +634,7 @@
634
"type": "Vec<ImportDeclarationSpecifier>"
635
},
636
"source": {
614
- "type": "Literal"
637
+ "type": "_Literal"
638
}
639
}
640
},
@@ -648,7 +671,7 @@
671
"type": "Vec<ExportSpecifier>"
672
},
673
"source": {
651
- "type": "Option<Literal>"
674
+ "type": "Option<_Literal>"
675
}
676
}
677
},
@@ -669,11 +692,12 @@
692
"ExportAllDeclaration": {
693
"fields": {
694
"source": {
672
- "type": "Literal"
695
+ "type": "_Literal"
696
},
697
"exported": {
698
"type": "Option<Identifier>",
676
- "optional": true
699
+ "optional": true,
700
+ "hermes_default": true
701
}
702
}
703
},
@@ -765,7 +789,8 @@
789
"JSXText": {
790
"fields": {
791
"value": {
768
- "type": "String"
792
+ "type": "String",
793
+ "hermes_convert_with": "convert_string_value"
794
},
795
"raw": {
796
"type": "String"
@@ -797,7 +822,7 @@
822
"type": "Vec<JSXChildItem>"
823
},
824
"closing_fragment": {
800
- "type": "Option<JSXClosingFragment>",
825
+ "type": "JSXClosingFragment",
826
"rename": "closingFragment"
827
}
828
}
@@ -819,6 +844,7 @@
844
}
845
},
846
"AssignmentProperty": {
847
+ "skip_hermes_codegen": true,
848
"type": "Property",
849
"fields": {
850
"key": {
@@ -865,6 +891,7 @@
891
}
892
},
893
"TemplateElement": {
894
+ "skip_hermes_codegen": true,
895
"fields": {
896
"tail": {
897
"type": "bool"
@@ -902,6 +929,8 @@
929
}
930
},
931
"ChainExpression": {
932
+ "skip_hermes_codegen": true,
933
+ "skip_hermes_enum_variant": true,
934
"fields": {
935
"expression": {
936
"type": "ChainElement"
@@ -914,7 +943,7 @@
943
"type": "Expression"
944
},
945
"property": {
917
- "type": "Identifier"
946
+ "type": "Expression"
947
},
948
"is_computed": {
949
"type": "bool",
@@ -980,6 +1009,7 @@
1009
"AssignmentExpression",
1010
"AwaitExpression",
1011
"BinaryExpression",
1012
+ "BooleanLiteral",
1013
"CallExpression",
1014
"ChainExpression",
1015
"ClassExpression",
@@ -993,10 +1023,13 @@
1023
"MemberExpression",
1024
"MetaProperty",
1025
"NewExpression",
1026
+ "NullLiteral",
1027
+ "NumericLiteral",
1028
"ObjectExpression",
1029
"OptionalCallExpression",
1030
"OptionalMemberExpression",
1031
"SequenceExpression",
1032
+ "StringLiteral",
1033
"TaggedTemplateExpression",
1034
"TemplateLiteral",
1035
"ThisExpression",
@@ -1004,6 +1037,13 @@
1037
"UpdateExpression",
1038
"YieldExpression"
1039
],
1040
+ "_Literal": [
1041
+ "Literal",
1042
+ "BooleanLiteral",
1043
+ "NullLiteral",
1044
+ "StringLiteral",
1045
+ "NumericLiteral"
1046
+ ],
1047
"Declaration": [
1048
"ClassDeclaration",
1049
"FunctionDeclaration",
compiler/forget/crates/forget_estree_codegen/src/lib.rs
+1
-1
@@ -1,3 +1,3 @@
1
mod codegen;
2
3
-pub use codegen::estree;
3
+pub use codegen::{estree, estree_hermes};
compiler/forget/crates/forget_estree_swc/src/lib.rs
+25
-3
@@ -340,7 +340,6 @@ fn convert_expression(cx: &Context, expr: &Expr) -> forget_estree::Expression {
340
_ => todo!(),
341
},
342
arguments: convert_arguments(cx, &expr.args),
343
- is_optional: false,
343
loc: None,
344
range: convert_span(&expr.span),
345
}))
@@ -452,9 +451,9 @@ fn convert_expression(cx: &Context, expr: &Expr) -> forget_estree::Expression {
451
}),
452
),
453
OptChainBase::Member(base) => {
455
- let mut member = convert_member_expression(cx, base);
454
+ let mut member = convert_optional_member_expression(cx, base);
455
member.is_optional = expr.optional;
457
- forget_estree::Expression::MemberExpression(Box::new(member))
456
+ forget_estree::Expression::OptionalMemberExpression(Box::new(member))
457
}
458
},
459
Expr::JSXElement(expr) => {
@@ -779,6 +778,29 @@ fn convert_member_expression(cx: &Context, expr: &MemberExpr) -> forget_estree::
778
object: forget_estree::ExpressionOrSuper::Expression(convert_expression(cx, &expr.obj)),
779
property,
780
is_computed,
781
+ loc: None,
782
+ range: convert_span(&expr.span),
783
+ }
784
+}
785
+
786
+fn convert_optional_member_expression(
787
+ cx: &Context,
788
+ expr: &MemberExpr,
789
+) -> forget_estree::OptionalMemberExpression {
790
+ let (is_computed, property) = match &expr.prop {
791
+ MemberProp::Ident(prop) => (
792
+ false,
793
+ forget_estree::Expression::Identifier(Box::new(convert_identifier(cx, prop))),
794
+ ),
795
+ MemberProp::Computed(prop) => (true, convert_expression(cx, &prop.expr)),
796
+ _ => {
797
+ panic!("PrivateName member expression properties are not supported")
798
+ }
799
+ };
800
+ forget_estree::OptionalMemberExpression {
801
+ object: convert_expression(cx, &expr.obj),
802
+ property,
803
+ is_computed,
804
is_optional: false,
805
loc: None,
806
range: convert_span(&expr.span),
compiler/forget/crates/forget_hermes_parser/Cargo.toml
+4
-1
@@ -15,4 +15,7 @@ repository.workspace = true
15
forget_diagnostics = { workspace = true }
16
forget_estree = { workspace = true }
17
hermes = { workspace = true }
18
-juno_support = { workspace = true }
\ No newline at end of file
18
+juno_support = { workspace = true }
19
+
20
+[build-dependencies]
21
+forget_estree_codegen = { workspace = true }
\ No newline at end of file
compiler/forget/crates/forget_hermes_parser/build.rs
new
+13
@@ -0,0 +1,13 @@
1
+use forget_estree_codegen::estree_hermes;
2
+
3
+// Example custom build script.
4
+fn main() {
5
+ // Re-run if the codegen files change
6
+ println!("cargo:rerun-if-changed=../forget_estree_codegen/src/codegen.rs");
7
+ println!("cargo:rerun-if-changed=../forget_estree_codegen/src/lib.rs");
8
+ println!("cargo:rerun-if-changed=../forget_estree_codegen/src/ecmascript.json");
9
+ println!("cargo:rerun-if-changed=../forget_estree_codegen");
10
+
11
+ let src = estree_hermes();
12
+ std::fs::write("src/generated.rs", src).unwrap();
13
+}
compiler/forget/crates/forget_hermes_parser/src/generated.rs
new
+3141
@@ -0,0 +1,3141 @@
1
+// @generated
2
+#![cfg_attr(rustfmt, rustfmt_skip)]
3
+#![allow(dead_code)]
4
+#![allow(unused_variables)]
5
+use forget_estree::*;
6
+use hermes;
7
+use hermes::parser::{NodePtr, NodeKind, NodeLabel};
8
+use hermes::utf::utf8_with_surrogates_to_string;
9
+use crate::generated_extension::*;
10
+impl FromHermes for Identifier {
11
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
12
+ let range = convert_range(node);
13
+ let name = convert_string(
14
+ cx,
15
+ unsafe { hermes::parser::hermes_get_Identifier_name(node) },
16
+ );
17
+ let binding = Default::default();
18
+ Self {
19
+ name,
20
+ binding,
21
+ loc: None,
22
+ range: Some(range),
23
+ }
24
+ }
25
+}
26
+impl FromHermes for NumericLiteral {
27
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
28
+ let range = convert_range(node);
29
+ let value = convert_number(unsafe {
30
+ hermes::parser::hermes_get_NumericLiteral_value(node)
31
+ });
32
+ Self {
33
+ value,
34
+ loc: None,
35
+ range: Some(range),
36
+ }
37
+ }
38
+}
39
+impl FromHermes for BooleanLiteral {
40
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
41
+ let range = convert_range(node);
42
+ let value = unsafe { hermes::parser::hermes_get_BooleanLiteral_value(node) };
43
+ Self {
44
+ value,
45
+ loc: None,
46
+ range: Some(range),
47
+ }
48
+ }
49
+}
50
+impl FromHermes for NullLiteral {
51
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
52
+ let range = convert_range(node);
53
+ Self {
54
+ loc: None,
55
+ range: Some(range),
56
+ }
57
+ }
58
+}
59
+impl FromHermes for StringLiteral {
60
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
61
+ let range = convert_range(node);
62
+ let value = convert_string_value(
63
+ cx,
64
+ unsafe { hermes::parser::hermes_get_StringLiteral_value(node) },
65
+ );
66
+ Self {
67
+ value,
68
+ loc: None,
69
+ range: Some(range),
70
+ }
71
+ }
72
+}
73
+impl FromHermes for Program {
74
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
75
+ let range = convert_range(node);
76
+ let body = convert_vec(
77
+ unsafe { hermes::parser::hermes_get_Program_body(node) },
78
+ |node| ModuleItem::convert(cx, node),
79
+ );
80
+ let source_type = Default::default();
81
+ Self {
82
+ body,
83
+ source_type,
84
+ loc: None,
85
+ range: Some(range),
86
+ }
87
+ }
88
+}
89
+impl FromHermes for ExpressionStatement {
90
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
91
+ let range = convert_range(node);
92
+ let expression = Expression::convert(
93
+ cx,
94
+ unsafe { hermes::parser::hermes_get_ExpressionStatement_expression(node) },
95
+ );
96
+ let directive = Default::default();
97
+ Self {
98
+ expression,
99
+ directive,
100
+ loc: None,
101
+ range: Some(range),
102
+ }
103
+ }
104
+}
105
+impl FromHermes for BlockStatement {
106
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
107
+ let range = convert_range(node);
108
+ let body = convert_vec(
109
+ unsafe { hermes::parser::hermes_get_BlockStatement_body(node) },
110
+ |node| Statement::convert(cx, node),
111
+ );
112
+ Self {
113
+ body,
114
+ loc: None,
115
+ range: Some(range),
116
+ }
117
+ }
118
+}
119
+impl FromHermes for EmptyStatement {
120
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
121
+ let range = convert_range(node);
122
+ Self {
123
+ loc: None,
124
+ range: Some(range),
125
+ }
126
+ }
127
+}
128
+impl FromHermes for DebuggerStatement {
129
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
130
+ let range = convert_range(node);
131
+ Self {
132
+ loc: None,
133
+ range: Some(range),
134
+ }
135
+ }
136
+}
137
+impl FromHermes for WithStatement {
138
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
139
+ let range = convert_range(node);
140
+ let object = Expression::convert(
141
+ cx,
142
+ unsafe { hermes::parser::hermes_get_WithStatement_object(node) },
143
+ );
144
+ let body = Statement::convert(
145
+ cx,
146
+ unsafe { hermes::parser::hermes_get_WithStatement_body(node) },
147
+ );
148
+ Self {
149
+ object,
150
+ body,
151
+ loc: None,
152
+ range: Some(range),
153
+ }
154
+ }
155
+}
156
+impl FromHermes for ReturnStatement {
157
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
158
+ let range = convert_range(node);
159
+ let argument = convert_option(
160
+ unsafe { hermes::parser::hermes_get_ReturnStatement_argument(node) },
161
+ |node| Expression::convert(cx, node),
162
+ );
163
+ Self {
164
+ argument,
165
+ loc: None,
166
+ range: Some(range),
167
+ }
168
+ }
169
+}
170
+impl FromHermes for LabeledStatement {
171
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
172
+ let range = convert_range(node);
173
+ let label = Identifier::convert(
174
+ cx,
175
+ unsafe { hermes::parser::hermes_get_LabeledStatement_label(node) },
176
+ );
177
+ let body = Statement::convert(
178
+ cx,
179
+ unsafe { hermes::parser::hermes_get_LabeledStatement_body(node) },
180
+ );
181
+ Self {
182
+ label,
183
+ body,
184
+ loc: None,
185
+ range: Some(range),
186
+ }
187
+ }
188
+}
189
+impl FromHermes for BreakStatement {
190
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
191
+ let range = convert_range(node);
192
+ let label = convert_option(
193
+ unsafe { hermes::parser::hermes_get_BreakStatement_label(node) },
194
+ |node| Identifier::convert(cx, node),
195
+ );
196
+ Self {
197
+ label,
198
+ loc: None,
199
+ range: Some(range),
200
+ }
201
+ }
202
+}
203
+impl FromHermes for ContinueStatement {
204
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
205
+ let range = convert_range(node);
206
+ let label = convert_option(
207
+ unsafe { hermes::parser::hermes_get_ContinueStatement_label(node) },
208
+ |node| Identifier::convert(cx, node),
209
+ );
210
+ Self {
211
+ label,
212
+ loc: None,
213
+ range: Some(range),
214
+ }
215
+ }
216
+}
217
+impl FromHermes for IfStatement {
218
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
219
+ let range = convert_range(node);
220
+ let test = Expression::convert(
221
+ cx,
222
+ unsafe { hermes::parser::hermes_get_IfStatement_test(node) },
223
+ );
224
+ let consequent = Statement::convert(
225
+ cx,
226
+ unsafe { hermes::parser::hermes_get_IfStatement_consequent(node) },
227
+ );
228
+ let alternate = convert_option(
229
+ unsafe { hermes::parser::hermes_get_IfStatement_alternate(node) },
230
+ |node| Statement::convert(cx, node),
231
+ );
232
+ Self {
233
+ test,
234
+ consequent,
235
+ alternate,
236
+ loc: None,
237
+ range: Some(range),
238
+ }
239
+ }
240
+}
241
+impl FromHermes for SwitchStatement {
242
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
243
+ let range = convert_range(node);
244
+ let discriminant = Expression::convert(
245
+ cx,
246
+ unsafe { hermes::parser::hermes_get_SwitchStatement_discriminant(node) },
247
+ );
248
+ let cases = convert_vec(
249
+ unsafe { hermes::parser::hermes_get_SwitchStatement_cases(node) },
250
+ |node| SwitchCase::convert(cx, node),
251
+ );
252
+ Self {
253
+ discriminant,
254
+ cases,
255
+ loc: None,
256
+ range: Some(range),
257
+ }
258
+ }
259
+}
260
+impl FromHermes for SwitchCase {
261
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
262
+ let range = convert_range(node);
263
+ let test = convert_option(
264
+ unsafe { hermes::parser::hermes_get_SwitchCase_test(node) },
265
+ |node| Expression::convert(cx, node),
266
+ );
267
+ let consequent = convert_vec(
268
+ unsafe { hermes::parser::hermes_get_SwitchCase_consequent(node) },
269
+ |node| Statement::convert(cx, node),
270
+ );
271
+ Self {
272
+ test,
273
+ consequent,
274
+ loc: None,
275
+ range: Some(range),
276
+ }
277
+ }
278
+}
279
+impl FromHermes for ThrowStatement {
280
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
281
+ let range = convert_range(node);
282
+ let argument = Expression::convert(
283
+ cx,
284
+ unsafe { hermes::parser::hermes_get_ThrowStatement_argument(node) },
285
+ );
286
+ Self {
287
+ argument,
288
+ loc: None,
289
+ range: Some(range),
290
+ }
291
+ }
292
+}
293
+impl FromHermes for TryStatement {
294
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
295
+ let range = convert_range(node);
296
+ let block = BlockStatement::convert(
297
+ cx,
298
+ unsafe { hermes::parser::hermes_get_TryStatement_block(node) },
299
+ );
300
+ let handler = convert_option(
301
+ unsafe { hermes::parser::hermes_get_TryStatement_handler(node) },
302
+ |node| CatchClause::convert(cx, node),
303
+ );
304
+ let finalizer = convert_option(
305
+ unsafe { hermes::parser::hermes_get_TryStatement_finalizer(node) },
306
+ |node| BlockStatement::convert(cx, node),
307
+ );
308
+ Self {
309
+ block,
310
+ handler,
311
+ finalizer,
312
+ loc: None,
313
+ range: Some(range),
314
+ }
315
+ }
316
+}
317
+impl FromHermes for CatchClause {
318
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
319
+ let range = convert_range(node);
320
+ let param = convert_option(
321
+ unsafe { hermes::parser::hermes_get_CatchClause_param(node) },
322
+ |node| Pattern::convert(cx, node),
323
+ );
324
+ let body = BlockStatement::convert(
325
+ cx,
326
+ unsafe { hermes::parser::hermes_get_CatchClause_body(node) },
327
+ );
328
+ Self {
329
+ param,
330
+ body,
331
+ loc: None,
332
+ range: Some(range),
333
+ }
334
+ }
335
+}
336
+impl FromHermes for WhileStatement {
337
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
338
+ let range = convert_range(node);
339
+ let test = Expression::convert(
340
+ cx,
341
+ unsafe { hermes::parser::hermes_get_WhileStatement_test(node) },
342
+ );
343
+ let body = Statement::convert(
344
+ cx,
345
+ unsafe { hermes::parser::hermes_get_WhileStatement_body(node) },
346
+ );
347
+ Self {
348
+ test,
349
+ body,
350
+ loc: None,
351
+ range: Some(range),
352
+ }
353
+ }
354
+}
355
+impl FromHermes for DoWhileStatement {
356
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
357
+ let range = convert_range(node);
358
+ let body = Statement::convert(
359
+ cx,
360
+ unsafe { hermes::parser::hermes_get_DoWhileStatement_body(node) },
361
+ );
362
+ let test = Expression::convert(
363
+ cx,
364
+ unsafe { hermes::parser::hermes_get_DoWhileStatement_test(node) },
365
+ );
366
+ Self {
367
+ body,
368
+ test,
369
+ loc: None,
370
+ range: Some(range),
371
+ }
372
+ }
373
+}
374
+impl FromHermes for ForStatement {
375
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
376
+ let range = convert_range(node);
377
+ let init = convert_option(
378
+ unsafe { hermes::parser::hermes_get_ForStatement_init(node) },
379
+ |node| ForInit::convert(cx, node),
380
+ );
381
+ let test = convert_option(
382
+ unsafe { hermes::parser::hermes_get_ForStatement_test(node) },
383
+ |node| Expression::convert(cx, node),
384
+ );
385
+ let update = convert_option(
386
+ unsafe { hermes::parser::hermes_get_ForStatement_update(node) },
387
+ |node| Expression::convert(cx, node),
388
+ );
389
+ let body = Statement::convert(
390
+ cx,
391
+ unsafe { hermes::parser::hermes_get_ForStatement_body(node) },
392
+ );
393
+ Self {
394
+ init,
395
+ test,
396
+ update,
397
+ body,
398
+ loc: None,
399
+ range: Some(range),
400
+ }
401
+ }
402
+}
403
+impl FromHermes for ForInStatement {
404
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
405
+ let range = convert_range(node);
406
+ let left = ForInInit::convert(
407
+ cx,
408
+ unsafe { hermes::parser::hermes_get_ForInStatement_left(node) },
409
+ );
410
+ let right = Expression::convert(
411
+ cx,
412
+ unsafe { hermes::parser::hermes_get_ForInStatement_right(node) },
413
+ );
414
+ let body = Statement::convert(
415
+ cx,
416
+ unsafe { hermes::parser::hermes_get_ForInStatement_body(node) },
417
+ );
418
+ Self {
419
+ left,
420
+ right,
421
+ body,
422
+ loc: None,
423
+ range: Some(range),
424
+ }
425
+ }
426
+}
427
+impl FromHermes for ForOfStatement {
428
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
429
+ let range = convert_range(node);
430
+ let is_await = unsafe { hermes::parser::hermes_get_ForOfStatement_await(node) };
431
+ let left = ForInInit::convert(
432
+ cx,
433
+ unsafe { hermes::parser::hermes_get_ForOfStatement_left(node) },
434
+ );
435
+ let right = Expression::convert(
436
+ cx,
437
+ unsafe { hermes::parser::hermes_get_ForOfStatement_right(node) },
438
+ );
439
+ let body = Statement::convert(
440
+ cx,
441
+ unsafe { hermes::parser::hermes_get_ForOfStatement_body(node) },
442
+ );
443
+ Self {
444
+ is_await,
445
+ left,
446
+ right,
447
+ body,
448
+ loc: None,
449
+ range: Some(range),
450
+ }
451
+ }
452
+}
453
+impl FromHermes for ClassBody {
454
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
455
+ let range = convert_range(node);
456
+ let body = convert_vec(
457
+ unsafe { hermes::parser::hermes_get_ClassBody_body(node) },
458
+ |node| MethodDefinition::convert(cx, node),
459
+ );
460
+ Self {
461
+ body,
462
+ loc: None,
463
+ range: Some(range),
464
+ }
465
+ }
466
+}
467
+impl FromHermes for MethodDefinition {
468
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
469
+ let range = convert_range(node);
470
+ let key = Expression::convert(
471
+ cx,
472
+ unsafe { hermes::parser::hermes_get_MethodDefinition_key(node) },
473
+ );
474
+ let value = FunctionExpression::convert(
475
+ cx,
476
+ unsafe { hermes::parser::hermes_get_MethodDefinition_value(node) },
477
+ );
478
+ let kind = MethodKind::convert(
479
+ cx,
480
+ unsafe { hermes::parser::hermes_get_MethodDefinition_kind(node) },
481
+ );
482
+ let is_computed = unsafe {
483
+ hermes::parser::hermes_get_MethodDefinition_computed(node)
484
+ };
485
+ let is_static = unsafe {
486
+ hermes::parser::hermes_get_MethodDefinition_static(node)
487
+ };
488
+ Self {
489
+ key,
490
+ value,
491
+ kind,
492
+ is_computed,
493
+ is_static,
494
+ loc: None,
495
+ range: Some(range),
496
+ }
497
+ }
498
+}
499
+impl FromHermes for VariableDeclaration {
500
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
501
+ let range = convert_range(node);
502
+ let kind = VariableDeclarationKind::convert(
503
+ cx,
504
+ unsafe { hermes::parser::hermes_get_VariableDeclaration_kind(node) },
505
+ );
506
+ let declarations = convert_vec(
507
+ unsafe { hermes::parser::hermes_get_VariableDeclaration_declarations(node) },
508
+ |node| VariableDeclarator::convert(cx, node),
509
+ );
510
+ Self {
511
+ kind,
512
+ declarations,
513
+ loc: None,
514
+ range: Some(range),
515
+ }
516
+ }
517
+}
518
+impl FromHermes for VariableDeclarator {
519
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
520
+ let range = convert_range(node);
521
+ let id = Pattern::convert(
522
+ cx,
523
+ unsafe { hermes::parser::hermes_get_VariableDeclarator_id(node) },
524
+ );
525
+ let init = convert_option(
526
+ unsafe { hermes::parser::hermes_get_VariableDeclarator_init(node) },
527
+ |node| Expression::convert(cx, node),
528
+ );
529
+ Self {
530
+ id,
531
+ init,
532
+ loc: None,
533
+ range: Some(range),
534
+ }
535
+ }
536
+}
537
+impl FromHermes for ThisExpression {
538
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
539
+ let range = convert_range(node);
540
+ Self {
541
+ loc: None,
542
+ range: Some(range),
543
+ }
544
+ }
545
+}
546
+impl FromHermes for ArrayExpression {
547
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
548
+ let range = convert_range(node);
549
+ let elements = convert_array_expression_elements(
550
+ cx,
551
+ unsafe { hermes::parser::hermes_get_ArrayExpression_elements(node) },
552
+ );
553
+ Self {
554
+ elements,
555
+ loc: None,
556
+ range: Some(range),
557
+ }
558
+ }
559
+}
560
+impl FromHermes for ObjectExpression {
561
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
562
+ let range = convert_range(node);
563
+ let properties = convert_vec(
564
+ unsafe { hermes::parser::hermes_get_ObjectExpression_properties(node) },
565
+ |node| PropertyOrSpreadElement::convert(cx, node),
566
+ );
567
+ Self {
568
+ properties,
569
+ loc: None,
570
+ range: Some(range),
571
+ }
572
+ }
573
+}
574
+impl FromHermes for Property {
575
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
576
+ let range = convert_range(node);
577
+ let key = Expression::convert(
578
+ cx,
579
+ unsafe { hermes::parser::hermes_get_Property_key(node) },
580
+ );
581
+ let value = Expression::convert(
582
+ cx,
583
+ unsafe { hermes::parser::hermes_get_Property_value(node) },
584
+ );
585
+ let kind = PropertyKind::convert(
586
+ cx,
587
+ unsafe { hermes::parser::hermes_get_Property_kind(node) },
588
+ );
589
+ let is_method = unsafe { hermes::parser::hermes_get_Property_method(node) };
590
+ let is_shorthand = unsafe {
591
+ hermes::parser::hermes_get_Property_shorthand(node)
592
+ };
593
+ let is_computed = unsafe { hermes::parser::hermes_get_Property_computed(node) };
594
+ Self {
595
+ key,
596
+ value,
597
+ kind,
598
+ is_method,
599
+ is_shorthand,
600
+ is_computed,
601
+ loc: None,
602
+ range: Some(range),
603
+ }
604
+ }
605
+}
606
+impl FromHermes for UnaryExpression {
607
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
608
+ let range = convert_range(node);
609
+ let operator = UnaryOperator::convert(
610
+ cx,
611
+ unsafe { hermes::parser::hermes_get_UnaryExpression_operator(node) },
612
+ );
613
+ let prefix = unsafe { hermes::parser::hermes_get_UnaryExpression_prefix(node) };
614
+ let argument = Expression::convert(
615
+ cx,
616
+ unsafe { hermes::parser::hermes_get_UnaryExpression_argument(node) },
617
+ );
618
+ Self {
619
+ operator,
620
+ prefix,
621
+ argument,
622
+ loc: None,
623
+ range: Some(range),
624
+ }
625
+ }
626
+}
627
+impl FromHermes for UpdateExpression {
628
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
629
+ let range = convert_range(node);
630
+ let operator = UpdateOperator::convert(
631
+ cx,
632
+ unsafe { hermes::parser::hermes_get_UpdateExpression_operator(node) },
633
+ );
634
+ let argument = Expression::convert(
635
+ cx,
636
+ unsafe { hermes::parser::hermes_get_UpdateExpression_argument(node) },
637
+ );
638
+ let prefix = unsafe { hermes::parser::hermes_get_UpdateExpression_prefix(node) };
639
+ Self {
640
+ operator,
641
+ argument,
642
+ prefix,
643
+ loc: None,
644
+ range: Some(range),
645
+ }
646
+ }
647
+}
648
+impl FromHermes for BinaryExpression {
649
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
650
+ let range = convert_range(node);
651
+ let left = Expression::convert(
652
+ cx,
653
+ unsafe { hermes::parser::hermes_get_BinaryExpression_left(node) },
654
+ );
655
+ let operator = BinaryOperator::convert(
656
+ cx,
657
+ unsafe { hermes::parser::hermes_get_BinaryExpression_operator(node) },
658
+ );
659
+ let right = Expression::convert(
660
+ cx,
661
+ unsafe { hermes::parser::hermes_get_BinaryExpression_right(node) },
662
+ );
663
+ Self {
664
+ left,
665
+ operator,
666
+ right,
667
+ loc: None,
668
+ range: Some(range),
669
+ }
670
+ }
671
+}
672
+impl FromHermes for AssignmentExpression {
673
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
674
+ let range = convert_range(node);
675
+ let operator = AssignmentOperator::convert(
676
+ cx,
677
+ unsafe { hermes::parser::hermes_get_AssignmentExpression_operator(node) },
678
+ );
679
+ let left = AssignmentTarget::convert(
680
+ cx,
681
+ unsafe { hermes::parser::hermes_get_AssignmentExpression_left(node) },
682
+ );
683
+ let right = Expression::convert(
684
+ cx,
685
+ unsafe { hermes::parser::hermes_get_AssignmentExpression_right(node) },
686
+ );
687
+ Self {
688
+ operator,
689
+ left,
690
+ right,
691
+ loc: None,
692
+ range: Some(range),
693
+ }
694
+ }
695
+}
696
+impl FromHermes for LogicalExpression {
697
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
698
+ let range = convert_range(node);
699
+ let operator = LogicalOperator::convert(
700
+ cx,
701
+ unsafe { hermes::parser::hermes_get_LogicalExpression_operator(node) },
702
+ );
703
+ let left = Expression::convert(
704
+ cx,
705
+ unsafe { hermes::parser::hermes_get_LogicalExpression_left(node) },
706
+ );
707
+ let right = Expression::convert(
708
+ cx,
709
+ unsafe { hermes::parser::hermes_get_LogicalExpression_right(node) },
710
+ );
711
+ Self {
712
+ operator,
713
+ left,
714
+ right,
715
+ loc: None,
716
+ range: Some(range),
717
+ }
718
+ }
719
+}
720
+impl FromHermes for MemberExpression {
721
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
722
+ let range = convert_range(node);
723
+ let object = ExpressionOrSuper::convert(
724
+ cx,
725
+ unsafe { hermes::parser::hermes_get_MemberExpression_object(node) },
726
+ );
727
+ let property = Expression::convert(
728
+ cx,
729
+ unsafe { hermes::parser::hermes_get_MemberExpression_property(node) },
730
+ );
731
+ let is_computed = unsafe {
732
+ hermes::parser::hermes_get_MemberExpression_computed(node)
733
+ };
734
+ Self {
735
+ object,
736
+ property,
737
+ is_computed,
738
+ loc: None,
739
+ range: Some(range),
740
+ }
741
+ }
742
+}
743
+impl FromHermes for ConditionalExpression {
744
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
745
+ let range = convert_range(node);
746
+ let test = Expression::convert(
747
+ cx,
748
+ unsafe { hermes::parser::hermes_get_ConditionalExpression_test(node) },
749
+ );
750
+ let alternate = Expression::convert(
751
+ cx,
752
+ unsafe { hermes::parser::hermes_get_ConditionalExpression_alternate(node) },
753
+ );
754
+ let consequent = Expression::convert(
755
+ cx,
756
+ unsafe { hermes::parser::hermes_get_ConditionalExpression_consequent(node) },
757
+ );
758
+ Self {
759
+ test,
760
+ alternate,
761
+ consequent,
762
+ loc: None,
763
+ range: Some(range),
764
+ }
765
+ }
766
+}
767
+impl FromHermes for CallExpression {
768
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
769
+ let range = convert_range(node);
770
+ let callee = ExpressionOrSuper::convert(
771
+ cx,
772
+ unsafe { hermes::parser::hermes_get_CallExpression_callee(node) },
773
+ );
774
+ let arguments = convert_vec(
775
+ unsafe { hermes::parser::hermes_get_CallExpression_arguments(node) },
776
+ |node| ExpressionOrSpread::convert(cx, node),
777
+ );
778
+ Self {
779
+ callee,
780
+ arguments,
781
+ loc: None,
782
+ range: Some(range),
783
+ }
784
+ }
785
+}
786
+impl FromHermes for NewExpression {
787
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
788
+ let range = convert_range(node);
789
+ let callee = Expression::convert(
790
+ cx,
791
+ unsafe { hermes::parser::hermes_get_NewExpression_callee(node) },
792
+ );
793
+ let arguments = convert_vec(
794
+ unsafe { hermes::parser::hermes_get_NewExpression_arguments(node) },
795
+ |node| ExpressionOrSpread::convert(cx, node),
796
+ );
797
+ Self {
798
+ callee,
799
+ arguments,
800
+ loc: None,
801
+ range: Some(range),
802
+ }
803
+ }
804
+}
805
+impl FromHermes for SequenceExpression {
806
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
807
+ let range = convert_range(node);
808
+ let expressions = convert_vec(
809
+ unsafe { hermes::parser::hermes_get_SequenceExpression_expressions(node) },
810
+ |node| Expression::convert(cx, node),
811
+ );
812
+ Self {
813
+ expressions,
814
+ loc: None,
815
+ range: Some(range),
816
+ }
817
+ }
818
+}
819
+impl FromHermes for Super {
820
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
821
+ let range = convert_range(node);
822
+ Self {
823
+ loc: None,
824
+ range: Some(range),
825
+ }
826
+ }
827
+}
828
+impl FromHermes for SpreadElement {
829
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
830
+ let range = convert_range(node);
831
+ let argument = Expression::convert(
832
+ cx,
833
+ unsafe { hermes::parser::hermes_get_SpreadElement_argument(node) },
834
+ );
835
+ Self {
836
+ argument,
837
+ loc: None,
838
+ range: Some(range),
839
+ }
840
+ }
841
+}
842
+impl FromHermes for YieldExpression {
843
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
844
+ let range = convert_range(node);
845
+ let argument = convert_option(
846
+ unsafe { hermes::parser::hermes_get_YieldExpression_argument(node) },
847
+ |node| Expression::convert(cx, node),
848
+ );
849
+ let is_delegate = unsafe {
850
+ hermes::parser::hermes_get_YieldExpression_delegate(node)
851
+ };
852
+ Self {
853
+ argument,
854
+ is_delegate,
855
+ loc: None,
856
+ range: Some(range),
857
+ }
858
+ }
859
+}
860
+impl FromHermes for ImportDeclaration {
861
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
862
+ let range = convert_range(node);
863
+ let specifiers = convert_vec(
864
+ unsafe { hermes::parser::hermes_get_ImportDeclaration_specifiers(node) },
865
+ |node| ImportDeclarationSpecifier::convert(cx, node),
866
+ );
867
+ let source = _Literal::convert(
868
+ cx,
869
+ unsafe { hermes::parser::hermes_get_ImportDeclaration_source(node) },
870
+ );
871
+ Self {
872
+ specifiers,
873
+ source,
874
+ loc: None,
875
+ range: Some(range),
876
+ }
877
+ }
878
+}
879
+impl FromHermes for ImportSpecifier {
880
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
881
+ let range = convert_range(node);
882
+ let imported = Identifier::convert(
883
+ cx,
884
+ unsafe { hermes::parser::hermes_get_ImportSpecifier_imported(node) },
885
+ );
886
+ let local = Identifier::convert(
887
+ cx,
888
+ unsafe { hermes::parser::hermes_get_ImportSpecifier_local(node) },
889
+ );
890
+ Self {
891
+ imported,
892
+ local,
893
+ loc: None,
894
+ range: Some(range),
895
+ }
896
+ }
897
+}
898
+impl FromHermes for ImportDefaultSpecifier {
899
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
900
+ let range = convert_range(node);
901
+ let local = Identifier::convert(
902
+ cx,
903
+ unsafe { hermes::parser::hermes_get_ImportDefaultSpecifier_local(node) },
904
+ );
905
+ Self {
906
+ local,
907
+ loc: None,
908
+ range: Some(range),
909
+ }
910
+ }
911
+}
912
+impl FromHermes for ImportNamespaceSpecifier {
913
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
914
+ let range = convert_range(node);
915
+ let local = Identifier::convert(
916
+ cx,
917
+ unsafe { hermes::parser::hermes_get_ImportNamespaceSpecifier_local(node) },
918
+ );
919
+ Self {
920
+ local,
921
+ loc: None,
922
+ range: Some(range),
923
+ }
924
+ }
925
+}
926
+impl FromHermes for ExportNamedDeclaration {
927
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
928
+ let range = convert_range(node);
929
+ let declaration = convert_option(
930
+ unsafe {
931
+ hermes::parser::hermes_get_ExportNamedDeclaration_declaration(node)
932
+ },
933
+ |node| Declaration::convert(cx, node),
934
+ );
935
+ let specifiers = convert_vec(
936
+ unsafe {
937
+ hermes::parser::hermes_get_ExportNamedDeclaration_specifiers(node)
938
+ },
939
+ |node| ExportSpecifier::convert(cx, node),
940
+ );
941
+ let source = convert_option(
942
+ unsafe { hermes::parser::hermes_get_ExportNamedDeclaration_source(node) },
943
+ |node| _Literal::convert(cx, node),
944
+ );
945
+ Self {
946
+ declaration,
947
+ specifiers,
948
+ source,
949
+ loc: None,
950
+ range: Some(range),
951
+ }
952
+ }
953
+}
954
+impl FromHermes for ExportSpecifier {
955
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
956
+ let range = convert_range(node);
957
+ let exported = Identifier::convert(
958
+ cx,
959
+ unsafe { hermes::parser::hermes_get_ExportSpecifier_exported(node) },
960
+ );
961
+ Self {
962
+ exported,
963
+ loc: None,
964
+ range: Some(range),
965
+ }
966
+ }
967
+}
968
+impl FromHermes for ExportDefaultDeclaration {
969
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
970
+ let range = convert_range(node);
971
+ let declaration = Declaration::convert(
972
+ cx,
973
+ unsafe {
974
+ hermes::parser::hermes_get_ExportDefaultDeclaration_declaration(node)
975
+ },
976
+ );
977
+ Self {
978
+ declaration,
979
+ loc: None,
980
+ range: Some(range),
981
+ }
982
+ }
983
+}
984
+impl FromHermes for ExportAllDeclaration {
985
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
986
+ let range = convert_range(node);
987
+ let source = _Literal::convert(
988
+ cx,
989
+ unsafe { hermes::parser::hermes_get_ExportAllDeclaration_source(node) },
990
+ );
991
+ let exported = Default::default();
992
+ Self {
993
+ source,
994
+ exported,
995
+ loc: None,
996
+ range: Some(range),
997
+ }
998
+ }
999
+}
1000
+impl FromHermes for JSXIdentifier {
1001
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1002
+ let range = convert_range(node);
1003
+ let name = convert_string(
1004
+ cx,
1005
+ unsafe { hermes::parser::hermes_get_JSXIdentifier_name(node) },
1006
+ );
1007
+ let binding = Default::default();
1008
+ Self {
1009
+ name,
1010
+ binding,
1011
+ loc: None,
1012
+ range: Some(range),
1013
+ }
1014
+ }
1015
+}
1016
+impl FromHermes for JSXNamespacedName {
1017
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1018
+ let range = convert_range(node);
1019
+ let namespace = JSXIdentifier::convert(
1020
+ cx,
1021
+ unsafe { hermes::parser::hermes_get_JSXNamespacedName_namespace(node) },
1022
+ );
1023
+ let name = JSXIdentifier::convert(
1024
+ cx,
1025
+ unsafe { hermes::parser::hermes_get_JSXNamespacedName_name(node) },
1026
+ );
1027
+ Self {
1028
+ namespace,
1029
+ name,
1030
+ loc: None,
1031
+ range: Some(range),
1032
+ }
1033
+ }
1034
+}
1035
+impl FromHermes for JSXMemberExpression {
1036
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1037
+ let range = convert_range(node);
1038
+ let object = JSXMemberExpressionOrIdentifier::convert(
1039
+ cx,
1040
+ unsafe { hermes::parser::hermes_get_JSXMemberExpression_object(node) },
1041
+ );
1042
+ let property = JSXIdentifier::convert(
1043
+ cx,
1044
+ unsafe { hermes::parser::hermes_get_JSXMemberExpression_property(node) },
1045
+ );
1046
+ Self {
1047
+ object,
1048
+ property,
1049
+ loc: None,
1050
+ range: Some(range),
1051
+ }
1052
+ }
1053
+}
1054
+impl FromHermes for JSXEmptyExpression {
1055
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1056
+ let range = convert_range(node);
1057
+ Self {
1058
+ loc: None,
1059
+ range: Some(range),
1060
+ }
1061
+ }
1062
+}
1063
+impl FromHermes for JSXExpressionContainer {
1064
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1065
+ let range = convert_range(node);
1066
+ let expression = JSXExpressionOrEmpty::convert(
1067
+ cx,
1068
+ unsafe { hermes::parser::hermes_get_JSXExpressionContainer_expression(node) },
1069
+ );
1070
+ Self {
1071
+ expression,
1072
+ loc: None,
1073
+ range: Some(range),
1074
+ }
1075
+ }
1076
+}
1077
+impl FromHermes for JSXSpreadChild {
1078
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1079
+ let range = convert_range(node);
1080
+ let expression = Expression::convert(
1081
+ cx,
1082
+ unsafe { hermes::parser::hermes_get_JSXSpreadChild_expression(node) },
1083
+ );
1084
+ Self {
1085
+ expression,
1086
+ loc: None,
1087
+ range: Some(range),
1088
+ }
1089
+ }
1090
+}
1091
+impl FromHermes for JSXOpeningElement {
1092
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1093
+ let range = convert_range(node);
1094
+ let name = JSXElementName::convert(
1095
+ cx,
1096
+ unsafe { hermes::parser::hermes_get_JSXOpeningElement_name(node) },
1097
+ );
1098
+ let attributes = convert_vec(
1099
+ unsafe { hermes::parser::hermes_get_JSXOpeningElement_attributes(node) },
1100
+ |node| JSXAttributeOrSpread::convert(cx, node),
1101
+ );
1102
+ let self_closing = unsafe {
1103
+ hermes::parser::hermes_get_JSXOpeningElement_selfClosing(node)
1104
+ };
1105
+ Self {
1106
+ name,
1107
+ attributes,
1108
+ self_closing,
1109
+ loc: None,
1110
+ range: Some(range),
1111
+ }
1112
+ }
1113
+}
1114
+impl FromHermes for JSXClosingElement {
1115
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1116
+ let range = convert_range(node);
1117
+ let name = JSXElementName::convert(
1118
+ cx,
1119
+ unsafe { hermes::parser::hermes_get_JSXClosingElement_name(node) },
1120
+ );
1121
+ Self {
1122
+ name,
1123
+ loc: None,
1124
+ range: Some(range),
1125
+ }
1126
+ }
1127
+}
1128
+impl FromHermes for JSXAttribute {
1129
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1130
+ let range = convert_range(node);
1131
+ let name = JSXIdentifierOrNamespacedName::convert(
1132
+ cx,
1133
+ unsafe { hermes::parser::hermes_get_JSXAttribute_name(node) },
1134
+ );
1135
+ let value = convert_option(
1136
+ unsafe { hermes::parser::hermes_get_JSXAttribute_value(node) },
1137
+ |node| JSXAttributeValue::convert(cx, node),
1138
+ );
1139
+ Self {
1140
+ name,
1141
+ value,
1142
+ loc: None,
1143
+ range: Some(range),
1144
+ }
1145
+ }
1146
+}
1147
+impl FromHermes for JSXSpreadAttribute {
1148
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1149
+ let range = convert_range(node);
1150
+ let argument = Expression::convert(
1151
+ cx,
1152
+ unsafe { hermes::parser::hermes_get_JSXSpreadAttribute_argument(node) },
1153
+ );
1154
+ Self {
1155
+ argument,
1156
+ loc: None,
1157
+ range: Some(range),
1158
+ }
1159
+ }
1160
+}
1161
+impl FromHermes for JSXText {
1162
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1163
+ let range = convert_range(node);
1164
+ let value = convert_string_value(
1165
+ cx,
1166
+ unsafe { hermes::parser::hermes_get_JSXText_value(node) },
1167
+ );
1168
+ let raw = convert_string(
1169
+ cx,
1170
+ unsafe { hermes::parser::hermes_get_JSXText_raw(node) },
1171
+ );
1172
+ Self {
1173
+ value,
1174
+ raw,
1175
+ loc: None,
1176
+ range: Some(range),
1177
+ }
1178
+ }
1179
+}
1180
+impl FromHermes for JSXElement {
1181
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1182
+ let range = convert_range(node);
1183
+ let opening_element = JSXOpeningElement::convert(
1184
+ cx,
1185
+ unsafe { hermes::parser::hermes_get_JSXElement_openingElement(node) },
1186
+ );
1187
+ let children = convert_vec(
1188
+ unsafe { hermes::parser::hermes_get_JSXElement_children(node) },
1189
+ |node| JSXChildItem::convert(cx, node),
1190
+ );
1191
+ let closing_element = convert_option(
1192
+ unsafe { hermes::parser::hermes_get_JSXElement_closingElement(node) },
1193
+ |node| JSXClosingElement::convert(cx, node),
1194
+ );
1195
+ Self {
1196
+ opening_element,
1197
+ children,
1198
+ closing_element,
1199
+ loc: None,
1200
+ range: Some(range),
1201
+ }
1202
+ }
1203
+}
1204
+impl FromHermes for JSXFragment {
1205
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1206
+ let range = convert_range(node);
1207
+ let opening_fragment = JSXOpeningFragment::convert(
1208
+ cx,
1209
+ unsafe { hermes::parser::hermes_get_JSXFragment_openingFragment(node) },
1210
+ );
1211
+ let children = convert_vec(
1212
+ unsafe { hermes::parser::hermes_get_JSXFragment_children(node) },
1213
+ |node| JSXChildItem::convert(cx, node),
1214
+ );
1215
+ let closing_fragment = JSXClosingFragment::convert(
1216
+ cx,
1217
+ unsafe { hermes::parser::hermes_get_JSXFragment_closingFragment(node) },
1218
+ );
1219
+ Self {
1220
+ opening_fragment,
1221
+ children,
1222
+ closing_fragment,
1223
+ loc: None,
1224
+ range: Some(range),
1225
+ }
1226
+ }
1227
+}
1228
+impl FromHermes for JSXOpeningFragment {
1229
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1230
+ let range = convert_range(node);
1231
+ Self {
1232
+ loc: None,
1233
+ range: Some(range),
1234
+ }
1235
+ }
1236
+}
1237
+impl FromHermes for JSXClosingFragment {
1238
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1239
+ let range = convert_range(node);
1240
+ Self {
1241
+ loc: None,
1242
+ range: Some(range),
1243
+ }
1244
+ }
1245
+}
1246
+impl FromHermes for ArrayPattern {
1247
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1248
+ let range = convert_range(node);
1249
+ let elements = convert_vec_of_option(
1250
+ unsafe { hermes::parser::hermes_get_ArrayPattern_elements(node) },
1251
+ |node| Pattern::convert(cx, node),
1252
+ );
1253
+ Self {
1254
+ elements,
1255
+ loc: None,
1256
+ range: Some(range),
1257
+ }
1258
+ }
1259
+}
1260
+impl FromHermes for ObjectPattern {
1261
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1262
+ let range = convert_range(node);
1263
+ let properties = convert_vec(
1264
+ unsafe { hermes::parser::hermes_get_ObjectPattern_properties(node) },
1265
+ |node| AssignmentPropertyOrRestElement::convert(cx, node),
1266
+ );
1267
+ Self {
1268
+ properties,
1269
+ loc: None,
1270
+ range: Some(range),
1271
+ }
1272
+ }
1273
+}
1274
+impl FromHermes for RestElement {
1275
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1276
+ let range = convert_range(node);
1277
+ let argument = Pattern::convert(
1278
+ cx,
1279
+ unsafe { hermes::parser::hermes_get_RestElement_argument(node) },
1280
+ );
1281
+ Self {
1282
+ argument,
1283
+ loc: None,
1284
+ range: Some(range),
1285
+ }
1286
+ }
1287
+}
1288
+impl FromHermes for AssignmentPattern {
1289
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1290
+ let range = convert_range(node);
1291
+ let left = Pattern::convert(
1292
+ cx,
1293
+ unsafe { hermes::parser::hermes_get_AssignmentPattern_left(node) },
1294
+ );
1295
+ let right = Expression::convert(
1296
+ cx,
1297
+ unsafe { hermes::parser::hermes_get_AssignmentPattern_right(node) },
1298
+ );
1299
+ Self {
1300
+ left,
1301
+ right,
1302
+ loc: None,
1303
+ range: Some(range),
1304
+ }
1305
+ }
1306
+}
1307
+impl FromHermes for TemplateLiteral {
1308
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1309
+ let range = convert_range(node);
1310
+ let quasis = convert_vec(
1311
+ unsafe { hermes::parser::hermes_get_TemplateLiteral_quasis(node) },
1312
+ |node| TemplateElement::convert(cx, node),
1313
+ );
1314
+ let expressions = convert_vec(
1315
+ unsafe { hermes::parser::hermes_get_TemplateLiteral_expressions(node) },
1316
+ |node| Expression::convert(cx, node),
1317
+ );
1318
+ Self {
1319
+ quasis,
1320
+ expressions,
1321
+ loc: None,
1322
+ range: Some(range),
1323
+ }
1324
+ }
1325
+}
1326
+impl FromHermes for TaggedTemplateExpression {
1327
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1328
+ let range = convert_range(node);
1329
+ let tag = Expression::convert(
1330
+ cx,
1331
+ unsafe { hermes::parser::hermes_get_TaggedTemplateExpression_tag(node) },
1332
+ );
1333
+ let quasi = TemplateLiteral::convert(
1334
+ cx,
1335
+ unsafe { hermes::parser::hermes_get_TaggedTemplateExpression_quasi(node) },
1336
+ );
1337
+ Self {
1338
+ tag,
1339
+ quasi,
1340
+ loc: None,
1341
+ range: Some(range),
1342
+ }
1343
+ }
1344
+}
1345
+impl FromHermes for MetaProperty {
1346
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1347
+ let range = convert_range(node);
1348
+ let meta = Identifier::convert(
1349
+ cx,
1350
+ unsafe { hermes::parser::hermes_get_MetaProperty_meta(node) },
1351
+ );
1352
+ let property = Identifier::convert(
1353
+ cx,
1354
+ unsafe { hermes::parser::hermes_get_MetaProperty_property(node) },
1355
+ );
1356
+ Self {
1357
+ meta,
1358
+ property,
1359
+ loc: None,
1360
+ range: Some(range),
1361
+ }
1362
+ }
1363
+}
1364
+impl FromHermes for AwaitExpression {
1365
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1366
+ let range = convert_range(node);
1367
+ let argument = Expression::convert(
1368
+ cx,
1369
+ unsafe { hermes::parser::hermes_get_AwaitExpression_argument(node) },
1370
+ );
1371
+ Self {
1372
+ argument,
1373
+ loc: None,
1374
+ range: Some(range),
1375
+ }
1376
+ }
1377
+}
1378
+impl FromHermes for OptionalMemberExpression {
1379
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1380
+ let range = convert_range(node);
1381
+ let object = Expression::convert(
1382
+ cx,
1383
+ unsafe { hermes::parser::hermes_get_OptionalMemberExpression_object(node) },
1384
+ );
1385
+ let property = Expression::convert(
1386
+ cx,
1387
+ unsafe { hermes::parser::hermes_get_OptionalMemberExpression_property(node) },
1388
+ );
1389
+ let is_computed = unsafe {
1390
+ hermes::parser::hermes_get_OptionalMemberExpression_computed(node)
1391
+ };
1392
+ let is_optional = unsafe {
1393
+ hermes::parser::hermes_get_OptionalMemberExpression_optional(node)
1394
+ };
1395
+ Self {
1396
+ object,
1397
+ property,
1398
+ is_computed,
1399
+ is_optional,
1400
+ loc: None,
1401
+ range: Some(range),
1402
+ }
1403
+ }
1404
+}
1405
+impl FromHermes for OptionalCallExpression {
1406
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1407
+ let range = convert_range(node);
1408
+ let callee = ExpressionOrSuper::convert(
1409
+ cx,
1410
+ unsafe { hermes::parser::hermes_get_OptionalCallExpression_callee(node) },
1411
+ );
1412
+ let arguments = convert_vec(
1413
+ unsafe { hermes::parser::hermes_get_OptionalCallExpression_arguments(node) },
1414
+ |node| ExpressionOrSpread::convert(cx, node),
1415
+ );
1416
+ let is_optional = unsafe {
1417
+ hermes::parser::hermes_get_OptionalCallExpression_optional(node)
1418
+ };
1419
+ Self {
1420
+ callee,
1421
+ arguments,
1422
+ is_optional,
1423
+ loc: None,
1424
+ range: Some(range),
1425
+ }
1426
+ }
1427
+}
1428
+impl FromHermes for ImportExpression {
1429
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1430
+ let range = convert_range(node);
1431
+ let source = Expression::convert(
1432
+ cx,
1433
+ unsafe { hermes::parser::hermes_get_ImportExpression_source(node) },
1434
+ );
1435
+ Self {
1436
+ source,
1437
+ loc: None,
1438
+ range: Some(range),
1439
+ }
1440
+ }
1441
+}
1442
+impl FromHermes for Statement {
1443
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1444
+ let node_ref = node.as_ref();
1445
+ match node_ref.kind {
1446
+ NodeKind::BlockStatement => {
1447
+ let node = BlockStatement::convert(cx, node);
1448
+ Statement::BlockStatement(Box::new(node))
1449
+ }
1450
+ NodeKind::BreakStatement => {
1451
+ let node = BreakStatement::convert(cx, node);
1452
+ Statement::BreakStatement(Box::new(node))
1453
+ }
1454
+ NodeKind::ClassDeclaration => {
1455
+ let node = ClassDeclaration::convert(cx, node);
1456
+ Statement::ClassDeclaration(Box::new(node))
1457
+ }
1458
+ NodeKind::ContinueStatement => {
1459
+ let node = ContinueStatement::convert(cx, node);
1460
+ Statement::ContinueStatement(Box::new(node))
1461
+ }
1462
+ NodeKind::DebuggerStatement => {
1463
+ let node = DebuggerStatement::convert(cx, node);
1464
+ Statement::DebuggerStatement(Box::new(node))
1465
+ }
1466
+ NodeKind::DoWhileStatement => {
1467
+ let node = DoWhileStatement::convert(cx, node);
1468
+ Statement::DoWhileStatement(Box::new(node))
1469
+ }
1470
+ NodeKind::EmptyStatement => {
1471
+ let node = EmptyStatement::convert(cx, node);
1472
+ Statement::EmptyStatement(Box::new(node))
1473
+ }
1474
+ NodeKind::ExpressionStatement => {
1475
+ let node = ExpressionStatement::convert(cx, node);
1476
+ Statement::ExpressionStatement(Box::new(node))
1477
+ }
1478
+ NodeKind::ForInStatement => {
1479
+ let node = ForInStatement::convert(cx, node);
1480
+ Statement::ForInStatement(Box::new(node))
1481
+ }
1482
+ NodeKind::ForOfStatement => {
1483
+ let node = ForOfStatement::convert(cx, node);
1484
+ Statement::ForOfStatement(Box::new(node))
1485
+ }
1486
+ NodeKind::ForStatement => {
1487
+ let node = ForStatement::convert(cx, node);
1488
+ Statement::ForStatement(Box::new(node))
1489
+ }
1490
+ NodeKind::FunctionDeclaration => {
1491
+ let node = FunctionDeclaration::convert(cx, node);
1492
+ Statement::FunctionDeclaration(Box::new(node))
1493
+ }
1494
+ NodeKind::IfStatement => {
1495
+ let node = IfStatement::convert(cx, node);
1496
+ Statement::IfStatement(Box::new(node))
1497
+ }
1498
+ NodeKind::LabeledStatement => {
1499
+ let node = LabeledStatement::convert(cx, node);
1500
+ Statement::LabeledStatement(Box::new(node))
1501
+ }
1502
+ NodeKind::ReturnStatement => {
1503
+ let node = ReturnStatement::convert(cx, node);
1504
+ Statement::ReturnStatement(Box::new(node))
1505
+ }
1506
+ NodeKind::SwitchStatement => {
1507
+ let node = SwitchStatement::convert(cx, node);
1508
+ Statement::SwitchStatement(Box::new(node))
1509
+ }
1510
+ NodeKind::ThrowStatement => {
1511
+ let node = ThrowStatement::convert(cx, node);
1512
+ Statement::ThrowStatement(Box::new(node))
1513
+ }
1514
+ NodeKind::TryStatement => {
1515
+ let node = TryStatement::convert(cx, node);
1516
+ Statement::TryStatement(Box::new(node))
1517
+ }
1518
+ NodeKind::VariableDeclaration => {
1519
+ let node = VariableDeclaration::convert(cx, node);
1520
+ Statement::VariableDeclaration(Box::new(node))
1521
+ }
1522
+ NodeKind::WhileStatement => {
1523
+ let node = WhileStatement::convert(cx, node);
1524
+ Statement::WhileStatement(Box::new(node))
1525
+ }
1526
+ NodeKind::WithStatement => {
1527
+ let node = WithStatement::convert(cx, node);
1528
+ Statement::WithStatement(Box::new(node))
1529
+ }
1530
+ _ => panic!("Unexpected node"),
1531
+ }
1532
+ }
1533
+}
1534
+impl FromHermes for Expression {
1535
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1536
+ let node_ref = node.as_ref();
1537
+ match node_ref.kind {
1538
+ NodeKind::ArrayExpression => {
1539
+ let node = ArrayExpression::convert(cx, node);
1540
+ Expression::ArrayExpression(Box::new(node))
1541
+ }
1542
+ NodeKind::ArrowFunctionExpression => {
1543
+ let node = ArrowFunctionExpression::convert(cx, node);
1544
+ Expression::ArrowFunctionExpression(Box::new(node))
1545
+ }
1546
+ NodeKind::AssignmentExpression => {
1547
+ let node = AssignmentExpression::convert(cx, node);
1548
+ Expression::AssignmentExpression(Box::new(node))
1549
+ }
1550
+ NodeKind::AwaitExpression => {
1551
+ let node = AwaitExpression::convert(cx, node);
1552
+ Expression::AwaitExpression(Box::new(node))
1553
+ }
1554
+ NodeKind::BinaryExpression => {
1555
+ let node = BinaryExpression::convert(cx, node);
1556
+ Expression::BinaryExpression(Box::new(node))
1557
+ }
1558
+ NodeKind::BooleanLiteral => {
1559
+ let node = BooleanLiteral::convert(cx, node);
1560
+ Expression::BooleanLiteral(Box::new(node))
1561
+ }
1562
+ NodeKind::CallExpression => {
1563
+ let node = CallExpression::convert(cx, node);
1564
+ Expression::CallExpression(Box::new(node))
1565
+ }
1566
+ NodeKind::ClassExpression => {
1567
+ let node = ClassExpression::convert(cx, node);
1568
+ Expression::ClassExpression(Box::new(node))
1569
+ }
1570
+ NodeKind::ConditionalExpression => {
1571
+ let node = ConditionalExpression::convert(cx, node);
1572
+ Expression::ConditionalExpression(Box::new(node))
1573
+ }
1574
+ NodeKind::FunctionExpression => {
1575
+ let node = FunctionExpression::convert(cx, node);
1576
+ Expression::FunctionExpression(Box::new(node))
1577
+ }
1578
+ NodeKind::Identifier => {
1579
+ let node = Identifier::convert(cx, node);
1580
+ Expression::Identifier(Box::new(node))
1581
+ }
1582
+ NodeKind::ImportExpression => {
1583
+ let node = ImportExpression::convert(cx, node);
1584
+ Expression::ImportExpression(Box::new(node))
1585
+ }
1586
+ NodeKind::JSXElement => {
1587
+ let node = JSXElement::convert(cx, node);
1588
+ Expression::JSXElement(Box::new(node))
1589
+ }
1590
+ NodeKind::LogicalExpression => {
1591
+ let node = LogicalExpression::convert(cx, node);
1592
+ Expression::LogicalExpression(Box::new(node))
1593
+ }
1594
+ NodeKind::MemberExpression => {
1595
+ let node = MemberExpression::convert(cx, node);
1596
+ Expression::MemberExpression(Box::new(node))
1597
+ }
1598
+ NodeKind::MetaProperty => {
1599
+ let node = MetaProperty::convert(cx, node);
1600
+ Expression::MetaProperty(Box::new(node))
1601
+ }
1602
+ NodeKind::NewExpression => {
1603
+ let node = NewExpression::convert(cx, node);
1604
+ Expression::NewExpression(Box::new(node))
1605
+ }
1606
+ NodeKind::NullLiteral => {
1607
+ let node = NullLiteral::convert(cx, node);
1608
+ Expression::NullLiteral(Box::new(node))
1609
+ }
1610
+ NodeKind::NumericLiteral => {
1611
+ let node = NumericLiteral::convert(cx, node);
1612
+ Expression::NumericLiteral(Box::new(node))
1613
+ }
1614
+ NodeKind::ObjectExpression => {
1615
+ let node = ObjectExpression::convert(cx, node);
1616
+ Expression::ObjectExpression(Box::new(node))
1617
+ }
1618
+ NodeKind::OptionalCallExpression => {
1619
+ let node = OptionalCallExpression::convert(cx, node);
1620
+ Expression::OptionalCallExpression(Box::new(node))
1621
+ }
1622
+ NodeKind::OptionalMemberExpression => {
1623
+ let node = OptionalMemberExpression::convert(cx, node);
1624
+ Expression::OptionalMemberExpression(Box::new(node))
1625
+ }
1626
+ NodeKind::SequenceExpression => {
1627
+ let node = SequenceExpression::convert(cx, node);
1628
+ Expression::SequenceExpression(Box::new(node))
1629
+ }
1630
+ NodeKind::StringLiteral => {
1631
+ let node = StringLiteral::convert(cx, node);
1632
+ Expression::StringLiteral(Box::new(node))
1633
+ }
1634
+ NodeKind::TaggedTemplateExpression => {
1635
+ let node = TaggedTemplateExpression::convert(cx, node);
1636
+ Expression::TaggedTemplateExpression(Box::new(node))
1637
+ }
1638
+ NodeKind::TemplateLiteral => {
1639
+ let node = TemplateLiteral::convert(cx, node);
1640
+ Expression::TemplateLiteral(Box::new(node))
1641
+ }
1642
+ NodeKind::ThisExpression => {
1643
+ let node = ThisExpression::convert(cx, node);
1644
+ Expression::ThisExpression(Box::new(node))
1645
+ }
1646
+ NodeKind::UnaryExpression => {
1647
+ let node = UnaryExpression::convert(cx, node);
1648
+ Expression::UnaryExpression(Box::new(node))
1649
+ }
1650
+ NodeKind::UpdateExpression => {
1651
+ let node = UpdateExpression::convert(cx, node);
1652
+ Expression::UpdateExpression(Box::new(node))
1653
+ }
1654
+ NodeKind::YieldExpression => {
1655
+ let node = YieldExpression::convert(cx, node);
1656
+ Expression::YieldExpression(Box::new(node))
1657
+ }
1658
+ _ => panic!("Unexpected node"),
1659
+ }
1660
+ }
1661
+}
1662
+impl FromHermes for _Literal {
1663
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1664
+ let node_ref = node.as_ref();
1665
+ match node_ref.kind {
1666
+ NodeKind::BooleanLiteral => {
1667
+ let node = BooleanLiteral::convert(cx, node);
1668
+ _Literal::BooleanLiteral(Box::new(node))
1669
+ }
1670
+ NodeKind::NullLiteral => {
1671
+ let node = NullLiteral::convert(cx, node);
1672
+ _Literal::NullLiteral(Box::new(node))
1673
+ }
1674
+ NodeKind::StringLiteral => {
1675
+ let node = StringLiteral::convert(cx, node);
1676
+ _Literal::StringLiteral(Box::new(node))
1677
+ }
1678
+ NodeKind::NumericLiteral => {
1679
+ let node = NumericLiteral::convert(cx, node);
1680
+ _Literal::NumericLiteral(Box::new(node))
1681
+ }
1682
+ _ => panic!("Unexpected node"),
1683
+ }
1684
+ }
1685
+}
1686
+impl FromHermes for Declaration {
1687
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1688
+ let node_ref = node.as_ref();
1689
+ match node_ref.kind {
1690
+ NodeKind::ClassDeclaration => {
1691
+ let node = ClassDeclaration::convert(cx, node);
1692
+ Declaration::ClassDeclaration(Box::new(node))
1693
+ }
1694
+ NodeKind::FunctionDeclaration => {
1695
+ let node = FunctionDeclaration::convert(cx, node);
1696
+ Declaration::FunctionDeclaration(Box::new(node))
1697
+ }
1698
+ NodeKind::VariableDeclaration => {
1699
+ let node = VariableDeclaration::convert(cx, node);
1700
+ Declaration::VariableDeclaration(Box::new(node))
1701
+ }
1702
+ _ => panic!("Unexpected node"),
1703
+ }
1704
+ }
1705
+}
1706
+impl FromHermes for ImportDeclarationSpecifier {
1707
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1708
+ let node_ref = node.as_ref();
1709
+ match node_ref.kind {
1710
+ NodeKind::ImportSpecifier => {
1711
+ let node = ImportSpecifier::convert(cx, node);
1712
+ ImportDeclarationSpecifier::ImportSpecifier(Box::new(node))
1713
+ }
1714
+ NodeKind::ImportDefaultSpecifier => {
1715
+ let node = ImportDefaultSpecifier::convert(cx, node);
1716
+ ImportDeclarationSpecifier::ImportDefaultSpecifier(Box::new(node))
1717
+ }
1718
+ NodeKind::ImportNamespaceSpecifier => {
1719
+ let node = ImportNamespaceSpecifier::convert(cx, node);
1720
+ ImportDeclarationSpecifier::ImportNamespaceSpecifier(Box::new(node))
1721
+ }
1722
+ _ => panic!("Unexpected node"),
1723
+ }
1724
+ }
1725
+}
1726
+impl FromHermes for ModuleItem {
1727
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1728
+ let node_ref = node.as_ref();
1729
+ match node_ref.kind {
1730
+ NodeKind::ImportDeclaration => {
1731
+ let node = ImportDeclaration::convert(cx, node);
1732
+ ModuleItem::ImportOrExportDeclaration(
1733
+ ImportOrExportDeclaration::ImportDeclaration(Box::new(node)),
1734
+ )
1735
+ }
1736
+ NodeKind::ExportNamedDeclaration => {
1737
+ let node = ExportNamedDeclaration::convert(cx, node);
1738
+ ModuleItem::ImportOrExportDeclaration(
1739
+ ImportOrExportDeclaration::ExportNamedDeclaration(Box::new(node)),
1740
+ )
1741
+ }
1742
+ NodeKind::ExportDefaultDeclaration => {
1743
+ let node = ExportDefaultDeclaration::convert(cx, node);
1744
+ ModuleItem::ImportOrExportDeclaration(
1745
+ ImportOrExportDeclaration::ExportDefaultDeclaration(Box::new(node)),
1746
+ )
1747
+ }
1748
+ NodeKind::ExportAllDeclaration => {
1749
+ let node = ExportAllDeclaration::convert(cx, node);
1750
+ ModuleItem::ImportOrExportDeclaration(
1751
+ ImportOrExportDeclaration::ExportAllDeclaration(Box::new(node)),
1752
+ )
1753
+ }
1754
+ NodeKind::BlockStatement => {
1755
+ let node = BlockStatement::convert(cx, node);
1756
+ ModuleItem::Statement(Statement::BlockStatement(Box::new(node)))
1757
+ }
1758
+ NodeKind::BreakStatement => {
1759
+ let node = BreakStatement::convert(cx, node);
1760
+ ModuleItem::Statement(Statement::BreakStatement(Box::new(node)))
1761
+ }
1762
+ NodeKind::ClassDeclaration => {
1763
+ let node = ClassDeclaration::convert(cx, node);
1764
+ ModuleItem::Statement(Statement::ClassDeclaration(Box::new(node)))
1765
+ }
1766
+ NodeKind::ContinueStatement => {
1767
+ let node = ContinueStatement::convert(cx, node);
1768
+ ModuleItem::Statement(Statement::ContinueStatement(Box::new(node)))
1769
+ }
1770
+ NodeKind::DebuggerStatement => {
1771
+ let node = DebuggerStatement::convert(cx, node);
1772
+ ModuleItem::Statement(Statement::DebuggerStatement(Box::new(node)))
1773
+ }
1774
+ NodeKind::DoWhileStatement => {
1775
+ let node = DoWhileStatement::convert(cx, node);
1776
+ ModuleItem::Statement(Statement::DoWhileStatement(Box::new(node)))
1777
+ }
1778
+ NodeKind::EmptyStatement => {
1779
+ let node = EmptyStatement::convert(cx, node);
1780
+ ModuleItem::Statement(Statement::EmptyStatement(Box::new(node)))
1781
+ }
1782
+ NodeKind::ExpressionStatement => {
1783
+ let node = ExpressionStatement::convert(cx, node);
1784
+ ModuleItem::Statement(Statement::ExpressionStatement(Box::new(node)))
1785
+ }
1786
+ NodeKind::ForInStatement => {
1787
+ let node = ForInStatement::convert(cx, node);
1788
+ ModuleItem::Statement(Statement::ForInStatement(Box::new(node)))
1789
+ }
1790
+ NodeKind::ForOfStatement => {
1791
+ let node = ForOfStatement::convert(cx, node);
1792
+ ModuleItem::Statement(Statement::ForOfStatement(Box::new(node)))
1793
+ }
1794
+ NodeKind::ForStatement => {
1795
+ let node = ForStatement::convert(cx, node);
1796
+ ModuleItem::Statement(Statement::ForStatement(Box::new(node)))
1797
+ }
1798
+ NodeKind::FunctionDeclaration => {
1799
+ let node = FunctionDeclaration::convert(cx, node);
1800
+ ModuleItem::Statement(Statement::FunctionDeclaration(Box::new(node)))
1801
+ }
1802
+ NodeKind::IfStatement => {
1803
+ let node = IfStatement::convert(cx, node);
1804
+ ModuleItem::Statement(Statement::IfStatement(Box::new(node)))
1805
+ }
1806
+ NodeKind::LabeledStatement => {
1807
+ let node = LabeledStatement::convert(cx, node);
1808
+ ModuleItem::Statement(Statement::LabeledStatement(Box::new(node)))
1809
+ }
1810
+ NodeKind::ReturnStatement => {
1811
+ let node = ReturnStatement::convert(cx, node);
1812
+ ModuleItem::Statement(Statement::ReturnStatement(Box::new(node)))
1813
+ }
1814
+ NodeKind::SwitchStatement => {
1815
+ let node = SwitchStatement::convert(cx, node);
1816
+ ModuleItem::Statement(Statement::SwitchStatement(Box::new(node)))
1817
+ }
1818
+ NodeKind::ThrowStatement => {
1819
+ let node = ThrowStatement::convert(cx, node);
1820
+ ModuleItem::Statement(Statement::ThrowStatement(Box::new(node)))
1821
+ }
1822
+ NodeKind::TryStatement => {
1823
+ let node = TryStatement::convert(cx, node);
1824
+ ModuleItem::Statement(Statement::TryStatement(Box::new(node)))
1825
+ }
1826
+ NodeKind::VariableDeclaration => {
1827
+ let node = VariableDeclaration::convert(cx, node);
1828
+ ModuleItem::Statement(Statement::VariableDeclaration(Box::new(node)))
1829
+ }
1830
+ NodeKind::WhileStatement => {
1831
+ let node = WhileStatement::convert(cx, node);
1832
+ ModuleItem::Statement(Statement::WhileStatement(Box::new(node)))
1833
+ }
1834
+ NodeKind::WithStatement => {
1835
+ let node = WithStatement::convert(cx, node);
1836
+ ModuleItem::Statement(Statement::WithStatement(Box::new(node)))
1837
+ }
1838
+ _ => panic!("Unexpected node"),
1839
+ }
1840
+ }
1841
+}
1842
+impl FromHermes for ImportOrExportDeclaration {
1843
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1844
+ let node_ref = node.as_ref();
1845
+ match node_ref.kind {
1846
+ NodeKind::ImportDeclaration => {
1847
+ let node = ImportDeclaration::convert(cx, node);
1848
+ ImportOrExportDeclaration::ImportDeclaration(Box::new(node))
1849
+ }
1850
+ NodeKind::ExportNamedDeclaration => {
1851
+ let node = ExportNamedDeclaration::convert(cx, node);
1852
+ ImportOrExportDeclaration::ExportNamedDeclaration(Box::new(node))
1853
+ }
1854
+ NodeKind::ExportDefaultDeclaration => {
1855
+ let node = ExportDefaultDeclaration::convert(cx, node);
1856
+ ImportOrExportDeclaration::ExportDefaultDeclaration(Box::new(node))
1857
+ }
1858
+ NodeKind::ExportAllDeclaration => {
1859
+ let node = ExportAllDeclaration::convert(cx, node);
1860
+ ImportOrExportDeclaration::ExportAllDeclaration(Box::new(node))
1861
+ }
1862
+ _ => panic!("Unexpected node"),
1863
+ }
1864
+ }
1865
+}
1866
+impl FromHermes for ExpressionOrSuper {
1867
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
1868
+ let node_ref = node.as_ref();
1869
+ match node_ref.kind {
1870
+ NodeKind::ArrayExpression => {
1871
+ let node = ArrayExpression::convert(cx, node);
1872
+ ExpressionOrSuper::Expression(
1873
+ Expression::ArrayExpression(Box::new(node)),
1874
+ )
1875
+ }
1876
+ NodeKind::ArrowFunctionExpression => {
1877
+ let node = ArrowFunctionExpression::convert(cx, node);
1878
+ ExpressionOrSuper::Expression(
1879
+ Expression::ArrowFunctionExpression(Box::new(node)),
1880
+ )
1881
+ }
1882
+ NodeKind::AssignmentExpression => {
1883
+ let node = AssignmentExpression::convert(cx, node);
1884
+ ExpressionOrSuper::Expression(
1885
+ Expression::AssignmentExpression(Box::new(node)),
1886
+ )
1887
+ }
1888
+ NodeKind::AwaitExpression => {
1889
+ let node = AwaitExpression::convert(cx, node);
1890
+ ExpressionOrSuper::Expression(
1891
+ Expression::AwaitExpression(Box::new(node)),
1892
+ )
1893
+ }
1894
+ NodeKind::BinaryExpression => {
1895
+ let node = BinaryExpression::convert(cx, node);
1896
+ ExpressionOrSuper::Expression(
1897
+ Expression::BinaryExpression(Box::new(node)),
1898
+ )
1899
+ }
1900
+ NodeKind::BooleanLiteral => {
1901
+ let node = BooleanLiteral::convert(cx, node);
1902
+ ExpressionOrSuper::Expression(Expression::BooleanLiteral(Box::new(node)))
1903
+ }
1904
+ NodeKind::CallExpression => {
1905
+ let node = CallExpression::convert(cx, node);
1906
+ ExpressionOrSuper::Expression(Expression::CallExpression(Box::new(node)))
1907
+ }
1908
+ NodeKind::ClassExpression => {
1909
+ let node = ClassExpression::convert(cx, node);
1910
+ ExpressionOrSuper::Expression(
1911
+ Expression::ClassExpression(Box::new(node)),
1912
+ )
1913
+ }
1914
+ NodeKind::ConditionalExpression => {
1915
+ let node = ConditionalExpression::convert(cx, node);
1916
+ ExpressionOrSuper::Expression(
1917
+ Expression::ConditionalExpression(Box::new(node)),
1918
+ )
1919
+ }
1920
+ NodeKind::FunctionExpression => {
1921
+ let node = FunctionExpression::convert(cx, node);
1922
+ ExpressionOrSuper::Expression(
1923
+ Expression::FunctionExpression(Box::new(node)),
1924
+ )
1925
+ }
1926
+ NodeKind::Identifier => {
1927
+ let node = Identifier::convert(cx, node);
1928
+ ExpressionOrSuper::Expression(Expression::Identifier(Box::new(node)))
1929
+ }
1930
+ NodeKind::ImportExpression => {
1931
+ let node = ImportExpression::convert(cx, node);
1932
+ ExpressionOrSuper::Expression(
1933
+ Expression::ImportExpression(Box::new(node)),
1934
+ )
1935
+ }
1936
+ NodeKind::JSXElement => {
1937
+ let node = JSXElement::convert(cx, node);
1938
+ ExpressionOrSuper::Expression(Expression::JSXElement(Box::new(node)))
1939
+ }
1940
+ NodeKind::LogicalExpression => {
1941
+ let node = LogicalExpression::convert(cx, node);
1942
+ ExpressionOrSuper::Expression(
1943
+ Expression::LogicalExpression(Box::new(node)),
1944
+ )
1945
+ }
1946
+ NodeKind::MemberExpression => {
1947
+ let node = MemberExpression::convert(cx, node);
1948
+ ExpressionOrSuper::Expression(
1949
+ Expression::MemberExpression(Box::new(node)),
1950
+ )
1951
+ }
1952
+ NodeKind::MetaProperty => {
1953
+ let node = MetaProperty::convert(cx, node);
1954
+ ExpressionOrSuper::Expression(Expression::MetaProperty(Box::new(node)))
1955
+ }
1956
+ NodeKind::NewExpression => {
1957
+ let node = NewExpression::convert(cx, node);
1958
+ ExpressionOrSuper::Expression(Expression::NewExpression(Box::new(node)))
1959
+ }
1960
+ NodeKind::NullLiteral => {
1961
+ let node = NullLiteral::convert(cx, node);
1962
+ ExpressionOrSuper::Expression(Expression::NullLiteral(Box::new(node)))
1963
+ }
1964
+ NodeKind::NumericLiteral => {
1965
+ let node = NumericLiteral::convert(cx, node);
1966
+ ExpressionOrSuper::Expression(Expression::NumericLiteral(Box::new(node)))
1967
+ }
1968
+ NodeKind::ObjectExpression => {
1969
+ let node = ObjectExpression::convert(cx, node);
1970
+ ExpressionOrSuper::Expression(
1971
+ Expression::ObjectExpression(Box::new(node)),
1972
+ )
1973
+ }
1974
+ NodeKind::OptionalCallExpression => {
1975
+ let node = OptionalCallExpression::convert(cx, node);
1976
+ ExpressionOrSuper::Expression(
1977
+ Expression::OptionalCallExpression(Box::new(node)),
1978
+ )
1979
+ }
1980
+ NodeKind::OptionalMemberExpression => {
1981
+ let node = OptionalMemberExpression::convert(cx, node);
1982
+ ExpressionOrSuper::Expression(
1983
+ Expression::OptionalMemberExpression(Box::new(node)),
1984
+ )
1985
+ }
1986
+ NodeKind::SequenceExpression => {
1987
+ let node = SequenceExpression::convert(cx, node);
1988
+ ExpressionOrSuper::Expression(
1989
+ Expression::SequenceExpression(Box::new(node)),
1990
+ )
1991
+ }
1992
+ NodeKind::StringLiteral => {
1993
+ let node = StringLiteral::convert(cx, node);
1994
+ ExpressionOrSuper::Expression(Expression::StringLiteral(Box::new(node)))
1995
+ }
1996
+ NodeKind::TaggedTemplateExpression => {
1997
+ let node = TaggedTemplateExpression::convert(cx, node);
1998
+ ExpressionOrSuper::Expression(
1999
+ Expression::TaggedTemplateExpression(Box::new(node)),
2000
+ )
2001
+ }
2002
+ NodeKind::TemplateLiteral => {
2003
+ let node = TemplateLiteral::convert(cx, node);
2004
+ ExpressionOrSuper::Expression(
2005
+ Expression::TemplateLiteral(Box::new(node)),
2006
+ )
2007
+ }
2008
+ NodeKind::ThisExpression => {
2009
+ let node = ThisExpression::convert(cx, node);
2010
+ ExpressionOrSuper::Expression(Expression::ThisExpression(Box::new(node)))
2011
+ }
2012
+ NodeKind::UnaryExpression => {
2013
+ let node = UnaryExpression::convert(cx, node);
2014
+ ExpressionOrSuper::Expression(
2015
+ Expression::UnaryExpression(Box::new(node)),
2016
+ )
2017
+ }
2018
+ NodeKind::UpdateExpression => {
2019
+ let node = UpdateExpression::convert(cx, node);
2020
+ ExpressionOrSuper::Expression(
2021
+ Expression::UpdateExpression(Box::new(node)),
2022
+ )
2023
+ }
2024
+ NodeKind::YieldExpression => {
2025
+ let node = YieldExpression::convert(cx, node);
2026
+ ExpressionOrSuper::Expression(
2027
+ Expression::YieldExpression(Box::new(node)),
2028
+ )
2029
+ }
2030
+ NodeKind::Super => {
2031
+ let node = Super::convert(cx, node);
2032
+ ExpressionOrSuper::Super(Box::new(node))
2033
+ }
2034
+ _ => panic!("Unexpected node"),
2035
+ }
2036
+ }
2037
+}
2038
+impl FromHermes for ExpressionOrSpread {
2039
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2040
+ let node_ref = node.as_ref();
2041
+ match node_ref.kind {
2042
+ NodeKind::ArrayExpression => {
2043
+ let node = ArrayExpression::convert(cx, node);
2044
+ ExpressionOrSpread::Expression(
2045
+ Expression::ArrayExpression(Box::new(node)),
2046
+ )
2047
+ }
2048
+ NodeKind::ArrowFunctionExpression => {
2049
+ let node = ArrowFunctionExpression::convert(cx, node);
2050
+ ExpressionOrSpread::Expression(
2051
+ Expression::ArrowFunctionExpression(Box::new(node)),
2052
+ )
2053
+ }
2054
+ NodeKind::AssignmentExpression => {
2055
+ let node = AssignmentExpression::convert(cx, node);
2056
+ ExpressionOrSpread::Expression(
2057
+ Expression::AssignmentExpression(Box::new(node)),
2058
+ )
2059
+ }
2060
+ NodeKind::AwaitExpression => {
2061
+ let node = AwaitExpression::convert(cx, node);
2062
+ ExpressionOrSpread::Expression(
2063
+ Expression::AwaitExpression(Box::new(node)),
2064
+ )
2065
+ }
2066
+ NodeKind::BinaryExpression => {
2067
+ let node = BinaryExpression::convert(cx, node);
2068
+ ExpressionOrSpread::Expression(
2069
+ Expression::BinaryExpression(Box::new(node)),
2070
+ )
2071
+ }
2072
+ NodeKind::BooleanLiteral => {
2073
+ let node = BooleanLiteral::convert(cx, node);
2074
+ ExpressionOrSpread::Expression(
2075
+ Expression::BooleanLiteral(Box::new(node)),
2076
+ )
2077
+ }
2078
+ NodeKind::CallExpression => {
2079
+ let node = CallExpression::convert(cx, node);
2080
+ ExpressionOrSpread::Expression(
2081
+ Expression::CallExpression(Box::new(node)),
2082
+ )
2083
+ }
2084
+ NodeKind::ClassExpression => {
2085
+ let node = ClassExpression::convert(cx, node);
2086
+ ExpressionOrSpread::Expression(
2087
+ Expression::ClassExpression(Box::new(node)),
2088
+ )
2089
+ }
2090
+ NodeKind::ConditionalExpression => {
2091
+ let node = ConditionalExpression::convert(cx, node);
2092
+ ExpressionOrSpread::Expression(
2093
+ Expression::ConditionalExpression(Box::new(node)),
2094
+ )
2095
+ }
2096
+ NodeKind::FunctionExpression => {
2097
+ let node = FunctionExpression::convert(cx, node);
2098
+ ExpressionOrSpread::Expression(
2099
+ Expression::FunctionExpression(Box::new(node)),
2100
+ )
2101
+ }
2102
+ NodeKind::Identifier => {
2103
+ let node = Identifier::convert(cx, node);
2104
+ ExpressionOrSpread::Expression(Expression::Identifier(Box::new(node)))
2105
+ }
2106
+ NodeKind::ImportExpression => {
2107
+ let node = ImportExpression::convert(cx, node);
2108
+ ExpressionOrSpread::Expression(
2109
+ Expression::ImportExpression(Box::new(node)),
2110
+ )
2111
+ }
2112
+ NodeKind::JSXElement => {
2113
+ let node = JSXElement::convert(cx, node);
2114
+ ExpressionOrSpread::Expression(Expression::JSXElement(Box::new(node)))
2115
+ }
2116
+ NodeKind::LogicalExpression => {
2117
+ let node = LogicalExpression::convert(cx, node);
2118
+ ExpressionOrSpread::Expression(
2119
+ Expression::LogicalExpression(Box::new(node)),
2120
+ )
2121
+ }
2122
+ NodeKind::MemberExpression => {
2123
+ let node = MemberExpression::convert(cx, node);
2124
+ ExpressionOrSpread::Expression(
2125
+ Expression::MemberExpression(Box::new(node)),
2126
+ )
2127
+ }
2128
+ NodeKind::MetaProperty => {
2129
+ let node = MetaProperty::convert(cx, node);
2130
+ ExpressionOrSpread::Expression(Expression::MetaProperty(Box::new(node)))
2131
+ }
2132
+ NodeKind::NewExpression => {
2133
+ let node = NewExpression::convert(cx, node);
2134
+ ExpressionOrSpread::Expression(Expression::NewExpression(Box::new(node)))
2135
+ }
2136
+ NodeKind::NullLiteral => {
2137
+ let node = NullLiteral::convert(cx, node);
2138
+ ExpressionOrSpread::Expression(Expression::NullLiteral(Box::new(node)))
2139
+ }
2140
+ NodeKind::NumericLiteral => {
2141
+ let node = NumericLiteral::convert(cx, node);
2142
+ ExpressionOrSpread::Expression(
2143
+ Expression::NumericLiteral(Box::new(node)),
2144
+ )
2145
+ }
2146
+ NodeKind::ObjectExpression => {
2147
+ let node = ObjectExpression::convert(cx, node);
2148
+ ExpressionOrSpread::Expression(
2149
+ Expression::ObjectExpression(Box::new(node)),
2150
+ )
2151
+ }
2152
+ NodeKind::OptionalCallExpression => {
2153
+ let node = OptionalCallExpression::convert(cx, node);
2154
+ ExpressionOrSpread::Expression(
2155
+ Expression::OptionalCallExpression(Box::new(node)),
2156
+ )
2157
+ }
2158
+ NodeKind::OptionalMemberExpression => {
2159
+ let node = OptionalMemberExpression::convert(cx, node);
2160
+ ExpressionOrSpread::Expression(
2161
+ Expression::OptionalMemberExpression(Box::new(node)),
2162
+ )
2163
+ }
2164
+ NodeKind::SequenceExpression => {
2165
+ let node = SequenceExpression::convert(cx, node);
2166
+ ExpressionOrSpread::Expression(
2167
+ Expression::SequenceExpression(Box::new(node)),
2168
+ )
2169
+ }
2170
+ NodeKind::StringLiteral => {
2171
+ let node = StringLiteral::convert(cx, node);
2172
+ ExpressionOrSpread::Expression(Expression::StringLiteral(Box::new(node)))
2173
+ }
2174
+ NodeKind::TaggedTemplateExpression => {
2175
+ let node = TaggedTemplateExpression::convert(cx, node);
2176
+ ExpressionOrSpread::Expression(
2177
+ Expression::TaggedTemplateExpression(Box::new(node)),
2178
+ )
2179
+ }
2180
+ NodeKind::TemplateLiteral => {
2181
+ let node = TemplateLiteral::convert(cx, node);
2182
+ ExpressionOrSpread::Expression(
2183
+ Expression::TemplateLiteral(Box::new(node)),
2184
+ )
2185
+ }
2186
+ NodeKind::ThisExpression => {
2187
+ let node = ThisExpression::convert(cx, node);
2188
+ ExpressionOrSpread::Expression(
2189
+ Expression::ThisExpression(Box::new(node)),
2190
+ )
2191
+ }
2192
+ NodeKind::UnaryExpression => {
2193
+ let node = UnaryExpression::convert(cx, node);
2194
+ ExpressionOrSpread::Expression(
2195
+ Expression::UnaryExpression(Box::new(node)),
2196
+ )
2197
+ }
2198
+ NodeKind::UpdateExpression => {
2199
+ let node = UpdateExpression::convert(cx, node);
2200
+ ExpressionOrSpread::Expression(
2201
+ Expression::UpdateExpression(Box::new(node)),
2202
+ )
2203
+ }
2204
+ NodeKind::YieldExpression => {
2205
+ let node = YieldExpression::convert(cx, node);
2206
+ ExpressionOrSpread::Expression(
2207
+ Expression::YieldExpression(Box::new(node)),
2208
+ )
2209
+ }
2210
+ NodeKind::SpreadElement => {
2211
+ let node = SpreadElement::convert(cx, node);
2212
+ ExpressionOrSpread::SpreadElement(Box::new(node))
2213
+ }
2214
+ _ => panic!("Unexpected node"),
2215
+ }
2216
+ }
2217
+}
2218
+impl FromHermes for FunctionBody {
2219
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2220
+ let node_ref = node.as_ref();
2221
+ match node_ref.kind {
2222
+ NodeKind::BlockStatement => {
2223
+ let node = BlockStatement::convert(cx, node);
2224
+ FunctionBody::BlockStatement(Box::new(node))
2225
+ }
2226
+ NodeKind::ArrayExpression => {
2227
+ let node = ArrayExpression::convert(cx, node);
2228
+ FunctionBody::Expression(Expression::ArrayExpression(Box::new(node)))
2229
+ }
2230
+ NodeKind::ArrowFunctionExpression => {
2231
+ let node = ArrowFunctionExpression::convert(cx, node);
2232
+ FunctionBody::Expression(
2233
+ Expression::ArrowFunctionExpression(Box::new(node)),
2234
+ )
2235
+ }
2236
+ NodeKind::AssignmentExpression => {
2237
+ let node = AssignmentExpression::convert(cx, node);
2238
+ FunctionBody::Expression(
2239
+ Expression::AssignmentExpression(Box::new(node)),
2240
+ )
2241
+ }
2242
+ NodeKind::AwaitExpression => {
2243
+ let node = AwaitExpression::convert(cx, node);
2244
+ FunctionBody::Expression(Expression::AwaitExpression(Box::new(node)))
2245
+ }
2246
+ NodeKind::BinaryExpression => {
2247
+ let node = BinaryExpression::convert(cx, node);
2248
+ FunctionBody::Expression(Expression::BinaryExpression(Box::new(node)))
2249
+ }
2250
+ NodeKind::BooleanLiteral => {
2251
+ let node = BooleanLiteral::convert(cx, node);
2252
+ FunctionBody::Expression(Expression::BooleanLiteral(Box::new(node)))
2253
+ }
2254
+ NodeKind::CallExpression => {
2255
+ let node = CallExpression::convert(cx, node);
2256
+ FunctionBody::Expression(Expression::CallExpression(Box::new(node)))
2257
+ }
2258
+ NodeKind::ClassExpression => {
2259
+ let node = ClassExpression::convert(cx, node);
2260
+ FunctionBody::Expression(Expression::ClassExpression(Box::new(node)))
2261
+ }
2262
+ NodeKind::ConditionalExpression => {
2263
+ let node = ConditionalExpression::convert(cx, node);
2264
+ FunctionBody::Expression(
2265
+ Expression::ConditionalExpression(Box::new(node)),
2266
+ )
2267
+ }
2268
+ NodeKind::FunctionExpression => {
2269
+ let node = FunctionExpression::convert(cx, node);
2270
+ FunctionBody::Expression(Expression::FunctionExpression(Box::new(node)))
2271
+ }
2272
+ NodeKind::Identifier => {
2273
+ let node = Identifier::convert(cx, node);
2274
+ FunctionBody::Expression(Expression::Identifier(Box::new(node)))
2275
+ }
2276
+ NodeKind::ImportExpression => {
2277
+ let node = ImportExpression::convert(cx, node);
2278
+ FunctionBody::Expression(Expression::ImportExpression(Box::new(node)))
2279
+ }
2280
+ NodeKind::JSXElement => {
2281
+ let node = JSXElement::convert(cx, node);
2282
+ FunctionBody::Expression(Expression::JSXElement(Box::new(node)))
2283
+ }
2284
+ NodeKind::LogicalExpression => {
2285
+ let node = LogicalExpression::convert(cx, node);
2286
+ FunctionBody::Expression(Expression::LogicalExpression(Box::new(node)))
2287
+ }
2288
+ NodeKind::MemberExpression => {
2289
+ let node = MemberExpression::convert(cx, node);
2290
+ FunctionBody::Expression(Expression::MemberExpression(Box::new(node)))
2291
+ }
2292
+ NodeKind::MetaProperty => {
2293
+ let node = MetaProperty::convert(cx, node);
2294
+ FunctionBody::Expression(Expression::MetaProperty(Box::new(node)))
2295
+ }
2296
+ NodeKind::NewExpression => {
2297
+ let node = NewExpression::convert(cx, node);
2298
+ FunctionBody::Expression(Expression::NewExpression(Box::new(node)))
2299
+ }
2300
+ NodeKind::NullLiteral => {
2301
+ let node = NullLiteral::convert(cx, node);
2302
+ FunctionBody::Expression(Expression::NullLiteral(Box::new(node)))
2303
+ }
2304
+ NodeKind::NumericLiteral => {
2305
+ let node = NumericLiteral::convert(cx, node);
2306
+ FunctionBody::Expression(Expression::NumericLiteral(Box::new(node)))
2307
+ }
2308
+ NodeKind::ObjectExpression => {
2309
+ let node = ObjectExpression::convert(cx, node);
2310
+ FunctionBody::Expression(Expression::ObjectExpression(Box::new(node)))
2311
+ }
2312
+ NodeKind::OptionalCallExpression => {
2313
+ let node = OptionalCallExpression::convert(cx, node);
2314
+ FunctionBody::Expression(
2315
+ Expression::OptionalCallExpression(Box::new(node)),
2316
+ )
2317
+ }
2318
+ NodeKind::OptionalMemberExpression => {
2319
+ let node = OptionalMemberExpression::convert(cx, node);
2320
+ FunctionBody::Expression(
2321
+ Expression::OptionalMemberExpression(Box::new(node)),
2322
+ )
2323
+ }
2324
+ NodeKind::SequenceExpression => {
2325
+ let node = SequenceExpression::convert(cx, node);
2326
+ FunctionBody::Expression(Expression::SequenceExpression(Box::new(node)))
2327
+ }
2328
+ NodeKind::StringLiteral => {
2329
+ let node = StringLiteral::convert(cx, node);
2330
+ FunctionBody::Expression(Expression::StringLiteral(Box::new(node)))
2331
+ }
2332
+ NodeKind::TaggedTemplateExpression => {
2333
+ let node = TaggedTemplateExpression::convert(cx, node);
2334
+ FunctionBody::Expression(
2335
+ Expression::TaggedTemplateExpression(Box::new(node)),
2336
+ )
2337
+ }
2338
+ NodeKind::TemplateLiteral => {
2339
+ let node = TemplateLiteral::convert(cx, node);
2340
+ FunctionBody::Expression(Expression::TemplateLiteral(Box::new(node)))
2341
+ }
2342
+ NodeKind::ThisExpression => {
2343
+ let node = ThisExpression::convert(cx, node);
2344
+ FunctionBody::Expression(Expression::ThisExpression(Box::new(node)))
2345
+ }
2346
+ NodeKind::UnaryExpression => {
2347
+ let node = UnaryExpression::convert(cx, node);
2348
+ FunctionBody::Expression(Expression::UnaryExpression(Box::new(node)))
2349
+ }
2350
+ NodeKind::UpdateExpression => {
2351
+ let node = UpdateExpression::convert(cx, node);
2352
+ FunctionBody::Expression(Expression::UpdateExpression(Box::new(node)))
2353
+ }
2354
+ NodeKind::YieldExpression => {
2355
+ let node = YieldExpression::convert(cx, node);
2356
+ FunctionBody::Expression(Expression::YieldExpression(Box::new(node)))
2357
+ }
2358
+ _ => panic!("Unexpected node"),
2359
+ }
2360
+ }
2361
+}
2362
+impl FromHermes for Pattern {
2363
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2364
+ let node_ref = node.as_ref();
2365
+ match node_ref.kind {
2366
+ NodeKind::Identifier => {
2367
+ let node = Identifier::convert(cx, node);
2368
+ Pattern::Identifier(Box::new(node))
2369
+ }
2370
+ NodeKind::ArrayPattern => {
2371
+ let node = ArrayPattern::convert(cx, node);
2372
+ Pattern::ArrayPattern(Box::new(node))
2373
+ }
2374
+ NodeKind::ObjectPattern => {
2375
+ let node = ObjectPattern::convert(cx, node);
2376
+ Pattern::ObjectPattern(Box::new(node))
2377
+ }
2378
+ NodeKind::RestElement => {
2379
+ let node = RestElement::convert(cx, node);
2380
+ Pattern::RestElement(Box::new(node))
2381
+ }
2382
+ NodeKind::AssignmentPattern => {
2383
+ let node = AssignmentPattern::convert(cx, node);
2384
+ Pattern::AssignmentPattern(Box::new(node))
2385
+ }
2386
+ _ => panic!("Unexpected node"),
2387
+ }
2388
+ }
2389
+}
2390
+impl FromHermes for ForInit {
2391
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2392
+ let node_ref = node.as_ref();
2393
+ match node_ref.kind {
2394
+ NodeKind::ArrayExpression => {
2395
+ let node = ArrayExpression::convert(cx, node);
2396
+ ForInit::Expression(Expression::ArrayExpression(Box::new(node)))
2397
+ }
2398
+ NodeKind::ArrowFunctionExpression => {
2399
+ let node = ArrowFunctionExpression::convert(cx, node);
2400
+ ForInit::Expression(Expression::ArrowFunctionExpression(Box::new(node)))
2401
+ }
2402
+ NodeKind::AssignmentExpression => {
2403
+ let node = AssignmentExpression::convert(cx, node);
2404
+ ForInit::Expression(Expression::AssignmentExpression(Box::new(node)))
2405
+ }
2406
+ NodeKind::AwaitExpression => {
2407
+ let node = AwaitExpression::convert(cx, node);
2408
+ ForInit::Expression(Expression::AwaitExpression(Box::new(node)))
2409
+ }
2410
+ NodeKind::BinaryExpression => {
2411
+ let node = BinaryExpression::convert(cx, node);
2412
+ ForInit::Expression(Expression::BinaryExpression(Box::new(node)))
2413
+ }
2414
+ NodeKind::BooleanLiteral => {
2415
+ let node = BooleanLiteral::convert(cx, node);
2416
+ ForInit::Expression(Expression::BooleanLiteral(Box::new(node)))
2417
+ }
2418
+ NodeKind::CallExpression => {
2419
+ let node = CallExpression::convert(cx, node);
2420
+ ForInit::Expression(Expression::CallExpression(Box::new(node)))
2421
+ }
2422
+ NodeKind::ClassExpression => {
2423
+ let node = ClassExpression::convert(cx, node);
2424
+ ForInit::Expression(Expression::ClassExpression(Box::new(node)))
2425
+ }
2426
+ NodeKind::ConditionalExpression => {
2427
+ let node = ConditionalExpression::convert(cx, node);
2428
+ ForInit::Expression(Expression::ConditionalExpression(Box::new(node)))
2429
+ }
2430
+ NodeKind::FunctionExpression => {
2431
+ let node = FunctionExpression::convert(cx, node);
2432
+ ForInit::Expression(Expression::FunctionExpression(Box::new(node)))
2433
+ }
2434
+ NodeKind::Identifier => {
2435
+ let node = Identifier::convert(cx, node);
2436
+ ForInit::Expression(Expression::Identifier(Box::new(node)))
2437
+ }
2438
+ NodeKind::ImportExpression => {
2439
+ let node = ImportExpression::convert(cx, node);
2440
+ ForInit::Expression(Expression::ImportExpression(Box::new(node)))
2441
+ }
2442
+ NodeKind::JSXElement => {
2443
+ let node = JSXElement::convert(cx, node);
2444
+ ForInit::Expression(Expression::JSXElement(Box::new(node)))
2445
+ }
2446
+ NodeKind::LogicalExpression => {
2447
+ let node = LogicalExpression::convert(cx, node);
2448
+ ForInit::Expression(Expression::LogicalExpression(Box::new(node)))
2449
+ }
2450
+ NodeKind::MemberExpression => {
2451
+ let node = MemberExpression::convert(cx, node);
2452
+ ForInit::Expression(Expression::MemberExpression(Box::new(node)))
2453
+ }
2454
+ NodeKind::MetaProperty => {
2455
+ let node = MetaProperty::convert(cx, node);
2456
+ ForInit::Expression(Expression::MetaProperty(Box::new(node)))
2457
+ }
2458
+ NodeKind::NewExpression => {
2459
+ let node = NewExpression::convert(cx, node);
2460
+ ForInit::Expression(Expression::NewExpression(Box::new(node)))
2461
+ }
2462
+ NodeKind::NullLiteral => {
2463
+ let node = NullLiteral::convert(cx, node);
2464
+ ForInit::Expression(Expression::NullLiteral(Box::new(node)))
2465
+ }
2466
+ NodeKind::NumericLiteral => {
2467
+ let node = NumericLiteral::convert(cx, node);
2468
+ ForInit::Expression(Expression::NumericLiteral(Box::new(node)))
2469
+ }
2470
+ NodeKind::ObjectExpression => {
2471
+ let node = ObjectExpression::convert(cx, node);
2472
+ ForInit::Expression(Expression::ObjectExpression(Box::new(node)))
2473
+ }
2474
+ NodeKind::OptionalCallExpression => {
2475
+ let node = OptionalCallExpression::convert(cx, node);
2476
+ ForInit::Expression(Expression::OptionalCallExpression(Box::new(node)))
2477
+ }
2478
+ NodeKind::OptionalMemberExpression => {
2479
+ let node = OptionalMemberExpression::convert(cx, node);
2480
+ ForInit::Expression(Expression::OptionalMemberExpression(Box::new(node)))
2481
+ }
2482
+ NodeKind::SequenceExpression => {
2483
+ let node = SequenceExpression::convert(cx, node);
2484
+ ForInit::Expression(Expression::SequenceExpression(Box::new(node)))
2485
+ }
2486
+ NodeKind::StringLiteral => {
2487
+ let node = StringLiteral::convert(cx, node);
2488
+ ForInit::Expression(Expression::StringLiteral(Box::new(node)))
2489
+ }
2490
+ NodeKind::TaggedTemplateExpression => {
2491
+ let node = TaggedTemplateExpression::convert(cx, node);
2492
+ ForInit::Expression(Expression::TaggedTemplateExpression(Box::new(node)))
2493
+ }
2494
+ NodeKind::TemplateLiteral => {
2495
+ let node = TemplateLiteral::convert(cx, node);
2496
+ ForInit::Expression(Expression::TemplateLiteral(Box::new(node)))
2497
+ }
2498
+ NodeKind::ThisExpression => {
2499
+ let node = ThisExpression::convert(cx, node);
2500
+ ForInit::Expression(Expression::ThisExpression(Box::new(node)))
2501
+ }
2502
+ NodeKind::UnaryExpression => {
2503
+ let node = UnaryExpression::convert(cx, node);
2504
+ ForInit::Expression(Expression::UnaryExpression(Box::new(node)))
2505
+ }
2506
+ NodeKind::UpdateExpression => {
2507
+ let node = UpdateExpression::convert(cx, node);
2508
+ ForInit::Expression(Expression::UpdateExpression(Box::new(node)))
2509
+ }
2510
+ NodeKind::YieldExpression => {
2511
+ let node = YieldExpression::convert(cx, node);
2512
+ ForInit::Expression(Expression::YieldExpression(Box::new(node)))
2513
+ }
2514
+ NodeKind::VariableDeclaration => {
2515
+ let node = VariableDeclaration::convert(cx, node);
2516
+ ForInit::VariableDeclaration(Box::new(node))
2517
+ }
2518
+ _ => panic!("Unexpected node"),
2519
+ }
2520
+ }
2521
+}
2522
+impl FromHermes for ForInInit {
2523
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2524
+ let node_ref = node.as_ref();
2525
+ match node_ref.kind {
2526
+ NodeKind::Identifier => {
2527
+ let node = Identifier::convert(cx, node);
2528
+ ForInInit::Pattern(Pattern::Identifier(Box::new(node)))
2529
+ }
2530
+ NodeKind::ArrayPattern => {
2531
+ let node = ArrayPattern::convert(cx, node);
2532
+ ForInInit::Pattern(Pattern::ArrayPattern(Box::new(node)))
2533
+ }
2534
+ NodeKind::ObjectPattern => {
2535
+ let node = ObjectPattern::convert(cx, node);
2536
+ ForInInit::Pattern(Pattern::ObjectPattern(Box::new(node)))
2537
+ }
2538
+ NodeKind::RestElement => {
2539
+ let node = RestElement::convert(cx, node);
2540
+ ForInInit::Pattern(Pattern::RestElement(Box::new(node)))
2541
+ }
2542
+ NodeKind::AssignmentPattern => {
2543
+ let node = AssignmentPattern::convert(cx, node);
2544
+ ForInInit::Pattern(Pattern::AssignmentPattern(Box::new(node)))
2545
+ }
2546
+ NodeKind::VariableDeclaration => {
2547
+ let node = VariableDeclaration::convert(cx, node);
2548
+ ForInInit::VariableDeclaration(Box::new(node))
2549
+ }
2550
+ _ => panic!("Unexpected node"),
2551
+ }
2552
+ }
2553
+}
2554
+impl FromHermes for PropertyOrSpreadElement {
2555
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2556
+ let node_ref = node.as_ref();
2557
+ match node_ref.kind {
2558
+ NodeKind::Property => {
2559
+ let node = Property::convert(cx, node);
2560
+ PropertyOrSpreadElement::Property(Box::new(node))
2561
+ }
2562
+ NodeKind::SpreadElement => {
2563
+ let node = SpreadElement::convert(cx, node);
2564
+ PropertyOrSpreadElement::SpreadElement(Box::new(node))
2565
+ }
2566
+ _ => panic!("Unexpected node"),
2567
+ }
2568
+ }
2569
+}
2570
+impl FromHermes for AssignmentPropertyOrRestElement {
2571
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2572
+ let node_ref = node.as_ref();
2573
+ match node_ref.kind {
2574
+ NodeKind::Property => {
2575
+ let node = AssignmentProperty::convert(cx, node);
2576
+ AssignmentPropertyOrRestElement::AssignmentProperty(Box::new(node))
2577
+ }
2578
+ NodeKind::RestElement => {
2579
+ let node = RestElement::convert(cx, node);
2580
+ AssignmentPropertyOrRestElement::RestElement(Box::new(node))
2581
+ }
2582
+ _ => panic!("Unexpected node"),
2583
+ }
2584
+ }
2585
+}
2586
+impl FromHermes for PropertyKey {
2587
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2588
+ let node_ref = node.as_ref();
2589
+ match node_ref.kind {
2590
+ NodeKind::Identifier => {
2591
+ let node = Identifier::convert(cx, node);
2592
+ PropertyKey::Identifier(Box::new(node))
2593
+ }
2594
+ _ => panic!("Unexpected node"),
2595
+ }
2596
+ }
2597
+}
2598
+impl FromHermes for AssignmentTarget {
2599
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2600
+ let node_ref = node.as_ref();
2601
+ match node_ref.kind {
2602
+ NodeKind::ArrayExpression => {
2603
+ let node = ArrayExpression::convert(cx, node);
2604
+ AssignmentTarget::Expression(Expression::ArrayExpression(Box::new(node)))
2605
+ }
2606
+ NodeKind::ArrowFunctionExpression => {
2607
+ let node = ArrowFunctionExpression::convert(cx, node);
2608
+ AssignmentTarget::Expression(
2609
+ Expression::ArrowFunctionExpression(Box::new(node)),
2610
+ )
2611
+ }
2612
+ NodeKind::AssignmentExpression => {
2613
+ let node = AssignmentExpression::convert(cx, node);
2614
+ AssignmentTarget::Expression(
2615
+ Expression::AssignmentExpression(Box::new(node)),
2616
+ )
2617
+ }
2618
+ NodeKind::AwaitExpression => {
2619
+ let node = AwaitExpression::convert(cx, node);
2620
+ AssignmentTarget::Expression(Expression::AwaitExpression(Box::new(node)))
2621
+ }
2622
+ NodeKind::BinaryExpression => {
2623
+ let node = BinaryExpression::convert(cx, node);
2624
+ AssignmentTarget::Expression(
2625
+ Expression::BinaryExpression(Box::new(node)),
2626
+ )
2627
+ }
2628
+ NodeKind::BooleanLiteral => {
2629
+ let node = BooleanLiteral::convert(cx, node);
2630
+ AssignmentTarget::Expression(Expression::BooleanLiteral(Box::new(node)))
2631
+ }
2632
+ NodeKind::CallExpression => {
2633
+ let node = CallExpression::convert(cx, node);
2634
+ AssignmentTarget::Expression(Expression::CallExpression(Box::new(node)))
2635
+ }
2636
+ NodeKind::ClassExpression => {
2637
+ let node = ClassExpression::convert(cx, node);
2638
+ AssignmentTarget::Expression(Expression::ClassExpression(Box::new(node)))
2639
+ }
2640
+ NodeKind::ConditionalExpression => {
2641
+ let node = ConditionalExpression::convert(cx, node);
2642
+ AssignmentTarget::Expression(
2643
+ Expression::ConditionalExpression(Box::new(node)),
2644
+ )
2645
+ }
2646
+ NodeKind::FunctionExpression => {
2647
+ let node = FunctionExpression::convert(cx, node);
2648
+ AssignmentTarget::Expression(
2649
+ Expression::FunctionExpression(Box::new(node)),
2650
+ )
2651
+ }
2652
+ NodeKind::Identifier => {
2653
+ let node = Identifier::convert(cx, node);
2654
+ AssignmentTarget::Expression(Expression::Identifier(Box::new(node)))
2655
+ }
2656
+ NodeKind::ImportExpression => {
2657
+ let node = ImportExpression::convert(cx, node);
2658
+ AssignmentTarget::Expression(
2659
+ Expression::ImportExpression(Box::new(node)),
2660
+ )
2661
+ }
2662
+ NodeKind::JSXElement => {
2663
+ let node = JSXElement::convert(cx, node);
2664
+ AssignmentTarget::Expression(Expression::JSXElement(Box::new(node)))
2665
+ }
2666
+ NodeKind::LogicalExpression => {
2667
+ let node = LogicalExpression::convert(cx, node);
2668
+ AssignmentTarget::Expression(
2669
+ Expression::LogicalExpression(Box::new(node)),
2670
+ )
2671
+ }
2672
+ NodeKind::MemberExpression => {
2673
+ let node = MemberExpression::convert(cx, node);
2674
+ AssignmentTarget::Expression(
2675
+ Expression::MemberExpression(Box::new(node)),
2676
+ )
2677
+ }
2678
+ NodeKind::MetaProperty => {
2679
+ let node = MetaProperty::convert(cx, node);
2680
+ AssignmentTarget::Expression(Expression::MetaProperty(Box::new(node)))
2681
+ }
2682
+ NodeKind::NewExpression => {
2683
+ let node = NewExpression::convert(cx, node);
2684
+ AssignmentTarget::Expression(Expression::NewExpression(Box::new(node)))
2685
+ }
2686
+ NodeKind::NullLiteral => {
2687
+ let node = NullLiteral::convert(cx, node);
2688
+ AssignmentTarget::Expression(Expression::NullLiteral(Box::new(node)))
2689
+ }
2690
+ NodeKind::NumericLiteral => {
2691
+ let node = NumericLiteral::convert(cx, node);
2692
+ AssignmentTarget::Expression(Expression::NumericLiteral(Box::new(node)))
2693
+ }
2694
+ NodeKind::ObjectExpression => {
2695
+ let node = ObjectExpression::convert(cx, node);
2696
+ AssignmentTarget::Expression(
2697
+ Expression::ObjectExpression(Box::new(node)),
2698
+ )
2699
+ }
2700
+ NodeKind::OptionalCallExpression => {
2701
+ let node = OptionalCallExpression::convert(cx, node);
2702
+ AssignmentTarget::Expression(
2703
+ Expression::OptionalCallExpression(Box::new(node)),
2704
+ )
2705
+ }
2706
+ NodeKind::OptionalMemberExpression => {
2707
+ let node = OptionalMemberExpression::convert(cx, node);
2708
+ AssignmentTarget::Expression(
2709
+ Expression::OptionalMemberExpression(Box::new(node)),
2710
+ )
2711
+ }
2712
+ NodeKind::SequenceExpression => {
2713
+ let node = SequenceExpression::convert(cx, node);
2714
+ AssignmentTarget::Expression(
2715
+ Expression::SequenceExpression(Box::new(node)),
2716
+ )
2717
+ }
2718
+ NodeKind::StringLiteral => {
2719
+ let node = StringLiteral::convert(cx, node);
2720
+ AssignmentTarget::Expression(Expression::StringLiteral(Box::new(node)))
2721
+ }
2722
+ NodeKind::TaggedTemplateExpression => {
2723
+ let node = TaggedTemplateExpression::convert(cx, node);
2724
+ AssignmentTarget::Expression(
2725
+ Expression::TaggedTemplateExpression(Box::new(node)),
2726
+ )
2727
+ }
2728
+ NodeKind::TemplateLiteral => {
2729
+ let node = TemplateLiteral::convert(cx, node);
2730
+ AssignmentTarget::Expression(Expression::TemplateLiteral(Box::new(node)))
2731
+ }
2732
+ NodeKind::ThisExpression => {
2733
+ let node = ThisExpression::convert(cx, node);
2734
+ AssignmentTarget::Expression(Expression::ThisExpression(Box::new(node)))
2735
+ }
2736
+ NodeKind::UnaryExpression => {
2737
+ let node = UnaryExpression::convert(cx, node);
2738
+ AssignmentTarget::Expression(Expression::UnaryExpression(Box::new(node)))
2739
+ }
2740
+ NodeKind::UpdateExpression => {
2741
+ let node = UpdateExpression::convert(cx, node);
2742
+ AssignmentTarget::Expression(
2743
+ Expression::UpdateExpression(Box::new(node)),
2744
+ )
2745
+ }
2746
+ NodeKind::YieldExpression => {
2747
+ let node = YieldExpression::convert(cx, node);
2748
+ AssignmentTarget::Expression(Expression::YieldExpression(Box::new(node)))
2749
+ }
2750
+ NodeKind::ArrayPattern => {
2751
+ let node = ArrayPattern::convert(cx, node);
2752
+ AssignmentTarget::Pattern(Pattern::ArrayPattern(Box::new(node)))
2753
+ }
2754
+ NodeKind::ObjectPattern => {
2755
+ let node = ObjectPattern::convert(cx, node);
2756
+ AssignmentTarget::Pattern(Pattern::ObjectPattern(Box::new(node)))
2757
+ }
2758
+ NodeKind::RestElement => {
2759
+ let node = RestElement::convert(cx, node);
2760
+ AssignmentTarget::Pattern(Pattern::RestElement(Box::new(node)))
2761
+ }
2762
+ NodeKind::AssignmentPattern => {
2763
+ let node = AssignmentPattern::convert(cx, node);
2764
+ AssignmentTarget::Pattern(Pattern::AssignmentPattern(Box::new(node)))
2765
+ }
2766
+ _ => panic!("Unexpected node"),
2767
+ }
2768
+ }
2769
+}
2770
+impl FromHermes for ChainElement {
2771
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2772
+ let node_ref = node.as_ref();
2773
+ match node_ref.kind {
2774
+ NodeKind::CallExpression => {
2775
+ let node = CallExpression::convert(cx, node);
2776
+ ChainElement::CallExpression(Box::new(node))
2777
+ }
2778
+ NodeKind::MemberExpression => {
2779
+ let node = MemberExpression::convert(cx, node);
2780
+ ChainElement::MemberExpression(Box::new(node))
2781
+ }
2782
+ _ => panic!("Unexpected node"),
2783
+ }
2784
+ }
2785
+}
2786
+impl FromHermes for JSXMemberExpressionOrIdentifier {
2787
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2788
+ let node_ref = node.as_ref();
2789
+ match node_ref.kind {
2790
+ NodeKind::JSXMemberExpression => {
2791
+ let node = JSXMemberExpression::convert(cx, node);
2792
+ JSXMemberExpressionOrIdentifier::JSXMemberExpression(Box::new(node))
2793
+ }
2794
+ NodeKind::JSXIdentifier => {
2795
+ let node = JSXIdentifier::convert(cx, node);
2796
+ JSXMemberExpressionOrIdentifier::JSXIdentifier(Box::new(node))
2797
+ }
2798
+ _ => panic!("Unexpected node"),
2799
+ }
2800
+ }
2801
+}
2802
+impl FromHermes for JSXExpressionOrEmpty {
2803
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2804
+ let node_ref = node.as_ref();
2805
+ match node_ref.kind {
2806
+ NodeKind::ArrayExpression => {
2807
+ let node = ArrayExpression::convert(cx, node);
2808
+ JSXExpressionOrEmpty::Expression(
2809
+ Expression::ArrayExpression(Box::new(node)),
2810
+ )
2811
+ }
2812
+ NodeKind::ArrowFunctionExpression => {
2813
+ let node = ArrowFunctionExpression::convert(cx, node);
2814
+ JSXExpressionOrEmpty::Expression(
2815
+ Expression::ArrowFunctionExpression(Box::new(node)),
2816
+ )
2817
+ }
2818
+ NodeKind::AssignmentExpression => {
2819
+ let node = AssignmentExpression::convert(cx, node);
2820
+ JSXExpressionOrEmpty::Expression(
2821
+ Expression::AssignmentExpression(Box::new(node)),
2822
+ )
2823
+ }
2824
+ NodeKind::AwaitExpression => {
2825
+ let node = AwaitExpression::convert(cx, node);
2826
+ JSXExpressionOrEmpty::Expression(
2827
+ Expression::AwaitExpression(Box::new(node)),
2828
+ )
2829
+ }
2830
+ NodeKind::BinaryExpression => {
2831
+ let node = BinaryExpression::convert(cx, node);
2832
+ JSXExpressionOrEmpty::Expression(
2833
+ Expression::BinaryExpression(Box::new(node)),
2834
+ )
2835
+ }
2836
+ NodeKind::BooleanLiteral => {
2837
+ let node = BooleanLiteral::convert(cx, node);
2838
+ JSXExpressionOrEmpty::Expression(
2839
+ Expression::BooleanLiteral(Box::new(node)),
2840
+ )
2841
+ }
2842
+ NodeKind::CallExpression => {
2843
+ let node = CallExpression::convert(cx, node);
2844
+ JSXExpressionOrEmpty::Expression(
2845
+ Expression::CallExpression(Box::new(node)),
2846
+ )
2847
+ }
2848
+ NodeKind::ClassExpression => {
2849
+ let node = ClassExpression::convert(cx, node);
2850
+ JSXExpressionOrEmpty::Expression(
2851
+ Expression::ClassExpression(Box::new(node)),
2852
+ )
2853
+ }
2854
+ NodeKind::ConditionalExpression => {
2855
+ let node = ConditionalExpression::convert(cx, node);
2856
+ JSXExpressionOrEmpty::Expression(
2857
+ Expression::ConditionalExpression(Box::new(node)),
2858
+ )
2859
+ }
2860
+ NodeKind::FunctionExpression => {
2861
+ let node = FunctionExpression::convert(cx, node);
2862
+ JSXExpressionOrEmpty::Expression(
2863
+ Expression::FunctionExpression(Box::new(node)),
2864
+ )
2865
+ }
2866
+ NodeKind::Identifier => {
2867
+ let node = Identifier::convert(cx, node);
2868
+ JSXExpressionOrEmpty::Expression(Expression::Identifier(Box::new(node)))
2869
+ }
2870
+ NodeKind::ImportExpression => {
2871
+ let node = ImportExpression::convert(cx, node);
2872
+ JSXExpressionOrEmpty::Expression(
2873
+ Expression::ImportExpression(Box::new(node)),
2874
+ )
2875
+ }
2876
+ NodeKind::JSXElement => {
2877
+ let node = JSXElement::convert(cx, node);
2878
+ JSXExpressionOrEmpty::Expression(Expression::JSXElement(Box::new(node)))
2879
+ }
2880
+ NodeKind::LogicalExpression => {
2881
+ let node = LogicalExpression::convert(cx, node);
2882
+ JSXExpressionOrEmpty::Expression(
2883
+ Expression::LogicalExpression(Box::new(node)),
2884
+ )
2885
+ }
2886
+ NodeKind::MemberExpression => {
2887
+ let node = MemberExpression::convert(cx, node);
2888
+ JSXExpressionOrEmpty::Expression(
2889
+ Expression::MemberExpression(Box::new(node)),
2890
+ )
2891
+ }
2892
+ NodeKind::MetaProperty => {
2893
+ let node = MetaProperty::convert(cx, node);
2894
+ JSXExpressionOrEmpty::Expression(
2895
+ Expression::MetaProperty(Box::new(node)),
2896
+ )
2897
+ }
2898
+ NodeKind::NewExpression => {
2899
+ let node = NewExpression::convert(cx, node);
2900
+ JSXExpressionOrEmpty::Expression(
2901
+ Expression::NewExpression(Box::new(node)),
2902
+ )
2903
+ }
2904
+ NodeKind::NullLiteral => {
2905
+ let node = NullLiteral::convert(cx, node);
2906
+ JSXExpressionOrEmpty::Expression(Expression::NullLiteral(Box::new(node)))
2907
+ }
2908
+ NodeKind::NumericLiteral => {
2909
+ let node = NumericLiteral::convert(cx, node);
2910
+ JSXExpressionOrEmpty::Expression(
2911
+ Expression::NumericLiteral(Box::new(node)),
2912
+ )
2913
+ }
2914
+ NodeKind::ObjectExpression => {
2915
+ let node = ObjectExpression::convert(cx, node);
2916
+ JSXExpressionOrEmpty::Expression(
2917
+ Expression::ObjectExpression(Box::new(node)),
2918
+ )
2919
+ }
2920
+ NodeKind::OptionalCallExpression => {
2921
+ let node = OptionalCallExpression::convert(cx, node);
2922
+ JSXExpressionOrEmpty::Expression(
2923
+ Expression::OptionalCallExpression(Box::new(node)),
2924
+ )
2925
+ }
2926
+ NodeKind::OptionalMemberExpression => {
2927
+ let node = OptionalMemberExpression::convert(cx, node);
2928
+ JSXExpressionOrEmpty::Expression(
2929
+ Expression::OptionalMemberExpression(Box::new(node)),
2930
+ )
2931
+ }
2932
+ NodeKind::SequenceExpression => {
2933
+ let node = SequenceExpression::convert(cx, node);
2934
+ JSXExpressionOrEmpty::Expression(
2935
+ Expression::SequenceExpression(Box::new(node)),
2936
+ )
2937
+ }
2938
+ NodeKind::StringLiteral => {
2939
+ let node = StringLiteral::convert(cx, node);
2940
+ JSXExpressionOrEmpty::Expression(
2941
+ Expression::StringLiteral(Box::new(node)),
2942
+ )
2943
+ }
2944
+ NodeKind::TaggedTemplateExpression => {
2945
+ let node = TaggedTemplateExpression::convert(cx, node);
2946
+ JSXExpressionOrEmpty::Expression(
2947
+ Expression::TaggedTemplateExpression(Box::new(node)),
2948
+ )
2949
+ }
2950
+ NodeKind::TemplateLiteral => {
2951
+ let node = TemplateLiteral::convert(cx, node);
2952
+ JSXExpressionOrEmpty::Expression(
2953
+ Expression::TemplateLiteral(Box::new(node)),
2954
+ )
2955
+ }
2956
+ NodeKind::ThisExpression => {
2957
+ let node = ThisExpression::convert(cx, node);
2958
+ JSXExpressionOrEmpty::Expression(
2959
+ Expression::ThisExpression(Box::new(node)),
2960
+ )
2961
+ }
2962
+ NodeKind::UnaryExpression => {
2963
+ let node = UnaryExpression::convert(cx, node);
2964
+ JSXExpressionOrEmpty::Expression(
2965
+ Expression::UnaryExpression(Box::new(node)),
2966
+ )
2967
+ }
2968
+ NodeKind::UpdateExpression => {
2969
+ let node = UpdateExpression::convert(cx, node);
2970
+ JSXExpressionOrEmpty::Expression(
2971
+ Expression::UpdateExpression(Box::new(node)),
2972
+ )
2973
+ }
2974
+ NodeKind::YieldExpression => {
2975
+ let node = YieldExpression::convert(cx, node);
2976
+ JSXExpressionOrEmpty::Expression(
2977
+ Expression::YieldExpression(Box::new(node)),
2978
+ )
2979
+ }
2980
+ NodeKind::JSXEmptyExpression => {
2981
+ let node = JSXEmptyExpression::convert(cx, node);
2982
+ JSXExpressionOrEmpty::JSXEmptyExpression(Box::new(node))
2983
+ }
2984
+ _ => panic!("Unexpected node"),
2985
+ }
2986
+ }
2987
+}
2988
+impl FromHermes for JSXAttributeOrSpread {
2989
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
2990
+ let node_ref = node.as_ref();
2991
+ match node_ref.kind {
2992
+ NodeKind::JSXAttribute => {
2993
+ let node = JSXAttribute::convert(cx, node);
2994
+ JSXAttributeOrSpread::JSXAttribute(Box::new(node))
2995
+ }
2996
+ NodeKind::JSXSpreadAttribute => {
2997
+ let node = JSXSpreadAttribute::convert(cx, node);
2998
+ JSXAttributeOrSpread::JSXSpreadAttribute(Box::new(node))
2999
+ }
3000
+ _ => panic!("Unexpected node"),
3001
+ }
3002
+ }
3003
+}
3004
+impl FromHermes for JSXAttributeValue {
3005
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
3006
+ let node_ref = node.as_ref();
3007
+ match node_ref.kind {
3008
+ NodeKind::JSXExpressionContainer => {
3009
+ let node = JSXExpressionContainer::convert(cx, node);
3010
+ JSXAttributeValue::JSXExpressionContainer(Box::new(node))
3011
+ }
3012
+ NodeKind::JSXElement => {
3013
+ let node = JSXElement::convert(cx, node);
3014
+ JSXAttributeValue::JSXElement(Box::new(node))
3015
+ }
3016
+ NodeKind::JSXFragment => {
3017
+ let node = JSXFragment::convert(cx, node);
3018
+ JSXAttributeValue::JSXFragment(Box::new(node))
3019
+ }
3020
+ _ => panic!("Unexpected node"),
3021
+ }
3022
+ }
3023
+}
3024
+impl FromHermes for JSXElementName {
3025
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
3026
+ let node_ref = node.as_ref();
3027
+ match node_ref.kind {
3028
+ NodeKind::JSXIdentifier => {
3029
+ let node = JSXIdentifier::convert(cx, node);
3030
+ JSXElementName::JSXIdentifier(Box::new(node))
3031
+ }
3032
+ NodeKind::JSXMemberExpression => {
3033
+ let node = JSXMemberExpression::convert(cx, node);
3034
+ JSXElementName::JSXMemberExpression(Box::new(node))
3035
+ }
3036
+ NodeKind::JSXNamespacedName => {
3037
+ let node = JSXNamespacedName::convert(cx, node);
3038
+ JSXElementName::JSXNamespacedName(Box::new(node))
3039
+ }
3040
+ _ => panic!("Unexpected node"),
3041
+ }
3042
+ }
3043
+}
3044
+impl FromHermes for JSXIdentifierOrNamespacedName {
3045
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
3046
+ let node_ref = node.as_ref();
3047
+ match node_ref.kind {
3048
+ NodeKind::JSXIdentifier => {
3049
+ let node = JSXIdentifier::convert(cx, node);
3050
+ JSXIdentifierOrNamespacedName::JSXIdentifier(Box::new(node))
3051
+ }
3052
+ NodeKind::JSXNamespacedName => {
3053
+ let node = JSXNamespacedName::convert(cx, node);
3054
+ JSXIdentifierOrNamespacedName::JSXNamespacedName(Box::new(node))
3055
+ }
3056
+ _ => panic!("Unexpected node"),
3057
+ }
3058
+ }
3059
+}
3060
+impl FromHermes for JSXChildItem {
3061
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
3062
+ let node_ref = node.as_ref();
3063
+ match node_ref.kind {
3064
+ NodeKind::JSXText => {
3065
+ let node = JSXText::convert(cx, node);
3066
+ JSXChildItem::JSXText(Box::new(node))
3067
+ }
3068
+ NodeKind::JSXExpressionContainer => {
3069
+ let node = JSXExpressionContainer::convert(cx, node);
3070
+ JSXChildItem::JSXExpressionContainer(Box::new(node))
3071
+ }
3072
+ NodeKind::JSXSpreadChild => {
3073
+ let node = JSXSpreadChild::convert(cx, node);
3074
+ JSXChildItem::JSXSpreadChild(Box::new(node))
3075
+ }
3076
+ NodeKind::JSXElement => {
3077
+ let node = JSXElement::convert(cx, node);
3078
+ JSXChildItem::JSXElement(Box::new(node))
3079
+ }
3080
+ NodeKind::JSXFragment => {
3081
+ let node = JSXFragment::convert(cx, node);
3082
+ JSXChildItem::JSXFragment(Box::new(node))
3083
+ }
3084
+ _ => panic!("Unexpected node"),
3085
+ }
3086
+ }
3087
+}
3088
+impl FromHermesLabel for VariableDeclarationKind {
3089
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3090
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3091
+ utf_str.parse().unwrap()
3092
+ }
3093
+}
3094
+impl FromHermesLabel for PropertyKind {
3095
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3096
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3097
+ utf_str.parse().unwrap()
3098
+ }
3099
+}
3100
+impl FromHermesLabel for UnaryOperator {
3101
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3102
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3103
+ utf_str.parse().unwrap()
3104
+ }
3105
+}
3106
+impl FromHermesLabel for UpdateOperator {
3107
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3108
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3109
+ utf_str.parse().unwrap()
3110
+ }
3111
+}
3112
+impl FromHermesLabel for BinaryOperator {
3113
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3114
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3115
+ utf_str.parse().unwrap()
3116
+ }
3117
+}
3118
+impl FromHermesLabel for AssignmentOperator {
3119
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3120
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3121
+ utf_str.parse().unwrap()
3122
+ }
3123
+}
3124
+impl FromHermesLabel for LogicalOperator {
3125
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3126
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3127
+ utf_str.parse().unwrap()
3128
+ }
3129
+}
3130
+impl FromHermesLabel for SourceType {
3131
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3132
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3133
+ utf_str.parse().unwrap()
3134
+ }
3135
+}
3136
+impl FromHermesLabel for MethodKind {
3137
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self {
3138
+ let utf_str = utf8_with_surrogates_to_string(label.as_slice()).unwrap();
3139
+ utf_str.parse().unwrap()
3140
+ }
3141
+}
compiler/forget/crates/forget_hermes_parser/src/generated_extension.rs
new
+288
@@ -0,0 +1,288 @@
1
+use forget_estree::{
2
+ ArrowFunctionExpression, AssignmentProperty, Class, ClassBody, ClassDeclaration,
3
+ ClassExpression, Expression, ExpressionOrSpread, Function, FunctionBody, FunctionDeclaration,
4
+ FunctionExpression, Identifier, Number, Pattern, SourceRange, TemplateElement,
5
+ TemplateElementValue,
6
+};
7
+use hermes::parser::{
8
+ hermes_get_ArrowFunctionExpression_async, hermes_get_ArrowFunctionExpression_body,
9
+ hermes_get_ArrowFunctionExpression_expression, hermes_get_ArrowFunctionExpression_id,
10
+ hermes_get_ArrowFunctionExpression_params, hermes_get_ClassDeclaration_body,
11
+ hermes_get_ClassDeclaration_id, hermes_get_ClassDeclaration_superClass,
12
+ hermes_get_ClassExpression_body, hermes_get_ClassExpression_id,
13
+ hermes_get_ClassExpression_superClass, hermes_get_FunctionDeclaration_async,
14
+ hermes_get_FunctionDeclaration_body, hermes_get_FunctionDeclaration_generator,
15
+ hermes_get_FunctionDeclaration_id, hermes_get_FunctionDeclaration_params,
16
+ hermes_get_FunctionExpression_async, hermes_get_FunctionExpression_body,
17
+ hermes_get_FunctionExpression_generator, hermes_get_FunctionExpression_id,
18
+ hermes_get_FunctionExpression_params, hermes_get_Property_key, hermes_get_Property_kind,
19
+ hermes_get_Property_method, hermes_get_Property_value, NodeKind, NodeLabel, NodeLabelOpt,
20
+ NodeListRef, NodePtr, NodePtrOpt, NodeString, NodeStringOpt, SMRange,
21
+};
22
+use hermes::utf::utf8_with_surrogates_to_string;
23
+
24
+pub struct Context;
25
+
26
+impl Context {
27
+ pub fn new() -> Self {
28
+ Self
29
+ }
30
+}
31
+
32
+pub trait FromHermes {
33
+ fn convert(cx: &mut Context, node: NodePtr) -> Self;
34
+}
35
+pub trait FromHermesLabel {
36
+ fn convert(cx: &mut Context, label: NodeLabel) -> Self;
37
+}
38
+
39
+pub fn convert_option<F, T>(node: NodePtrOpt, mut f: F) -> Option<T>
40
+where
41
+ F: FnMut(NodePtr) -> T,
42
+{
43
+ node.as_node_ptr().map(|node| f(node))
44
+}
45
+
46
+pub fn convert_vec<F, T>(node: NodeListRef, mut f: F) -> Vec<T>
47
+where
48
+ F: FnMut(NodePtr) -> T,
49
+{
50
+ node.iter().map(|node| f(NodePtr::new(node))).collect()
51
+}
52
+
53
+pub fn convert_vec_of_option<F, T>(node: NodeListRef, mut f: F) -> Vec<Option<T>>
54
+where
55
+ F: FnMut(NodePtr) -> T,
56
+{
57
+ node.iter()
58
+ .map(|node| {
59
+ let node = NodePtr::new(node);
60
+ let node_ref = node.as_ref();
61
+ match node_ref.kind {
62
+ NodeKind::Empty => None,
63
+ _ => Some(f(node)),
64
+ }
65
+ })
66
+ .collect()
67
+}
68
+
69
+pub fn convert_range(node: NodePtr) -> SourceRange {
70
+ let _range = node.as_ref().source_range;
71
+ todo!()
72
+}
73
+
74
+#[allow(dead_code)]
75
+pub fn convert_smrange(_range: SMRange) -> SourceRange {
76
+ todo!()
77
+}
78
+
79
+pub fn convert_string(_cx: &mut Context, label: NodeLabel) -> String {
80
+ utf8_with_surrogates_to_string(label.as_slice()).unwrap()
81
+}
82
+
83
+#[allow(dead_code)]
84
+pub fn convert_option_string(cx: &mut Context, label: NodeLabelOpt) -> Option<String> {
85
+ label.as_node_label().map(|label| convert_string(cx, label))
86
+}
87
+
88
+pub fn convert_string_value(_cx: &mut Context, label: NodeString) -> String {
89
+ utf8_with_surrogates_to_string(label.as_slice()).unwrap()
90
+}
91
+
92
+pub fn convert_option_string_value(_cx: &mut Context, label: NodeStringOpt) -> Option<String> {
93
+ label
94
+ .as_node_string()
95
+ .map(|label| utf8_with_surrogates_to_string(label.as_slice()).unwrap())
96
+}
97
+
98
+pub fn convert_number(value: f64) -> Number {
99
+ value.into()
100
+}
101
+
102
+pub fn convert_array_expression_elements(
103
+ cx: &mut Context,
104
+ node: NodeListRef,
105
+) -> Vec<Option<ExpressionOrSpread>> {
106
+ convert_vec_of_option(node, |node| ExpressionOrSpread::convert(cx, node))
107
+}
108
+
109
+impl FromHermes for TemplateElement {
110
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
111
+ let range = convert_range(node);
112
+ let tail = unsafe { hermes::parser::hermes_get_TemplateElement_tail(node) };
113
+ let value = TemplateElementValue {
114
+ cooked: convert_option_string_value(cx, unsafe {
115
+ hermes::parser::hermes_get_TemplateElement_cooked(node)
116
+ }),
117
+ raw: convert_string(cx, unsafe {
118
+ hermes::parser::hermes_get_TemplateElement_raw(node)
119
+ }),
120
+ };
121
+ Self {
122
+ tail,
123
+ value,
124
+ loc: None,
125
+ range: Some(range),
126
+ }
127
+ }
128
+}
129
+
130
+impl FromHermes for AssignmentProperty {
131
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
132
+ let key = FromHermes::convert(cx, unsafe { hermes_get_Property_key(node) });
133
+ let value = FromHermes::convert(cx, unsafe { hermes_get_Property_value(node) });
134
+ let kind = FromHermesLabel::convert(cx, unsafe { hermes_get_Property_kind(node) });
135
+ let method = unsafe { hermes_get_Property_method(node) };
136
+ let loc = None;
137
+ let range = convert_range(node);
138
+ AssignmentProperty {
139
+ key,
140
+ value,
141
+ kind,
142
+ method,
143
+ loc,
144
+ range: Some(range),
145
+ }
146
+ }
147
+}
148
+
149
+impl FromHermes for FunctionDeclaration {
150
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
151
+ let id = convert_option(unsafe { hermes_get_FunctionDeclaration_id(node) }, |node| {
152
+ Identifier::convert(cx, node)
153
+ });
154
+ let params = convert_vec(
155
+ unsafe { hermes_get_FunctionDeclaration_params(node) },
156
+ |node| Pattern::convert(cx, node),
157
+ );
158
+ let body = FunctionBody::convert(cx, unsafe { hermes_get_FunctionDeclaration_body(node) });
159
+ let is_generator = unsafe { hermes_get_FunctionDeclaration_generator(node) };
160
+ let is_async = unsafe { hermes_get_FunctionDeclaration_async(node) };
161
+ let loc = None;
162
+ let range = convert_range(node);
163
+ FunctionDeclaration {
164
+ function: Function {
165
+ id,
166
+ params,
167
+ body: Some(body),
168
+ is_generator,
169
+ is_async,
170
+ loc: loc.clone(),
171
+ range: Some(range),
172
+ },
173
+ loc,
174
+ range: Some(range),
175
+ }
176
+ }
177
+}
178
+
179
+impl FromHermes for FunctionExpression {
180
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
181
+ let id = convert_option(unsafe { hermes_get_FunctionExpression_id(node) }, |node| {
182
+ Identifier::convert(cx, node)
183
+ });
184
+ let params = convert_vec(
185
+ unsafe { hermes_get_FunctionExpression_params(node) },
186
+ |node| Pattern::convert(cx, node),
187
+ );
188
+ let body = FunctionBody::convert(cx, unsafe { hermes_get_FunctionExpression_body(node) });
189
+ let is_generator = unsafe { hermes_get_FunctionExpression_generator(node) };
190
+ let is_async = unsafe { hermes_get_FunctionExpression_async(node) };
191
+ let loc = None;
192
+ let range = convert_range(node);
193
+ FunctionExpression {
194
+ function: Function {
195
+ id,
196
+ params,
197
+ body: Some(body),
198
+ is_generator,
199
+ is_async,
200
+ loc: loc.clone(),
201
+ range: Some(range),
202
+ },
203
+ loc,
204
+ range: Some(range),
205
+ }
206
+ }
207
+}
208
+
209
+impl FromHermes for ArrowFunctionExpression {
210
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
211
+ let id = convert_option(
212
+ unsafe { hermes_get_ArrowFunctionExpression_id(node) },
213
+ |node| Identifier::convert(cx, node),
214
+ );
215
+ let params = convert_vec(
216
+ unsafe { hermes_get_ArrowFunctionExpression_params(node) },
217
+ |node| Pattern::convert(cx, node),
218
+ );
219
+ let body =
220
+ FunctionBody::convert(cx, unsafe { hermes_get_ArrowFunctionExpression_body(node) });
221
+ let is_generator = unsafe { hermes_get_FunctionExpression_generator(node) };
222
+ let is_async = unsafe { hermes_get_ArrowFunctionExpression_async(node) };
223
+ let is_expression = unsafe { hermes_get_ArrowFunctionExpression_expression(node) };
224
+ let loc = None;
225
+ let range = convert_range(node);
226
+ ArrowFunctionExpression {
227
+ function: Function {
228
+ id,
229
+ params,
230
+ body: Some(body),
231
+ is_generator,
232
+ is_async,
233
+ loc: loc.clone(),
234
+ range: Some(range),
235
+ },
236
+ is_expression,
237
+ loc,
238
+ range: Some(range),
239
+ }
240
+ }
241
+}
242
+
243
+impl FromHermes for ClassDeclaration {
244
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
245
+ let id = convert_option(unsafe { hermes_get_ClassDeclaration_id(node) }, |node| {
246
+ Identifier::convert(cx, node)
247
+ });
248
+ let super_class = convert_option(
249
+ unsafe { hermes_get_ClassDeclaration_superClass(node) },
250
+ |node| Expression::convert(cx, node),
251
+ );
252
+ let body = ClassBody::convert(cx, unsafe { hermes_get_ClassDeclaration_body(node) });
253
+ let loc = None;
254
+ let range = convert_range(node);
255
+ ClassDeclaration {
256
+ class: Class {
257
+ id,
258
+ super_class,
259
+ body,
260
+ },
261
+ loc,
262
+ range: Some(range),
263
+ }
264
+ }
265
+}
266
+impl FromHermes for ClassExpression {
267
+ fn convert(cx: &mut Context, node: NodePtr) -> Self {
268
+ let id = convert_option(unsafe { hermes_get_ClassExpression_id(node) }, |node| {
269
+ Identifier::convert(cx, node)
270
+ });
271
+ let super_class = convert_option(
272
+ unsafe { hermes_get_ClassExpression_superClass(node) },
273
+ |node| Expression::convert(cx, node),
274
+ );
275
+ let body = ClassBody::convert(cx, unsafe { hermes_get_ClassExpression_body(node) });
276
+ let loc = None;
277
+ let range = convert_range(node);
278
+ ClassExpression {
279
+ class: Class {
280
+ id,
281
+ super_class,
282
+ body,
283
+ },
284
+ loc,
285
+ range: Some(range),
286
+ }
287
+ }
288
+}
compiler/forget/crates/forget_hermes_parser/src/lib.rs
+17
-98
@@ -1,14 +1,14 @@
1
+mod generated;
2
+mod generated_extension;
3
+
4
use forget_diagnostics::Diagnostic;
2
-use hermes::parser::{
3
- hermes_get_BlockStatement_body, hermes_get_DeclareFunction_id,
4
- hermes_get_FunctionDeclaration_async, hermes_get_FunctionDeclaration_body,
5
- hermes_get_FunctionDeclaration_generator, hermes_get_Program_body, HermesParser, NodeKind,
6
- NodePtr, ParserDialect, ParserFlags,
7
-};
8
-use juno_support::source_manager::SourceRange;
5
+use forget_estree::Program;
6
+use generated_extension::{Context, FromHermes};
7
+use hermes::parser::{HermesParser, ParserDialect, ParserFlags};
8
+use hermes::utf::utf8_with_surrogates_to_string;
9
use juno_support::NullTerminatedBuf;
10
11
-pub fn parse(source: &str, file: &str) -> Result<forget_estree::Program, Vec<Diagnostic>> {
11
+pub fn parse(source: &str, _file: &str) -> Result<Program, Vec<Diagnostic>> {
12
let buf = NullTerminatedBuf::from_str_check(source);
13
let result = HermesParser::parse(
14
ParserFlags {
@@ -19,98 +19,17 @@ pub fn parse(source: &str, file: &str) -> Result<forget_estree::Program, Vec<Dia
19
},
20
&buf,
21
);
22
+ let mut cx = Context::new();
23
if result.has_errors() {
24
let error_messages = result.messages();
24
- return Err(todo!("construct diagnostics"));
25
- }
26
-
27
- Ok(unsafe { convert_program(result.root().unwrap()) })
28
-}
29
-
30
-unsafe fn convert_program(node: NodePtr) -> forget_estree::Program {
31
- let node_ref = node.as_ref();
32
- let body = hermes_get_Program_body(node);
33
- let body: Vec<_> = body
34
- .iter()
35
- .map(|node| convert_module_item(NodePtr::new(node)))
36
- .collect();
37
- forget_estree::Program {
38
- body,
39
- source_type: forget_estree::SourceType::Module,
40
- loc: None,
41
- range: None,
25
+ return Err(error_messages
26
+ .into_iter()
27
+ .map(|diag| {
28
+ let message = utf8_with_surrogates_to_string(diag.message.as_slice()).unwrap();
29
+ Diagnostic::invalid_syntax(message, None)
30
+ })
31
+ .collect());
32
}
43
-}
33
45
-unsafe fn convert_module_item(node: NodePtr) -> forget_estree::ModuleItem {
46
- let node_ref = node.as_ref();
47
- match node_ref.kind {
48
- NodeKind::FunctionDeclaration => {
49
- forget_estree::ModuleItem::Statement(forget_estree::Statement::FunctionDeclaration(
50
- Box::new(convert_function_declaration(node)),
51
- ))
52
- }
53
- _ => todo!(),
54
- }
55
-}
56
-
57
-unsafe fn convert_function_declaration(node: NodePtr) -> forget_estree::FunctionDeclaration {
58
- let id = None; //hermes_get_DeclareFunction_id(node);
59
- let params = Vec::new();
60
- let body = forget_estree::FunctionBody::BlockStatement(Box::new(convert_block_statement(
61
- hermes_get_FunctionDeclaration_body(node),
62
- )));
63
- let is_generator = hermes_get_FunctionDeclaration_generator(node);
64
- let is_async = hermes_get_FunctionDeclaration_async(node);
65
- forget_estree::FunctionDeclaration {
66
- function: forget_estree::Function {
67
- id,
68
- params,
69
- body: Some(body),
70
- is_generator,
71
- is_async,
72
- loc: None,
73
- range: None,
74
- },
75
- loc: None,
76
- range: None,
77
- }
78
-}
79
-
80
-unsafe fn convert_block_statement(node: NodePtr) -> forget_estree::BlockStatement {
81
- let body = hermes_get_BlockStatement_body(node);
82
- let body: Vec<_> = body
83
- .iter()
84
- .map(|node| convert_statement(NodePtr::new(node)))
85
- .collect();
86
- forget_estree::BlockStatement {
87
- body,
88
- loc: None,
89
- range: None,
90
- }
91
-}
92
-
93
-unsafe fn convert_statement(node: NodePtr) -> forget_estree::Statement {
94
- let node_ref = node.as_ref();
95
- match node_ref.kind {
96
- NodeKind::ReturnStatement => {
97
- forget_estree::Statement::ReturnStatement(Box::new(forget_estree::ReturnStatement {
98
- argument: None,
99
- loc: None,
100
- range: None,
101
- }))
102
- }
103
- _ => todo!(),
104
- }
105
-}
106
-
107
-#[cfg(test)]
108
-mod tests {
109
- use super::*;
110
-
111
- #[test]
112
- fn fixtures() {
113
- let res = parse("function foo() { return }", "hello.js");
114
- println!("{:#?}", res);
115
- }
34
+ Ok(FromHermes::convert(&mut cx, result.root().unwrap()))
35
}