1use crate::pat::Pat;
2use crate::{AssignOp, BinaryOp, LogicalOp, PropKind, UnaryOp, UpdateOp};
3use crate::{Class, Func, FuncArg, FuncBody, Ident};
4use std::borrow::Cow;
5#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(
8 all(feature = "serde", not(feature = "esprima")),
9 derive(Deserialize, Serialize)
10)]
11#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
12#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
13pub enum Expr<'a> {
14 Array(ArrayExpr<'a>),
16 ArrowFunc(ArrowFuncExpr<'a>),
24 ArrowParamPlaceHolder(Vec<FuncArg<'a>>, bool),
27 Assign(AssignExpr<'a>),
33 Await(Box<Expr<'a>>),
35 Binary(BinaryExpr<'a>),
37 Class(Class<'a>),
39 Call(CallExpr<'a>),
41 Conditional(ConditionalExpr<'a>),
43 Func(Func<'a>),
45 Ident(Ident<'a>),
47 Lit(Lit<'a>),
49 Logical(LogicalExpr<'a>),
55 Member(MemberExpr<'a>),
61 MetaProp(MetaProp<'a>),
63 New(NewExpr<'a>),
69 Obj(ObjExpr<'a>),
70 Sequence(SequenceExpr<'a>),
72 Spread(Box<Expr<'a>>),
74 Super,
76 TaggedTemplate(TaggedTemplateExpr<'a>),
78 This,
80 Unary(UnaryExpr<'a>),
86 Update(UpdateExpr<'a>),
92 Yield(YieldExpr<'a>),
94}
95
96impl<'a> Expr<'a> {
97 pub fn ident_from(s: &'a str) -> Self {
98 Expr::Ident(Ident::from(s))
99 }
100}
101
102pub type ArrayExpr<'a> = Vec<Option<Expr<'a>>>;
104pub type ObjExpr<'a> = Vec<ObjProp<'a>>;
106#[derive(PartialEq, Debug, Clone)]
108#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
109#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
110pub enum ObjProp<'a> {
111 Prop(Prop<'a>),
112 Spread(Expr<'a>),
113}
114
115#[derive(Debug, Clone, PartialEq)]
117#[cfg_attr(
118 all(feature = "serde", not(feature = "esprima")),
119 derive(Deserialize, Serialize)
120)]
121#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
122pub struct Prop<'a> {
123 pub key: PropKey<'a>,
124 pub value: PropValue<'a>,
125 pub kind: PropKind,
126 pub method: bool,
127 pub computed: bool,
128 pub short_hand: bool,
129 pub is_static: bool,
130}
131
132#[derive(PartialEq, Debug, Clone)]
134#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
135#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
136pub enum PropKey<'a> {
137 Lit(Lit<'a>),
138 Expr(Expr<'a>),
139 Pat(Pat<'a>),
140}
141
142#[derive(PartialEq, Debug, Clone)]
144#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
145#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
146pub enum PropValue<'a> {
147 Expr(Expr<'a>),
148 Pat(Pat<'a>),
149 None,
150}
151
152#[derive(PartialEq, Debug, Clone)]
154#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
155pub struct UnaryExpr<'a> {
156 pub operator: UnaryOp,
157 pub prefix: bool,
158 pub argument: Box<Expr<'a>>,
159}
160
161#[derive(PartialEq, Debug, Clone)]
163#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
164pub struct UpdateExpr<'a> {
165 pub operator: UpdateOp,
166 pub argument: Box<Expr<'a>>,
167 pub prefix: bool,
168}
169
170#[derive(PartialEq, Debug, Clone)]
172#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
173pub struct BinaryExpr<'a> {
174 pub operator: BinaryOp,
175 pub left: Box<Expr<'a>>,
176 pub right: Box<Expr<'a>>,
177}
178
179#[derive(PartialEq, Debug, Clone)]
181#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
182pub struct AssignExpr<'a> {
183 pub operator: AssignOp,
184 pub left: AssignLeft<'a>,
185 pub right: Box<Expr<'a>>,
186}
187
188#[derive(PartialEq, Debug, Clone)]
190#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
191#[cfg_attr(all(feature = "serde", feature = "esprima"), serde(untagged))]
192pub enum AssignLeft<'a> {
193 Pat(Pat<'a>),
194 Expr(Box<Expr<'a>>),
195}
196
197#[derive(PartialEq, Debug, Clone)]
203#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
204pub struct LogicalExpr<'a> {
205 pub operator: LogicalOp,
206 pub left: Box<Expr<'a>>,
207 pub right: Box<Expr<'a>>,
208}
209
210#[derive(PartialEq, Debug, Clone)]
216#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
217pub struct MemberExpr<'a> {
218 pub object: Box<Expr<'a>>,
219 pub property: Box<Expr<'a>>,
220 pub computed: bool,
221}
222
223#[derive(PartialEq, Debug, Clone)]
228#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
229pub struct ConditionalExpr<'a> {
230 pub test: Box<Expr<'a>>,
231 pub alternate: Box<Expr<'a>>,
232 pub consequent: Box<Expr<'a>>,
233}
234
235#[derive(PartialEq, Debug, Clone)]
240#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
241pub struct CallExpr<'a> {
242 pub callee: Box<Expr<'a>>,
243 pub arguments: Vec<Expr<'a>>,
244}
245
246#[derive(PartialEq, Debug, Clone)]
251#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
252pub struct NewExpr<'a> {
253 pub callee: Box<Expr<'a>>,
254 pub arguments: Vec<Expr<'a>>,
255}
256
257pub type SequenceExpr<'a> = Vec<Expr<'a>>;
259
260#[derive(PartialEq, Debug, Clone)]
268#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
269pub struct ArrowFuncExpr<'a> {
270 pub id: Option<Ident<'a>>,
271 pub params: Vec<FuncArg<'a>>,
272 pub body: ArrowFuncBody<'a>,
273 pub expression: bool,
274 pub generator: bool,
275 pub is_async: bool,
276}
277
278#[derive(PartialEq, Debug, Clone)]
280#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
281pub enum ArrowFuncBody<'a> {
282 FuncBody(FuncBody<'a>),
283 Expr(Box<Expr<'a>>),
284}
285
286#[derive(PartialEq, Debug, Clone)]
295#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
296pub struct YieldExpr<'a> {
297 pub argument: Option<Box<Expr<'a>>>,
298 pub delegate: bool,
299}
300
301#[derive(PartialEq, Debug, Clone)]
304#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
305pub struct TaggedTemplateExpr<'a> {
306 pub tag: Box<Expr<'a>>,
307 pub quasi: TemplateLit<'a>,
308}
309
310#[derive(Debug, Clone, PartialEq)]
315#[cfg_attr(
316 all(feature = "serde", not(feature = "esprima")),
317 derive(Deserialize, Serialize)
318)]
319#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
320pub struct TemplateLit<'a> {
321 pub quasis: Vec<TemplateElement<'a>>,
322 pub expressions: Vec<Expr<'a>>,
323}
324
325#[derive(Debug, Clone, PartialEq)]
327#[cfg_attr(
328 all(feature = "serde", not(feature = "esprima")),
329 derive(Deserialize, Serialize)
330)]
331#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
332pub struct TemplateElement<'a> {
333 pub tail: bool,
334 pub cooked: Cow<'a, str>,
336 pub raw: Cow<'a, str>,
338}
339
340impl<'a> TemplateElement<'a> {
341 pub fn from(tail: bool, cooked: &'a str, raw: &'a str) -> TemplateElement<'a> {
342 Self {
343 tail,
344 cooked: Cow::Borrowed(cooked),
345 raw: Cow::Borrowed(raw),
346 }
347 }
348}
349
350#[derive(PartialEq, Debug, Clone)]
361#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
362pub struct MetaProp<'a> {
363 pub meta: Ident<'a>,
364 pub property: Ident<'a>,
365}
366
367#[derive(Debug, Clone, PartialEq)]
369#[cfg_attr(
370 all(feature = "serde", not(feature = "esprima")),
371 derive(Deserialize, Serialize)
372)]
373#[cfg_attr(all(feature = "serde", feature = "esprima"), derive(Deserialize))]
374pub enum Lit<'a> {
375 Null,
377 String(StringLit<'a>),
380 Number(Cow<'a, str>),
389 Boolean(bool),
392 RegEx(RegEx<'a>),
394 Template(TemplateLit<'a>),
398}
399
400impl<'a> Lit<'a> {
401 pub fn number_from(s: &'a str) -> Self {
402 Lit::Number(Cow::Borrowed(s))
403 }
404 pub fn single_string_from(s: &'a str) -> Self {
405 Lit::String(StringLit::single_from(s))
406 }
407 pub fn double_string_from(s: &'a str) -> Self {
408 Lit::String(StringLit::double_from(s))
409 }
410}
411
412#[derive(PartialEq, Debug, Clone)]
413#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
414pub enum StringLit<'a> {
415 Double(Cow<'a, str>),
416 Single(Cow<'a, str>),
417}
418
419impl<'a> StringLit<'a> {
420 pub fn double_from(s: &'a str) -> StringLit<'a> {
421 StringLit::Double(Cow::Borrowed(s))
422 }
423 pub fn single_from(s: &'a str) -> StringLit<'a> {
424 StringLit::Single(Cow::Borrowed(s))
425 }
426 pub fn clone_inner(&self) -> Cow<'a, str> {
427 match self {
428 StringLit::Single(ref s) => s.clone(),
429 StringLit::Double(ref s) => s.clone(),
430 }
431 }
432 pub fn inner_matches(&self, o: &str) -> bool {
433 match self {
434 StringLit::Single(ref s) => s == o,
435 StringLit::Double(ref d) => d == o,
436 }
437 }
438}
439#[derive(PartialEq, Debug, Clone)]
441#[cfg_attr(all(feature = "serialization"), derive(Deserialize, Serialize))]
442#[cfg_attr(all(feature = "serialization"), serde(rename_all = "camelCase"))]
443pub struct RegEx<'a> {
444 pub pattern: Cow<'a, str>,
445 pub flags: Cow<'a, str>,
446}
447
448impl<'a> RegEx<'a> {
449 pub fn from(p: &'a str, f: &'a str) -> Self {
450 RegEx {
451 pattern: Cow::Borrowed(p),
452 flags: Cow::Borrowed(f),
453 }
454 }
455}