#![expect(
missing_docs, // TODO: document individual struct fields
clippy::enum_variant_names,
clippy::struct_field_names,
)]
use std::cell::Cell;
use oxc_allocator::{Box, CloneIn, Dummy, GetAddress, TakeIn, UnstableAddress, Vec};
use oxc_ast_macros::ast;
use oxc_estree::ESTree;
use oxc_span::{ContentEq, GetSpan, GetSpanMut, SourceType, Span};
use oxc_str::{Ident, Str};
use oxc_syntax::{
node::NodeId,
operator::{
AssignmentOperator, BinaryOperator, LogicalOperator, UnaryOperator, UpdateOperator,
},
reference::ReferenceId,
scope::ScopeId,
symbol::SymbolId,
};
use super::{macros::inherit_variants, *};
#[ast(visit)]
#[scope(
flags = ScopeFlags::Top,
strict_if = self.source_type.is_strict() || self.has_use_strict_directive(),
)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(field_order(body, source_type, hashbang, span), via = ProgramConverter)]
pub struct Program<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub source_type: SourceType,
#[content_eq(skip)]
#[estree(skip)]
pub source_text: &'a str,
#[content_eq(skip)]
#[estree(skip)]
pub comments: Vec<'a, Comment>,
pub hashbang: Option<Hashbang<'a>>,
#[estree(prepend_to = body)]
pub directives: Vec<'a, Directive<'a>>,
pub body: Vec<'a, Statement<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum Expression<'a> {
BooleanLiteral(Box<'a, BooleanLiteral>) = 0,
NullLiteral(Box<'a, NullLiteral>) = 1,
NumericLiteral(Box<'a, NumericLiteral<'a>>) = 2,
BigIntLiteral(Box<'a, BigIntLiteral<'a>>) = 3,
RegExpLiteral(Box<'a, RegExpLiteral<'a>>) = 4,
StringLiteral(Box<'a, StringLiteral<'a>>) = 5,
TemplateLiteral(Box<'a, TemplateLiteral<'a>>) = 6,
Identifier(Box<'a, IdentifierReference<'a>>) = 7,
MetaProperty(Box<'a, MetaProperty<'a>>) = 8,
Super(Box<'a, Super>) = 9,
ArrayExpression(Box<'a, ArrayExpression<'a>>) = 10,
ArrowFunctionExpression(Box<'a, ArrowFunctionExpression<'a>>) = 11,
AssignmentExpression(Box<'a, AssignmentExpression<'a>>) = 12,
AwaitExpression(Box<'a, AwaitExpression<'a>>) = 13,
BinaryExpression(Box<'a, BinaryExpression<'a>>) = 14,
CallExpression(Box<'a, CallExpression<'a>>) = 15,
ChainExpression(Box<'a, ChainExpression<'a>>) = 16,
ClassExpression(Box<'a, Class<'a>>) = 17,
ConditionalExpression(Box<'a, ConditionalExpression<'a>>) = 18,
#[visit(args(flags = ScopeFlags::Function))]
FunctionExpression(Box<'a, Function<'a>>) = 19,
ImportExpression(Box<'a, ImportExpression<'a>>) = 20,
LogicalExpression(Box<'a, LogicalExpression<'a>>) = 21,
NewExpression(Box<'a, NewExpression<'a>>) = 22,
ObjectExpression(Box<'a, ObjectExpression<'a>>) = 23,
ParenthesizedExpression(Box<'a, ParenthesizedExpression<'a>>) = 24,
SequenceExpression(Box<'a, SequenceExpression<'a>>) = 25,
TaggedTemplateExpression(Box<'a, TaggedTemplateExpression<'a>>) = 26,
ThisExpression(Box<'a, ThisExpression>) = 27,
UnaryExpression(Box<'a, UnaryExpression<'a>>) = 28,
UpdateExpression(Box<'a, UpdateExpression<'a>>) = 29,
YieldExpression(Box<'a, YieldExpression<'a>>) = 30,
PrivateInExpression(Box<'a, PrivateInExpression<'a>>) = 31,
JSXElement(Box<'a, JSXElement<'a>>) = 32,
JSXFragment(Box<'a, JSXFragment<'a>>) = 33,
TSAsExpression(Box<'a, TSAsExpression<'a>>) = 34,
TSSatisfiesExpression(Box<'a, TSSatisfiesExpression<'a>>) = 35,
TSTypeAssertion(Box<'a, TSTypeAssertion<'a>>) = 36,
TSNonNullExpression(Box<'a, TSNonNullExpression<'a>>) = 37,
TSInstantiationExpression(Box<'a, TSInstantiationExpression<'a>>) = 38,
V8IntrinsicExpression(Box<'a, V8IntrinsicExpression<'a>>) = 39,
@inherit MemberExpression
}
}
#[macro_export]
macro_rules! match_expression {
($ty:ident) => {
$ty::BooleanLiteral(_)
| $ty::NullLiteral(_)
| $ty::NumericLiteral(_)
| $ty::BigIntLiteral(_)
| $ty::RegExpLiteral(_)
| $ty::StringLiteral(_)
| $ty::TemplateLiteral(_)
| $ty::Identifier(_)
| $ty::MetaProperty(_)
| $ty::Super(_)
| $ty::ArrayExpression(_)
| $ty::ArrowFunctionExpression(_)
| $ty::AssignmentExpression(_)
| $ty::AwaitExpression(_)
| $ty::BinaryExpression(_)
| $ty::CallExpression(_)
| $ty::ChainExpression(_)
| $ty::ClassExpression(_)
| $ty::ConditionalExpression(_)
| $ty::FunctionExpression(_)
| $ty::ImportExpression(_)
| $ty::LogicalExpression(_)
| $ty::NewExpression(_)
| $ty::ObjectExpression(_)
| $ty::ParenthesizedExpression(_)
| $ty::SequenceExpression(_)
| $ty::TaggedTemplateExpression(_)
| $ty::ThisExpression(_)
| $ty::UnaryExpression(_)
| $ty::UpdateExpression(_)
| $ty::YieldExpression(_)
| $ty::PrivateInExpression(_)
| $ty::JSXElement(_)
| $ty::JSXFragment(_)
| $ty::TSAsExpression(_)
| $ty::TSSatisfiesExpression(_)
| $ty::TSTypeAssertion(_)
| $ty::TSNonNullExpression(_)
| $ty::TSInstantiationExpression(_)
| $ty::ComputedMemberExpression(_)
| $ty::StaticMemberExpression(_)
| $ty::PrivateFieldExpression(_)
| $ty::V8IntrinsicExpression(_)
};
}
pub use match_expression;
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Identifier",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, name, optional, typeAnnotation, span),
)]
pub struct IdentifierName<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: Ident<'a>,
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Identifier",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, name, optional, typeAnnotation, span),
)]
pub struct IdentifierReference<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: Ident<'a>,
pub reference_id: Cell<Option<ReferenceId>>,
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Identifier",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, name, optional, typeAnnotation, span),
)]
pub struct BindingIdentifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: Ident<'a>,
pub symbol_id: Cell<Option<SymbolId>>,
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Identifier",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, name, optional, typeAnnotation, span),
)]
pub struct LabelIdentifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: Ident<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ThisExpression {
pub node_id: Cell<NodeId>,
pub span: Span,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ArrayExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub elements: Vec<'a, ArrayExpressionElement<'a>>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
pub enum ArrayExpressionElement<'a> {
SpreadElement(Box<'a, SpreadElement<'a>>) = 64,
Elision(Elision) = 65,
@inherit Expression
}
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(via = Null)]
pub struct Elision {
pub node_id: Cell<NodeId>,
pub span: Span,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ObjectExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub properties: Vec<'a, ObjectPropertyKind<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ObjectPropertyKind<'a> {
ObjectProperty(Box<'a, ObjectProperty<'a>>) = 0,
SpreadProperty(Box<'a, SpreadElement<'a>>) = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "Property", add_fields(optional = TsFalse))]
pub struct ObjectProperty<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub kind: PropertyKind,
pub key: PropertyKey<'a>,
pub value: Expression<'a>,
pub method: bool,
pub shorthand: bool,
pub computed: bool,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum PropertyKey<'a> {
StaticIdentifier(Box<'a, IdentifierName<'a>>) = 64,
PrivateIdentifier(Box<'a, PrivateIdentifier<'a>>) = 65,
@inherit Expression
}
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
pub enum PropertyKind {
Init = 0,
Get = 1,
Set = 2,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct TemplateLiteral<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub quasis: Vec<'a, TemplateElement<'a>>,
pub expressions: Vec<'a, Expression<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct TaggedTemplateExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub tag: Expression<'a>,
#[ts]
pub type_arguments: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
pub quasi: TemplateLiteral<'a>,
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(via = TemplateElementConverter)]
pub struct TemplateElement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub value: TemplateElementValue<'a>,
pub tail: bool,
#[builder(default)]
#[estree(skip)]
pub lone_surrogates: bool,
}
#[ast]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, ContentEq, ESTree)]
#[estree(no_type)]
pub struct TemplateElementValue<'a> {
pub raw: Str<'a>,
pub cooked: Option<Str<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum MemberExpression<'a> {
ComputedMemberExpression(Box<'a, ComputedMemberExpression<'a>>) = 48,
StaticMemberExpression(Box<'a, StaticMemberExpression<'a>>) = 49,
PrivateFieldExpression(Box<'a, PrivateFieldExpression<'a>>) = 50,
}
#[macro_export]
macro_rules! match_member_expression {
($ty:ident) => {
$ty::ComputedMemberExpression(_)
| $ty::StaticMemberExpression(_)
| $ty::PrivateFieldExpression(_)
};
}
pub use match_member_expression;
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "MemberExpression", add_fields(computed = True))]
pub struct ComputedMemberExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub object: Expression<'a>,
#[estree(rename = "property")]
pub expression: Expression<'a>,
pub optional: bool, }
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "MemberExpression", add_fields(computed = False))]
pub struct StaticMemberExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub object: Expression<'a>,
pub property: IdentifierName<'a>,
pub optional: bool, }
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "MemberExpression", add_fields(computed = False))]
pub struct PrivateFieldExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub object: Expression<'a>,
#[estree(rename = "property")]
pub field: PrivateIdentifier<'a>,
pub optional: bool, }
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct CallExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub callee: Expression<'a>,
#[ts]
pub type_arguments: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
pub arguments: Vec<'a, Argument<'a>>,
pub optional: bool, #[builder(default)]
#[estree(skip)]
pub pure: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct NewExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub callee: Expression<'a>,
#[ts]
pub type_arguments: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
pub arguments: Vec<'a, Argument<'a>>,
#[builder(default)]
#[estree(skip)]
pub pure: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct MetaProperty<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub meta: IdentifierName<'a>,
pub property: IdentifierName<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct SpreadElement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub argument: Expression<'a>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum Argument<'a> {
SpreadElement(Box<'a, SpreadElement<'a>>) = 64,
@inherit Expression
}
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct UpdateExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub operator: UpdateOperator,
pub prefix: bool,
pub argument: SimpleAssignmentTarget<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(add_fields(prefix = True))]
pub struct UnaryExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub operator: UnaryOperator,
pub argument: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct BinaryExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub left: Expression<'a>,
pub operator: BinaryOperator,
pub right: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "BinaryExpression", add_fields(operator = In), field_order(left, operator, right, span))]
pub struct PrivateInExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub left: PrivateIdentifier<'a>,
pub right: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct LogicalExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub left: Expression<'a>,
pub operator: LogicalOperator,
pub right: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ConditionalExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub test: Expression<'a>,
pub consequent: Expression<'a>,
pub alternate: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct AssignmentExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub operator: AssignmentOperator,
pub left: AssignmentTarget<'a>,
pub right: Expression<'a>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum AssignmentTarget<'a> {
@inherit SimpleAssignmentTarget
@inherit AssignmentTargetPattern
}
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum SimpleAssignmentTarget<'a> {
AssignmentTargetIdentifier(Box<'a, IdentifierReference<'a>>) = 0,
TSAsExpression(Box<'a, TSAsExpression<'a>>) = 1,
TSSatisfiesExpression(Box<'a, TSSatisfiesExpression<'a>>) = 2,
TSNonNullExpression(Box<'a, TSNonNullExpression<'a>>) = 3,
TSTypeAssertion(Box<'a, TSTypeAssertion<'a>>) = 4,
@inherit MemberExpression
}
}
#[macro_export]
macro_rules! match_assignment_target {
($ty:ident) => {
$ty::AssignmentTargetIdentifier(_)
| $ty::ComputedMemberExpression(_)
| $ty::StaticMemberExpression(_)
| $ty::PrivateFieldExpression(_)
| $ty::TSAsExpression(_)
| $ty::TSSatisfiesExpression(_)
| $ty::TSNonNullExpression(_)
| $ty::TSTypeAssertion(_)
| $ty::ArrayAssignmentTarget(_)
| $ty::ObjectAssignmentTarget(_)
};
}
pub use match_assignment_target;
#[macro_export]
macro_rules! match_simple_assignment_target {
($ty:ident) => {
$ty::AssignmentTargetIdentifier(_)
| $ty::ComputedMemberExpression(_)
| $ty::StaticMemberExpression(_)
| $ty::PrivateFieldExpression(_)
| $ty::TSAsExpression(_)
| $ty::TSSatisfiesExpression(_)
| $ty::TSNonNullExpression(_)
| $ty::TSTypeAssertion(_)
};
}
pub use match_simple_assignment_target;
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum AssignmentTargetPattern<'a> {
ArrayAssignmentTarget(Box<'a, ArrayAssignmentTarget<'a>>) = 8,
ObjectAssignmentTarget(Box<'a, ObjectAssignmentTarget<'a>>) = 9,
}
#[macro_export]
macro_rules! match_assignment_target_pattern {
($ty:ident) => {
$ty::ArrayAssignmentTarget(_) | $ty::ObjectAssignmentTarget(_)
};
}
pub use match_assignment_target_pattern;
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "ArrayPattern",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, elements, optional, typeAnnotation, span),
)]
pub struct ArrayAssignmentTarget<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub elements: Vec<'a, Option<AssignmentTargetMaybeDefault<'a>>>,
#[estree(append_to = elements)]
pub rest: Option<Box<'a, AssignmentTargetRest<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "ObjectPattern",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, properties, optional, typeAnnotation, span),
)]
pub struct ObjectAssignmentTarget<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub properties: Vec<'a, AssignmentTargetProperty<'a>>,
#[estree(append_to = properties)]
pub rest: Option<Box<'a, AssignmentTargetRest<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "RestElement",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull, value = TsNull),
field_order(decorators, target, optional, typeAnnotation, value, span),
)]
pub struct AssignmentTargetRest<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(rename = "argument")]
pub target: AssignmentTarget<'a>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum AssignmentTargetMaybeDefault<'a> {
AssignmentTargetWithDefault(Box<'a, AssignmentTargetWithDefault<'a>>) = 16,
@inherit AssignmentTarget
}
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "AssignmentPattern",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, binding, init, optional, typeAnnotation, span),
)]
pub struct AssignmentTargetWithDefault<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(rename = "left")]
pub binding: AssignmentTarget<'a>,
#[estree(rename = "right")]
pub init: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum AssignmentTargetProperty<'a> {
AssignmentTargetPropertyIdentifier(Box<'a, AssignmentTargetPropertyIdentifier<'a>>) = 0,
AssignmentTargetPropertyProperty(Box<'a, AssignmentTargetPropertyProperty<'a>>) = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Property",
add_fields(kind = Init, method = False, shorthand = True, computed = False, optional = TsFalse),
field_order(kind, binding, init, method, shorthand, computed, optional, span),
)]
pub struct AssignmentTargetPropertyIdentifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(rename = "key")]
pub binding: IdentifierReference<'a>,
#[estree(rename = "value", via = AssignmentTargetPropertyIdentifierInit)]
pub init: Option<Expression<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Property",
add_fields(kind = Init, method = False, shorthand = False, optional = TsFalse),
field_order(kind, name, binding, method, shorthand, computed, optional, span),
)]
pub struct AssignmentTargetPropertyProperty<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(rename = "key")]
pub name: PropertyKey<'a>,
#[estree(rename = "value")]
pub binding: AssignmentTargetMaybeDefault<'a>,
pub computed: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct SequenceExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expressions: Vec<'a, Expression<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct Super {
pub node_id: Cell<NodeId>,
pub span: Span,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct AwaitExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub argument: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ChainExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expression: ChainElement<'a>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ChainElement<'a> {
CallExpression(Box<'a, CallExpression<'a>>) = 0,
TSNonNullExpression(Box<'a, TSNonNullExpression<'a>>) = 1,
@inherit MemberExpression
}
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(via = ParenthesizedExpressionConverter)]
pub struct ParenthesizedExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expression: Expression<'a>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum Statement<'a> {
BlockStatement(Box<'a, BlockStatement<'a>>) = 0,
BreakStatement(Box<'a, BreakStatement<'a>>) = 1,
ContinueStatement(Box<'a, ContinueStatement<'a>>) = 2,
DebuggerStatement(Box<'a, DebuggerStatement>) = 3,
DoWhileStatement(Box<'a, DoWhileStatement<'a>>) = 4,
EmptyStatement(Box<'a, EmptyStatement>) = 5,
ExpressionStatement(Box<'a, ExpressionStatement<'a>>) = 6,
ForInStatement(Box<'a, ForInStatement<'a>>) = 7,
ForOfStatement(Box<'a, ForOfStatement<'a>>) = 8,
ForStatement(Box<'a, ForStatement<'a>>) = 9,
IfStatement(Box<'a, IfStatement<'a>>) = 10,
LabeledStatement(Box<'a, LabeledStatement<'a>>) = 11,
ReturnStatement(Box<'a, ReturnStatement<'a>>) = 12,
SwitchStatement(Box<'a, SwitchStatement<'a>>) = 13,
ThrowStatement(Box<'a, ThrowStatement<'a>>) = 14,
TryStatement(Box<'a, TryStatement<'a>>) = 15,
WhileStatement(Box<'a, WhileStatement<'a>>) = 16,
WithStatement(Box<'a, WithStatement<'a>>) = 17,
@inherit Declaration
@inherit ModuleDeclaration
}
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "ExpressionStatement")]
pub struct Directive<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expression: StringLiteral<'a>,
pub directive: Str<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct Hashbang<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub value: Str<'a>,
}
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct BlockStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub body: Vec<'a, Statement<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum Declaration<'a> {
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 32,
#[visit(args(flags = ScopeFlags::Function))]
FunctionDeclaration(Box<'a, Function<'a>>) = 33,
ClassDeclaration(Box<'a, Class<'a>>) = 34,
TSTypeAliasDeclaration(Box<'a, TSTypeAliasDeclaration<'a>>) = 35,
TSInterfaceDeclaration(Box<'a, TSInterfaceDeclaration<'a>>) = 36,
TSEnumDeclaration(Box<'a, TSEnumDeclaration<'a>>) = 37,
TSModuleDeclaration(Box<'a, TSModuleDeclaration<'a>>) = 38,
TSGlobalDeclaration(Box<'a, TSGlobalDeclaration<'a>>) = 39,
TSImportEqualsDeclaration(Box<'a, TSImportEqualsDeclaration<'a>>) = 40,
}
#[macro_export]
macro_rules! match_declaration {
($ty:ident) => {
$ty::VariableDeclaration(_)
| $ty::FunctionDeclaration(_)
| $ty::ClassDeclaration(_)
| $ty::TSTypeAliasDeclaration(_)
| $ty::TSInterfaceDeclaration(_)
| $ty::TSEnumDeclaration(_)
| $ty::TSModuleDeclaration(_)
| $ty::TSGlobalDeclaration(_)
| $ty::TSImportEqualsDeclaration(_)
};
}
pub use match_declaration;
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct VariableDeclaration<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub kind: VariableDeclarationKind,
pub declarations: Vec<'a, VariableDeclarator<'a>>,
#[ts]
pub declare: bool,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
pub enum VariableDeclarationKind {
Var = 0,
Let = 1,
Const = 2,
Using = 3,
#[estree(rename = "await using")]
AwaitUsing = 4,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct VariableDeclarator<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(skip)]
pub kind: VariableDeclarationKind,
#[estree(via = VariableDeclaratorId)]
pub id: BindingPattern<'a>,
#[ts]
#[estree(skip)]
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
pub init: Option<Expression<'a>>,
#[ts]
pub definite: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct EmptyStatement {
pub node_id: Cell<NodeId>,
pub span: Span,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(add_fields(directive = ExpressionStatementDirective))] pub struct ExpressionStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expression: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct IfStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub test: Expression<'a>,
pub consequent: Statement<'a>,
pub alternate: Option<Statement<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct DoWhileStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub body: Statement<'a>,
pub test: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct WhileStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub test: Expression<'a>,
pub body: Statement<'a>,
}
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ForStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub init: Option<ForStatementInit<'a>>,
pub test: Option<Expression<'a>>,
pub update: Option<Expression<'a>>,
pub body: Statement<'a>,
pub scope_id: Cell<Option<ScopeId>>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ForStatementInit<'a> {
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 64,
@inherit Expression
}
}
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ForInStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub left: ForStatementLeft<'a>,
pub right: Expression<'a>,
pub body: Statement<'a>,
pub scope_id: Cell<Option<ScopeId>>,
}
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ForStatementLeft<'a> {
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 16,
@inherit AssignmentTarget
}
}
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ForOfStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#await: bool,
pub left: ForStatementLeft<'a>,
pub right: Expression<'a>,
pub body: Statement<'a>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ContinueStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub label: Option<LabelIdentifier<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct BreakStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub label: Option<LabelIdentifier<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ReturnStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub argument: Option<Expression<'a>>,
}
#[ast(visit)]
#[scope(flags = ScopeFlags::With)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct WithStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub object: Expression<'a>,
#[scope(enter_before)]
pub body: Statement<'a>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct SwitchStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub discriminant: Expression<'a>,
#[scope(enter_before)]
pub cases: Vec<'a, SwitchCase<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct SwitchCase<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub test: Option<Expression<'a>>,
pub consequent: Vec<'a, Statement<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct LabeledStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub label: LabelIdentifier<'a>,
pub body: Statement<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ThrowStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub argument: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct TryStatement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub block: Box<'a, BlockStatement<'a>>,
pub handler: Option<Box<'a, CatchClause<'a>>>,
pub finalizer: Option<Box<'a, BlockStatement<'a>>>,
}
#[ast(visit)]
#[scope(flags = ScopeFlags::CatchClause)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct CatchClause<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub param: Option<CatchParameter<'a>>,
pub body: Box<'a, BlockStatement<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(no_type, via = CatchParameterConverter)]
pub struct CatchParameter<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(flatten)]
pub pattern: BindingPattern<'a>,
#[estree(skip)]
#[ts]
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct DebuggerStatement {
pub node_id: Cell<NodeId>,
pub span: Span,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum BindingPattern<'a> {
BindingIdentifier(Box<'a, BindingIdentifier<'a>>) = 0,
ObjectPattern(Box<'a, ObjectPattern<'a>>) = 1,
ArrayPattern(Box<'a, ArrayPattern<'a>>) = 2,
AssignmentPattern(Box<'a, AssignmentPattern<'a>>) = 3,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, left, right, optional, typeAnnotation, span),
)]
pub struct AssignmentPattern<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub left: BindingPattern<'a>,
pub right: Expression<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, properties, optional, typeAnnotation, span),
)]
pub struct ObjectPattern<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub properties: Vec<'a, BindingProperty<'a>>,
#[estree(append_to = properties)]
pub rest: Option<Box<'a, BindingRestElement<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "Property",
add_fields(kind = Init, method = False, optional = TsFalse),
field_order(kind, key, value, method, shorthand, computed, optional, span),
)]
pub struct BindingProperty<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub key: PropertyKey<'a>,
pub value: BindingPattern<'a>,
pub shorthand: bool,
pub computed: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull),
field_order(decorators, elements, optional, typeAnnotation, span),
)]
pub struct ArrayPattern<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub elements: Vec<'a, Option<BindingPattern<'a>>>,
#[estree(append_to = elements)]
pub rest: Option<Box<'a, BindingRestElement<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
rename = "RestElement",
add_fields(decorators = TsEmptyArray, optional = TsFalse, typeAnnotation = TsNull, value = TsNull),
field_order(decorators, argument, optional, typeAnnotation, value, span),
)]
pub struct BindingRestElement<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub argument: BindingPattern<'a>,
}
#[ast(visit)]
#[visit(args(flags = ScopeFlags))]
#[scope(
// `flags` passed in to visitor via parameter defined by `#[visit(args(flags = ...))]` on parents
flags = flags,
strict_if = self.has_use_strict_directive(),
)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
add_ts_def = "type ParamPattern = FormalParameter | TSParameterProperty | FormalParameterRest",
add_fields(expression = False),
)]
pub struct Function<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#type: FunctionType,
pub id: Option<BindingIdentifier<'a>>,
pub generator: bool,
pub r#async: bool,
#[ts]
pub declare: bool,
#[ts]
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
#[ts]
#[estree(skip)]
pub this_param: Option<Box<'a, TSThisParameter<'a>>>,
#[estree(via = FunctionParams)]
pub params: Box<'a, FormalParameters<'a>>,
#[ts]
pub return_type: Option<Box<'a, TSTypeAnnotation<'a>>>,
pub body: Option<Box<'a, FunctionBody<'a>>>,
pub scope_id: Cell<Option<ScopeId>>,
#[builder(default)]
#[estree(skip)]
pub pure: bool,
#[builder(default)]
#[estree(skip)]
pub pife: bool,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants)]
pub enum FunctionType {
FunctionDeclaration = 0,
FunctionExpression = 1,
TSDeclareFunction = 2,
TSEmptyBodyFunctionExpression = 3,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(
via = FormalParametersConverter,
add_ts_def = "
interface FormalParameterRest extends Span {
type: 'RestElement';
argument: BindingPattern;
decorators?: [],
optional?: boolean;
typeAnnotation?: TSTypeAnnotation | null;
value?: null;
parent/* IF !LINTER */?/* END IF */: Node;
}
"
)]
pub struct FormalParameters<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub kind: FormalParameterKind,
#[estree(ts_type = "Array<FormalParameter | TSParameterProperty | FormalParameterRest>")]
pub items: Vec<'a, FormalParameter<'a>>,
#[estree(skip)]
pub rest: Option<Box<'a, FormalParameterRest<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[plural(FormalParameterList)]
#[estree(
no_type,
via = FormalParameterConverter,
add_ts_def = "
type FormalParameter =
& ({
decorators?: Array<Decorator>;
})
& BindingPattern;
export interface TSParameterProperty extends Span {
type: 'TSParameterProperty';
accessibility: TSAccessibility | null;
decorators: Array<Decorator>;
override: boolean;
parameter: FormalParameter;
readonly: boolean;
static: boolean;
parent/* IF !LINTER */?/* END IF */: Node;
}
"
)]
pub struct FormalParameter<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[ts]
pub decorators: Vec<'a, Decorator<'a>>,
#[estree(flatten)]
pub pattern: BindingPattern<'a>,
#[ts]
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
pub initializer: Option<Box<'a, Expression<'a>>>,
#[ts]
pub optional: bool,
#[ts]
#[estree(skip)]
pub accessibility: Option<TSAccessibility>,
#[ts]
#[estree(skip)]
pub readonly: bool,
#[ts]
#[estree(skip)]
pub r#override: bool,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants, no_ts_def)]
pub enum FormalParameterKind {
FormalParameter = 0,
UniqueFormalParameters = 1,
ArrowFormalParameters = 2,
Signature = 3,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, UnstableAddress)]
pub struct FormalParameterRest<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub decorators: Vec<'a, Decorator<'a>>,
pub rest: BindingRestElement<'a>,
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(rename = "BlockStatement")]
pub struct FunctionBody<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(prepend_to = statements)]
pub directives: Vec<'a, Directive<'a>>,
#[estree(rename = "body")]
pub statements: Vec<'a, Statement<'a>>,
}
#[ast(visit)]
#[scope(
flags = ScopeFlags::Function | ScopeFlags::Arrow,
strict_if = self.has_use_strict_directive(),
)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(add_fields(id = Null, generator = False))]
pub struct ArrowFunctionExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub expression: bool,
pub r#async: bool,
#[ts]
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
pub params: Box<'a, FormalParameters<'a>>,
#[ts]
pub return_type: Option<Box<'a, TSTypeAnnotation<'a>>>,
#[estree(via = ArrowFunctionExpressionBody)]
pub body: Box<'a, FunctionBody<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
#[builder(default)]
#[estree(skip)]
pub pure: bool,
#[builder(default)]
#[estree(skip)]
pub pife: bool,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct YieldExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub delegate: bool,
pub argument: Option<Expression<'a>>,
}
#[ast(visit)]
#[scope(flags = ScopeFlags::StrictMode)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct Class<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#type: ClassType,
pub decorators: Vec<'a, Decorator<'a>>,
pub id: Option<BindingIdentifier<'a>>,
#[scope(enter_before)]
#[ts]
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
pub super_class: Option<Expression<'a>>,
#[ts]
pub super_type_arguments: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
#[ts]
pub implements: Vec<'a, TSClassImplements<'a>>,
pub body: Box<'a, ClassBody<'a>>,
#[ts]
pub r#abstract: bool,
#[ts]
pub declare: bool,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants)]
pub enum ClassType {
ClassDeclaration = 0,
ClassExpression = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ClassBody<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub body: Vec<'a, ClassElement<'a>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ClassElement<'a> {
StaticBlock(Box<'a, StaticBlock<'a>>) = 0,
MethodDefinition(Box<'a, MethodDefinition<'a>>) = 1,
PropertyDefinition(Box<'a, PropertyDefinition<'a>>) = 2,
AccessorProperty(Box<'a, AccessorProperty<'a>>) = 3,
TSIndexSignature(Box<'a, TSIndexSignature<'a>>) = 4,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct MethodDefinition<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#type: MethodDefinitionType,
pub decorators: Vec<'a, Decorator<'a>>,
pub key: PropertyKey<'a>,
#[visit(args(flags = match self.kind {
MethodDefinitionKind::Get => ScopeFlags::Function | ScopeFlags::GetAccessor,
MethodDefinitionKind::Set => ScopeFlags::Function | ScopeFlags::SetAccessor,
MethodDefinitionKind::Constructor => ScopeFlags::Function | ScopeFlags::Constructor,
MethodDefinitionKind::Method => ScopeFlags::Function,
}))]
pub value: Box<'a, Function<'a>>, pub kind: MethodDefinitionKind,
pub computed: bool,
pub r#static: bool,
#[ts]
pub r#override: bool,
#[ts]
pub optional: bool,
#[ts]
pub accessibility: Option<TSAccessibility>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants)]
pub enum MethodDefinitionType {
MethodDefinition = 0,
TSAbstractMethodDefinition = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct PropertyDefinition<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#type: PropertyDefinitionType,
pub decorators: Vec<'a, Decorator<'a>>,
pub key: PropertyKey<'a>,
#[ts]
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
pub value: Option<Expression<'a>>,
pub computed: bool,
pub r#static: bool,
#[ts]
pub declare: bool,
#[ts]
pub r#override: bool,
#[ts]
pub optional: bool,
#[ts]
pub definite: bool,
#[ts]
pub readonly: bool,
#[ts]
pub accessibility: Option<TSAccessibility>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants)]
pub enum PropertyDefinitionType {
PropertyDefinition = 0,
TSAbstractPropertyDefinition = 1,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
pub enum MethodDefinitionKind {
Constructor = 0,
Method = 1,
Get = 2,
Set = 3,
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct PrivateIdentifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: Ident<'a>,
}
#[ast(visit)]
#[scope(flags = ScopeFlags::ClassStaticBlock)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct StaticBlock<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub body: Vec<'a, Statement<'a>>,
pub scope_id: Cell<Option<ScopeId>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ModuleDeclaration<'a> {
ImportDeclaration(Box<'a, ImportDeclaration<'a>>) = 64,
ExportAllDeclaration(Box<'a, ExportAllDeclaration<'a>>) = 65,
ExportDefaultDeclaration(Box<'a, ExportDefaultDeclaration<'a>>) = 66,
ExportNamedDeclaration(Box<'a, ExportNamedDeclaration<'a>>) = 67,
TSExportAssignment(Box<'a, TSExportAssignment<'a>>) = 68,
TSNamespaceExportDeclaration(Box<'a, TSNamespaceExportDeclaration<'a>>) = 69,
}
#[macro_export]
macro_rules! match_module_declaration {
($ty:ident) => {
$ty::ImportDeclaration(_)
| $ty::ExportAllDeclaration(_)
| $ty::ExportDefaultDeclaration(_)
| $ty::ExportNamedDeclaration(_)
| $ty::TSExportAssignment(_)
| $ty::TSNamespaceExportDeclaration(_)
};
}
pub use match_module_declaration;
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
#[estree(no_rename_variants)]
pub enum AccessorPropertyType {
AccessorProperty = 0,
TSAbstractAccessorProperty = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(add_fields(declare = TsFalse, optional = TsFalse, readonly = TsFalse))]
pub struct AccessorProperty<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub r#type: AccessorPropertyType,
pub decorators: Vec<'a, Decorator<'a>>,
pub key: PropertyKey<'a>,
#[ts]
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
pub value: Option<Expression<'a>>,
pub computed: bool,
pub r#static: bool,
#[ts]
pub r#override: bool,
#[ts]
pub definite: bool,
#[ts]
pub accessibility: Option<TSAccessibility>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub source: Expression<'a>,
pub options: Option<Expression<'a>>,
pub phase: Option<ImportPhase>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportDeclaration<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
#[estree(via = ImportDeclarationSpecifiers)]
pub specifiers: Option<Vec<'a, ImportDeclarationSpecifier<'a>>>,
pub source: StringLiteral<'a>,
pub phase: Option<ImportPhase>,
#[estree(rename = "attributes", via = ImportDeclarationWithClause)]
pub with_clause: Option<Box<'a, WithClause<'a>>>,
#[ts]
pub import_kind: ImportOrExportKind,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq, ESTree)]
pub enum ImportPhase {
Source = 0,
Defer = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ImportDeclarationSpecifier<'a> {
ImportSpecifier(Box<'a, ImportSpecifier<'a>>) = 0,
ImportDefaultSpecifier(Box<'a, ImportDefaultSpecifier<'a>>) = 1,
ImportNamespaceSpecifier(Box<'a, ImportNamespaceSpecifier<'a>>) = 2,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportSpecifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub imported: ModuleExportName<'a>,
pub local: BindingIdentifier<'a>,
#[ts]
pub import_kind: ImportOrExportKind,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportDefaultSpecifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub local: BindingIdentifier<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportNamespaceSpecifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub local: BindingIdentifier<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(no_type, no_ts_def)]
pub struct WithClause<'a> {
pub node_id: Cell<NodeId>,
#[estree(skip)]
pub span: Span,
#[estree(skip)]
pub keyword: WithClauseKeyword,
#[estree(rename = "attributes")]
pub with_entries: Vec<'a, ImportAttribute<'a>>,
}
#[ast]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[generate_derive(CloneIn, Dummy, ContentEq)]
#[estree(no_ts_def)]
pub enum WithClauseKeyword {
With = 0,
Assert = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ImportAttribute<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub key: ImportAttributeKey<'a>,
pub value: StringLiteral<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
pub enum ImportAttributeKey<'a> {
Identifier(IdentifierName<'a>) = 0,
StringLiteral(StringLiteral<'a>) = 1,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ExportNamedDeclaration<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub declaration: Option<Declaration<'a>>,
pub specifiers: Vec<'a, ExportSpecifier<'a>>,
pub source: Option<StringLiteral<'a>>,
#[ts]
pub export_kind: ImportOrExportKind,
#[estree(rename = "attributes", via = ExportNamedDeclarationWithClause)]
pub with_clause: Option<Box<'a, WithClause<'a>>>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
#[estree(add_fields(exportKind = TsValue))]
pub struct ExportDefaultDeclaration<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub declaration: ExportDefaultDeclarationKind<'a>,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ExportAllDeclaration<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub exported: Option<ModuleExportName<'a>>,
pub source: StringLiteral<'a>,
#[estree(rename = "attributes", via = ExportAllDeclarationWithClause)]
pub with_clause: Option<Box<'a, WithClause<'a>>>, #[ts]
pub export_kind: ImportOrExportKind, }
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct ExportSpecifier<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub local: ModuleExportName<'a>,
pub exported: ModuleExportName<'a>,
#[ts]
pub export_kind: ImportOrExportKind, }
inherit_variants! {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ESTree)]
pub enum ExportDefaultDeclarationKind<'a> {
#[visit(args(flags = ScopeFlags::Function))]
FunctionDeclaration(Box<'a, Function<'a>>) = 64,
ClassDeclaration(Box<'a, Class<'a>>) = 65,
TSInterfaceDeclaration(Box<'a, TSInterfaceDeclaration<'a>>) = 66,
@inherit Expression
}
}
#[ast(visit)]
#[derive(Debug, Clone)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
pub enum ModuleExportName<'a> {
IdentifierName(IdentifierName<'a>) = 0,
IdentifierReference(IdentifierReference<'a>) = 1,
StringLiteral(StringLiteral<'a>) = 2,
}
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, Dummy, TakeIn, GetSpan, GetSpanMut, ContentEq, ESTree, UnstableAddress)]
pub struct V8IntrinsicExpression<'a> {
pub node_id: Cell<NodeId>,
pub span: Span,
pub name: IdentifierName<'a>,
pub arguments: Vec<'a, Argument<'a>>,
}