refactor(ast): rename the visited_node marker to ast. (#4289)

closes #4282
I went with `#[ast(visit)]` but we can change it to 2 separate markers as suggested by @overlookmotel in the issue.
This commit is contained in:
rzvxa 2024-07-20 12:02:25 +00:00
parent 7a75e0f8a7
commit 5f1c7ecad7
13 changed files with 317 additions and 265 deletions

View file

@ -8,7 +8,7 @@
use std::cell::Cell;
use oxc_allocator::{Box, Vec};
use oxc_ast_macros::visited_node;
use oxc_ast_macros::ast;
use oxc_span::{Atom, SourceType, Span};
use oxc_syntax::{
operator::{
@ -27,7 +27,7 @@ use serde::Serialize;
#[cfg(feature = "serialize")]
use tsify::Tsify;
#[visited_node]
#[ast(visit)]
#[scope(
flags(ScopeFlags::Top),
strict_if(self.source_type.is_strict() || self.directives.iter().any(Directive::is_use_strict)),
@ -51,7 +51,7 @@ inherit_variants! {
/// Inherits variants from [`MemberExpression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -160,7 +160,7 @@ macro_rules! match_expression {
pub use match_expression;
/// Identifier Name
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "Identifier"))]
@ -171,7 +171,7 @@ pub struct IdentifierName<'a> {
}
/// Identifier Reference
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "Identifier"))]
@ -186,7 +186,7 @@ pub struct IdentifierReference<'a> {
}
/// Binding Identifier
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "Identifier"))]
@ -199,7 +199,7 @@ pub struct BindingIdentifier<'a> {
}
/// Label Identifier
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "Identifier"))]
@ -210,7 +210,7 @@ pub struct LabelIdentifier<'a> {
}
/// This Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -220,7 +220,7 @@ pub struct ThisExpression {
}
/// <https://tc39.es/ecma262/#prod-ArrayLiteral>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -241,7 +241,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
@ -259,14 +259,14 @@ pub enum ArrayExpressionElement<'a> {
/// Array Expression Elision Element
/// Serialized as `null` in JSON AST. See `serialize.rs`.
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
pub struct Elision {
pub span: Span,
}
/// Object Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -278,7 +278,7 @@ pub struct ObjectExpression<'a> {
pub trailing_comma: Option<Span>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -287,7 +287,7 @@ pub enum ObjectPropertyKind<'a> {
SpreadProperty(Box<'a, SpreadElement<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -309,7 +309,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -334,7 +334,7 @@ pub enum PropertyKind {
/// Template Literal
///
/// This is interpreted by interleaving the expression elements in between the quasi elements.
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -345,7 +345,7 @@ pub struct TemplateLiteral<'a> {
pub expressions: Vec<'a, Expression<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -357,7 +357,7 @@ pub struct TaggedTemplateExpression<'a> {
pub type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -384,7 +384,7 @@ pub struct TemplateElementValue<'a> {
}
/// <https://tc39.es/ecma262/#prod-MemberExpression>
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -410,7 +410,7 @@ macro_rules! match_member_expression {
pub use match_member_expression;
/// `MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ]`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -423,7 +423,7 @@ pub struct ComputedMemberExpression<'a> {
}
/// `MemberExpression[?Yield, ?Await] . IdentifierName`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -436,7 +436,7 @@ pub struct StaticMemberExpression<'a> {
}
/// `MemberExpression[?Yield, ?Await] . PrivateIdentifier`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -449,7 +449,7 @@ pub struct PrivateFieldExpression<'a> {
}
/// Call Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -463,7 +463,7 @@ pub struct CallExpression<'a> {
}
/// New Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -476,7 +476,7 @@ pub struct NewExpression<'a> {
}
/// Meta Property `new.target` | `import.meta`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -488,7 +488,7 @@ pub struct MetaProperty<'a> {
}
/// Spread Element
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -504,7 +504,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -517,7 +517,7 @@ pub enum Argument<'a> {
}
/// Update Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -530,7 +530,7 @@ pub struct UpdateExpression<'a> {
}
/// Unary Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -542,7 +542,7 @@ pub struct UnaryExpression<'a> {
}
/// Binary Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -555,7 +555,7 @@ pub struct BinaryExpression<'a> {
}
/// Private Identifier in Shift Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -568,7 +568,7 @@ pub struct PrivateInExpression<'a> {
}
/// Binary Logical Operators
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -581,7 +581,7 @@ pub struct LogicalExpression<'a> {
}
/// Conditional Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -594,7 +594,7 @@ pub struct ConditionalExpression<'a> {
}
/// Assignment Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -613,7 +613,7 @@ inherit_variants! {
/// See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -632,7 +632,7 @@ inherit_variants! {
/// Inherits variants from [`MemberExpression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -687,7 +687,7 @@ macro_rules! match_simple_assignment_target {
}
pub use match_simple_assignment_target;
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -707,7 +707,7 @@ macro_rules! match_assignment_target_pattern {
pub use match_assignment_target_pattern;
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -726,7 +726,7 @@ pub struct ArrayAssignmentTarget<'a> {
}
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -742,7 +742,7 @@ pub struct ObjectAssignmentTarget<'a> {
pub rest: Option<AssignmentTargetRest<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "RestElement"))]
@ -759,7 +759,7 @@ inherit_variants! {
/// Inherits variants from [`AssignmentTarget`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -771,7 +771,7 @@ pub enum AssignmentTargetMaybeDefault<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -782,7 +782,7 @@ pub struct AssignmentTargetWithDefault<'a> {
pub init: Expression<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -792,7 +792,7 @@ pub enum AssignmentTargetProperty<'a> {
}
/// Assignment Property - Identifier Reference
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -804,7 +804,7 @@ pub struct AssignmentTargetPropertyIdentifier<'a> {
}
/// Assignment Property - Property Name
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -816,7 +816,7 @@ pub struct AssignmentTargetPropertyProperty<'a> {
}
/// Sequence Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -826,7 +826,7 @@ pub struct SequenceExpression<'a> {
pub expressions: Vec<'a, Expression<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -836,7 +836,7 @@ pub struct Super {
}
/// Await Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -846,7 +846,7 @@ pub struct AwaitExpression<'a> {
pub argument: Expression<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -862,7 +862,7 @@ inherit_variants! {
/// Inherits variants from [`MemberExpression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -875,7 +875,7 @@ pub enum ChainElement<'a> {
}
/// Parenthesized Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -892,7 +892,7 @@ inherit_variants! {
/// See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -925,7 +925,7 @@ pub enum Statement<'a> {
}
/// Directive Prologue
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -939,7 +939,7 @@ pub struct Directive<'a> {
}
/// Hashbang
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -950,7 +950,7 @@ pub struct Hashbang<'a> {
}
/// Block Statement
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -963,7 +963,7 @@ pub struct BlockStatement<'a> {
}
/// Declarations and the Variable Statement
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1000,7 +1000,7 @@ macro_rules! match_declaration {
pub use match_declaration;
/// Variable Declaration
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1021,7 +1021,7 @@ pub enum VariableDeclarationKind {
Let,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1037,7 +1037,7 @@ pub struct VariableDeclarator<'a> {
/// Using Declaration
/// * <https://github.com/tc39/proposal-explicit-resource-management>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1050,7 +1050,7 @@ pub struct UsingDeclaration<'a> {
}
/// Empty Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1060,7 +1060,7 @@ pub struct EmptyStatement {
}
/// Expression Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1071,7 +1071,7 @@ pub struct ExpressionStatement<'a> {
}
/// If Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1084,7 +1084,7 @@ pub struct IfStatement<'a> {
}
/// Do-While Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1096,7 +1096,7 @@ pub struct DoWhileStatement<'a> {
}
/// While Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1108,7 +1108,7 @@ pub struct WhileStatement<'a> {
}
/// For Statement
#[visited_node]
#[ast(visit)]
#[scope(if(self.init.as_ref().is_some_and(ForStatementInit::is_lexical_declaration)))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1129,7 +1129,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1143,7 +1143,7 @@ pub enum ForStatementInit<'a> {
}
/// For-In Statement
#[visited_node]
#[ast(visit)]
#[scope(if(self.left.is_lexical_declaration()))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1163,7 +1163,7 @@ inherit_variants! {
/// Inherits variants from [`AssignmentTarget`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1176,7 +1176,7 @@ pub enum ForStatementLeft<'a> {
}
}
/// For-Of Statement
#[visited_node]
#[ast(visit)]
#[scope(if(self.left.is_lexical_declaration()))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1192,7 +1192,7 @@ pub struct ForOfStatement<'a> {
}
/// Continue Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1203,7 +1203,7 @@ pub struct ContinueStatement<'a> {
}
/// Break Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1214,7 +1214,7 @@ pub struct BreakStatement<'a> {
}
/// Return Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1225,7 +1225,7 @@ pub struct ReturnStatement<'a> {
}
/// With Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1237,7 +1237,7 @@ pub struct WithStatement<'a> {
}
/// Switch Statement
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1251,7 +1251,7 @@ pub struct SwitchStatement<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1263,7 +1263,7 @@ pub struct SwitchCase<'a> {
}
/// Labelled Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1275,7 +1275,7 @@ pub struct LabeledStatement<'a> {
}
/// Throw Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1286,7 +1286,7 @@ pub struct ThrowStatement<'a> {
}
/// Try Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1299,7 +1299,7 @@ pub struct TryStatement<'a> {
pub finalizer: Option<Box<'a, BlockStatement<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[scope(flags(ScopeFlags::CatchClause), if(self.param.is_some()))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1312,7 +1312,7 @@ pub struct CatchClause<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1323,7 +1323,7 @@ pub struct CatchParameter<'a> {
}
/// Debugger Statement
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1334,7 +1334,7 @@ pub struct DebuggerStatement {
/// Destructuring Binding Patterns
/// * <https://tc39.es/ecma262/#prod-BindingPattern>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
@ -1351,7 +1351,7 @@ pub struct BindingPattern<'a> {
pub optional: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -1369,7 +1369,7 @@ pub enum BindingPatternKind<'a> {
AssignmentPattern(Box<'a, AssignmentPattern<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1381,7 +1381,7 @@ pub struct AssignmentPattern<'a> {
}
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1394,7 +1394,7 @@ pub struct ObjectPattern<'a> {
pub rest: Option<Box<'a, BindingRestElement<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1408,7 +1408,7 @@ pub struct BindingProperty<'a> {
}
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1424,7 +1424,7 @@ pub struct ArrayPattern<'a> {
pub rest: Option<Box<'a, BindingRestElement<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename = "RestElement"))]
@ -1435,7 +1435,7 @@ pub struct BindingRestElement<'a> {
}
/// Function Definitions
#[visited_node]
#[ast(visit)]
#[scope(
// `flags` passed in to visitor via parameter defined by `#[visit_args(flags = ...)]` on parents
flags(flags),
@ -1487,7 +1487,7 @@ pub enum FunctionType {
/// <https://tc39.es/ecma262/#prod-FormalParameters>
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1504,7 +1504,7 @@ pub struct FormalParameters<'a> {
pub rest: Option<Box<'a, BindingRestElement<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1532,7 +1532,7 @@ pub enum FormalParameterKind {
}
/// <https://tc39.es/ecma262/#prod-FunctionBody>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1544,7 +1544,7 @@ pub struct FunctionBody<'a> {
}
/// Arrow Function Definitions
#[visited_node]
#[ast(visit)]
#[scope(
flags(ScopeFlags::Function | ScopeFlags::Arrow),
strict_if(self.body.has_use_strict_directive()),
@ -1567,7 +1567,7 @@ pub struct ArrowFunctionExpression<'a> {
}
/// Generator Function Definitions
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1579,7 +1579,7 @@ pub struct YieldExpression<'a> {
}
/// Class Definitions
#[visited_node]
#[ast(visit)]
#[scope(flags(ScopeFlags::StrictMode))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1609,7 +1609,7 @@ pub enum ClassType {
ClassExpression,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1619,7 +1619,7 @@ pub struct ClassBody<'a> {
pub body: Vec<'a, ClassElement<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -1631,7 +1631,7 @@ pub enum ClassElement<'a> {
TSIndexSignature(Box<'a, TSIndexSignature<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
@ -1663,7 +1663,7 @@ pub enum MethodDefinitionType {
TSAbstractMethodDefinition,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
@ -1702,7 +1702,7 @@ pub enum MethodDefinitionKind {
Set,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1712,7 +1712,7 @@ pub struct PrivateIdentifier<'a> {
pub name: Atom<'a>,
}
#[visited_node]
#[ast(visit)]
#[scope(flags(ScopeFlags::ClassStaticBlock))]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1724,7 +1724,7 @@ pub struct StaticBlock<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1768,7 +1768,7 @@ pub enum AccessorPropertyType {
TSAbstractAccessorProperty,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
pub struct AccessorProperty<'a> {
@ -1782,7 +1782,7 @@ pub struct AccessorProperty<'a> {
pub r#static: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1793,7 +1793,7 @@ pub struct ImportExpression<'a> {
pub arguments: Vec<'a, Expression<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1809,7 +1809,7 @@ pub struct ImportDeclaration<'a> {
pub import_kind: ImportOrExportKind,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -1825,7 +1825,7 @@ pub enum ImportDeclarationSpecifier<'a> {
// import {imported} from "source"
// import {imported as local} from "source"
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1838,7 +1838,7 @@ pub struct ImportSpecifier<'a> {
}
// import local from "source"
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1849,7 +1849,7 @@ pub struct ImportDefaultSpecifier<'a> {
}
// import * as local from "source"
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1859,7 +1859,7 @@ pub struct ImportNamespaceSpecifier<'a> {
pub local: BindingIdentifier<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1870,7 +1870,7 @@ pub struct WithClause<'a> {
pub with_entries: Vec<'a, ImportAttribute<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1881,7 +1881,7 @@ pub struct ImportAttribute<'a> {
pub value: StringLiteral<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -1890,7 +1890,7 @@ pub enum ImportAttributeKey<'a> {
StringLiteral(StringLiteral<'a>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1910,7 +1910,7 @@ pub struct ExportNamedDeclaration<'a> {
/// export default HoistableDeclaration
/// export default ClassDeclaration
/// export default AssignmentExpression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -1921,7 +1921,7 @@ pub struct ExportDefaultDeclaration<'a> {
pub exported: ModuleExportName<'a>, // the `default` Keyword
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1934,7 +1934,7 @@ pub struct ExportAllDeclaration<'a> {
pub export_kind: ImportOrExportKind, // `export type *`
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1952,7 +1952,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1975,7 +1975,7 @@ pub enum ExportDefaultDeclarationKind<'a> {
/// * `export {foo as "\0 any unicode"}`
/// * es2022: <https://github.com/estree/estree/blob/master/es2022.md#modules>
/// * <https://github.com/tc39/ecma262/pull/2154>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]

View file

@ -8,7 +8,7 @@
#![allow(non_snake_case)]
use oxc_allocator::{Box, Vec};
use oxc_ast_macros::visited_node;
use oxc_ast_macros::ast;
use oxc_span::{Atom, Span};
#[cfg(feature = "serialize")]
use serde::Serialize;
@ -20,7 +20,7 @@ use super::{inherit_variants, js::*, literal::*, ts::*};
// 1.2 JSX Elements
/// JSX Element
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -33,7 +33,7 @@ pub struct JSXElement<'a> {
}
/// JSX Opening Element
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -47,7 +47,7 @@ pub struct JSXOpeningElement<'a> {
}
/// JSX Closing Element
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -58,7 +58,7 @@ pub struct JSXClosingElement<'a> {
}
/// JSX Fragment
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -87,7 +87,7 @@ pub struct JSXClosingFragment {
}
/// JSX Element Name
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -101,7 +101,7 @@ pub enum JSXElementName<'a> {
}
/// JSX Namespaced Name
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -113,7 +113,7 @@ pub struct JSXNamespacedName<'a> {
}
/// JSX Member Expression
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -124,7 +124,7 @@ pub struct JSXMemberExpression<'a> {
pub property: JSXIdentifier<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -133,7 +133,7 @@ pub enum JSXMemberExpressionObject<'a> {
MemberExpression(Box<'a, JSXMemberExpression<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -149,7 +149,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -161,7 +161,7 @@ pub enum JSXExpression<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -173,7 +173,7 @@ pub struct JSXEmptyExpression {
// 1.3 JSX Attributes
/// JSX Attributes
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -183,7 +183,7 @@ pub enum JSXAttributeItem<'a> {
}
/// JSX Attribute
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -195,7 +195,7 @@ pub struct JSXAttribute<'a> {
}
/// JSX Spread Attribute
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -206,7 +206,7 @@ pub struct JSXSpreadAttribute<'a> {
}
/// JSX Attribute Name
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -216,7 +216,7 @@ pub enum JSXAttributeName<'a> {
}
/// JSX Attribute Value
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -227,7 +227,7 @@ pub enum JSXAttributeValue<'a> {
Fragment(Box<'a, JSXFragment<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -240,7 +240,7 @@ pub struct JSXIdentifier<'a> {
// 1.4 JSX Children
/// JSX Child
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -252,7 +252,7 @@ pub enum JSXChild<'a> {
Spread(Box<'a, JSXSpreadChild<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -262,7 +262,7 @@ pub struct JSXSpreadChild<'a> {
pub expression: Expression<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]

View file

@ -10,7 +10,7 @@
use std::hash::Hash;
use bitflags::bitflags;
use oxc_ast_macros::visited_node;
use oxc_ast_macros::ast;
use oxc_span::{Atom, Span};
use oxc_syntax::number::{BigintBase, NumberBase};
#[cfg(feature = "serialize")]
@ -18,7 +18,7 @@ use serde::Serialize;
#[cfg(feature = "serialize")]
use tsify::Tsify;
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -28,7 +28,7 @@ pub struct BooleanLiteral {
pub value: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -37,7 +37,7 @@ pub struct NullLiteral {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -50,7 +50,7 @@ pub struct NumericLiteral<'a> {
pub base: NumberBase,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -62,7 +62,7 @@ pub struct BigIntLiteral<'a> {
pub base: BigintBase,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -86,7 +86,7 @@ pub struct RegExp<'a> {
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
pub struct EmptyObject;
#[visited_node]
#[ast(visit)]
#[derive(Debug, Clone, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]

View file

@ -13,7 +13,7 @@
use std::{cell::Cell, hash::Hash};
use oxc_allocator::{Box, Vec};
use oxc_ast_macros::visited_node;
use oxc_ast_macros::ast;
use oxc_span::{Atom, Span};
use oxc_syntax::scope::ScopeId;
#[cfg(feature = "serialize")]
@ -33,7 +33,7 @@ export interface TSIndexSignatureName extends Span {
}
"#;
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -47,7 +47,7 @@ pub struct TSThisParameter<'a> {
/// Enum Declaration
///
/// `const_opt`enum`BindingIdentifier`{`EnumBody_opt`}
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -63,7 +63,7 @@ pub struct TSEnumDeclaration<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -80,7 +80,7 @@ inherit_variants! {
/// Inherits variants from [`Expression`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -96,7 +96,7 @@ pub enum TSEnumMemberName<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -106,7 +106,7 @@ pub struct TSTypeAnnotation<'a> {
pub type_annotation: TSType<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -116,7 +116,7 @@ pub struct TSLiteralType<'a> {
pub literal: TSLiteral<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
@ -131,7 +131,7 @@ pub enum TSLiteral<'a> {
UnaryExpression(Box<'a, UnaryExpression<'a>>),
}
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -229,7 +229,7 @@ pub use match_ts_type;
/// `SomeType extends OtherType ? TrueType : FalseType;`
///
/// <https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#handbook-content>
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -247,7 +247,7 @@ pub struct TSConditionalType<'a> {
/// string | string[] | (() => string) | { s: string }
///
/// <https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html#unions>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -260,7 +260,7 @@ pub struct TSUnionType<'a> {
/// type `ColorfulCircle` = Colorful & Circle;
///
/// <https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -270,7 +270,7 @@ pub struct TSIntersectionType<'a> {
pub types: Vec<'a, TSType<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -283,7 +283,7 @@ pub struct TSParenthesizedType<'a> {
/// keyof unique readonly
///
/// <https://www.typescriptlang.org/docs/handbook/2/keyof-types.html>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -306,7 +306,7 @@ pub enum TSTypeOperatorOperator {
/// `let myArray: string[] = ["hello", "world"];`
///
/// <https://www.typescriptlang.org/docs/handbook/2/objects.html#the-array-type>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -319,7 +319,7 @@ pub struct TSArrayType<'a> {
/// `type I1 = Person["age" | "name"];`
///
/// <https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html#handbook-content>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -333,7 +333,7 @@ pub struct TSIndexedAccessType<'a> {
/// type `StringNumberPair` = [string, number];
///
/// <https://www.typescriptlang.org/docs/handbook/2/objects.html#tuple-types>
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -343,7 +343,7 @@ pub struct TSTupleType<'a> {
pub element_types: Vec<'a, TSTupleElement<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -355,7 +355,7 @@ pub struct TSNamedTupleMember<'a> {
pub optional: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -365,7 +365,7 @@ pub struct TSOptionalType<'a> {
pub type_annotation: TSType<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -381,7 +381,7 @@ inherit_variants! {
/// Inherits variants from [`TSType`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -396,7 +396,7 @@ pub enum TSTupleElement<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -405,7 +405,7 @@ pub struct TSAnyKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -414,7 +414,7 @@ pub struct TSStringKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -423,7 +423,7 @@ pub struct TSBooleanKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -432,7 +432,7 @@ pub struct TSNumberKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -442,7 +442,7 @@ pub struct TSNeverKeyword {
}
/// `type Uppercase<T extends character> = intrinsic;`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -451,7 +451,7 @@ pub struct TSIntrinsicKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -460,7 +460,7 @@ pub struct TSUnknownKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -469,7 +469,7 @@ pub struct TSNullKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -478,7 +478,7 @@ pub struct TSUndefinedKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -487,7 +487,7 @@ pub struct TSVoidKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -496,7 +496,7 @@ pub struct TSSymbolKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -505,7 +505,7 @@ pub struct TSThisType {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -514,7 +514,7 @@ pub struct TSObjectKeyword {
pub span: Span,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type"))]
@ -526,7 +526,7 @@ pub struct TSBigIntKeyword {
/// type C = A;
/// type D = B.a;
/// type E = D.c.b.a;
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -540,7 +540,7 @@ pub struct TSTypeReference<'a> {
/// TypeName:
/// IdentifierReference
/// NamespaceName.IdentifierReference
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -559,7 +559,7 @@ macro_rules! match_ts_type_name {
}
pub use match_ts_type_name;
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -570,7 +570,7 @@ pub struct TSQualifiedName<'a> {
pub right: IdentifierName<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -580,7 +580,7 @@ pub struct TSTypeParameterInstantiation<'a> {
pub params: Vec<'a, TSType<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -595,7 +595,7 @@ pub struct TSTypeParameter<'a> {
pub r#const: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -605,7 +605,7 @@ pub struct TSTypeParameterDeclaration<'a> {
pub params: Vec<'a, TSTypeParameter<'a>>,
}
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -630,7 +630,7 @@ pub enum TSAccessibility {
Public,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -644,7 +644,7 @@ pub struct TSClassImplements<'a> {
/// Interface Declaration
///
/// interface`BindingIdentifier``TypeParameters_opt``InterfaceExtendsClause_opt``ObjectType`
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -661,7 +661,7 @@ pub struct TSInterfaceDeclaration<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -671,7 +671,7 @@ pub struct TSInterfaceBody<'a> {
pub body: Vec<'a, TSSignature<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -685,7 +685,7 @@ pub struct TSPropertySignature<'a> {
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
@ -697,7 +697,7 @@ pub enum TSSignature<'a> {
TSMethodSignature(Box<'a, TSMethodSignature<'a>>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -709,7 +709,7 @@ pub struct TSIndexSignature<'a> {
pub readonly: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -731,7 +731,7 @@ pub enum TSMethodSignatureKind {
Set,
}
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -750,7 +750,7 @@ pub struct TSMethodSignature<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -764,7 +764,7 @@ pub struct TSConstructSignatureDeclaration<'a> {
pub scope_id: Cell<Option<ScopeId>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(
@ -778,7 +778,7 @@ pub struct TSIndexSignatureName<'a> {
pub type_annotation: Box<'a, TSTypeAnnotation<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -789,7 +789,7 @@ pub struct TSInterfaceHeritage<'a> {
pub type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -801,7 +801,7 @@ pub struct TSTypePredicate<'a> {
pub type_annotation: Option<Box<'a, TSTypeAnnotation<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged, rename_all = "camelCase"))]
@ -810,7 +810,7 @@ pub enum TSTypePredicateName<'a> {
This(TSThisType),
}
#[visited_node]
#[ast(visit)]
#[scope(
flags(ScopeFlags::TsModuleBlock),
strict_if(self.body.as_ref().is_some_and(TSModuleDeclarationBody::is_strict)),
@ -853,7 +853,7 @@ impl TSModuleDeclarationKind {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -862,7 +862,7 @@ pub enum TSModuleDeclarationName<'a> {
StringLiteral(StringLiteral<'a>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -872,7 +872,7 @@ pub enum TSModuleDeclarationBody<'a> {
}
// See serializer in serialize.rs
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -884,7 +884,7 @@ pub struct TSModuleBlock<'a> {
pub body: Vec<'a, Statement<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -894,7 +894,7 @@ pub struct TSTypeLiteral<'a> {
pub members: Vec<'a, TSSignature<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -904,7 +904,7 @@ pub struct TSInferType<'a> {
pub type_parameter: Box<'a, TSTypeParameter<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -921,7 +921,7 @@ inherit_variants! {
/// Inherits variants from [`TSTypeName`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -933,7 +933,7 @@ pub enum TSTypeQueryExprName<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -947,7 +947,7 @@ pub struct TSImportType<'a> {
pub type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -957,7 +957,7 @@ pub struct TSImportAttributes<'a> {
pub elements: Vec<'a, TSImportAttribute<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -968,7 +968,7 @@ pub struct TSImportAttribute<'a> {
pub value: Expression<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(untagged))]
@ -977,7 +977,7 @@ pub enum TSImportAttributeName<'a> {
StringLiteral(StringLiteral<'a>),
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -990,7 +990,7 @@ pub struct TSFunctionType<'a> {
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1003,7 +1003,7 @@ pub struct TSConstructorType<'a> {
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
}
#[visited_node]
#[ast(visit)]
#[scope]
#[derive(Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1031,7 +1031,7 @@ pub enum TSMappedTypeModifierOperator {
None,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1042,7 +1042,7 @@ pub struct TSTemplateLiteralType<'a> {
pub types: Vec<'a, TSType<'a>>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1053,7 +1053,7 @@ pub struct TSAsExpression<'a> {
pub type_annotation: TSType<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1064,7 +1064,7 @@ pub struct TSSatisfiesExpression<'a> {
pub type_annotation: TSType<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1075,7 +1075,7 @@ pub struct TSTypeAssertion<'a> {
pub type_annotation: TSType<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1093,7 +1093,7 @@ inherit_variants! {
/// Inherits variants from [`TSTypeName`]. See [`ast` module docs] for explanation of inheritance.
///
/// [`ast` module docs]: `super`
#[visited_node]
#[ast(visit)]
#[repr(C, u8)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
@ -1105,7 +1105,7 @@ pub enum TSModuleReference<'a> {
}
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1115,7 +1115,7 @@ pub struct TSExternalModuleReference<'a> {
pub expression: StringLiteral<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1125,7 +1125,7 @@ pub struct TSNonNullExpression<'a> {
pub expression: Expression<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1138,7 +1138,7 @@ pub struct Decorator<'a> {
/// Export Assignment in non-module files
///
/// `export = foo`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1151,7 +1151,7 @@ pub struct TSExportAssignment<'a> {
/// Namespace Export Declaration in declaration files
///
/// `export as namespace foo`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1161,7 +1161,7 @@ pub struct TSNamespaceExportDeclaration<'a> {
pub id: IdentifierName<'a>,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1183,7 +1183,7 @@ pub enum ImportOrExportKind {
// [`JSDoc`](https://github.com/microsoft/TypeScript/blob/54a554d8af2657630307cbfa8a3e4f3946e36507/src/compiler/types.ts#L393)
/// `type foo = ty?` or `type foo = ?ty`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1195,7 +1195,7 @@ pub struct JSDocNullableType<'a> {
}
/// `type foo = ty!` or `type foo = !ty`
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]
@ -1206,7 +1206,7 @@ pub struct JSDocNonNullableType<'a> {
pub postfix: bool,
}
#[visited_node]
#[ast(visit)]
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serialize", derive(Serialize, Tsify))]
#[cfg_attr(feature = "serialize", serde(tag = "type", rename_all = "camelCase"))]

View file

@ -1,6 +1,3 @@
// NB: `#[visited_node]` attribute on AST nodes does not do anything to the code in this file.
// It is purely a marker for codegen used in `oxc_traverse`. See docs in that crate.
use crate::ast::*;
use std::{cell::Cell, fmt, hash::Hash};

View file

@ -1,8 +1,5 @@
//! Literals
// NB: `#[visited_node]` attribute on AST nodes does not do anything to the code in this file.
// It is purely a marker for codegen used in `oxc_traverse`. See docs in that crate.
// Silence erroneous warnings from Rust Analyser for `#[derive(Tsify)]`
#![allow(non_snake_case)]

View file

@ -3,9 +3,6 @@
//! [AST Spec](https://github.com/typescript-eslint/typescript-eslint/tree/main/packages/ast-spec)
//! [Archived TypeScript spec](https://github.com/microsoft/TypeScript/blob/3c99d50da5a579d9fa92d02664b1b66d4ff55944/doc/spec-ARCHIVED.md)
// NB: `#[visited_node]` attribute on AST nodes does not do anything to the code in this file.
// It is purely a marker for codegen used in `oxc_traverse`. See docs in that crate.
use std::{cell::Cell, hash::Hash};
use oxc_allocator::Vec;

View file

@ -5,24 +5,24 @@ use std::str::FromStr;
///
/// Macro does not generate any code - it's purely a means to communicate information to the codegen.
///
/// Only thing macro does is add `#[derive(VisitedNode)]` to the item.
/// Deriving `VisitedNode` does nothing, but supports the `#[scope]` attr on struct fields.
/// Only thing macro does is add `#[derive(Ast)]` to the item.
/// Deriving `Ast` does nothing, but supports the `#[scope]` attr on struct fields.
/// This is a workaround for Rust not supporting helper attributes for `proc_macro_attribute` macros,
/// so we need to use a derive macro to get that support.
///
/// Use native Rust `TokenStream`, to avoid dependency on slow-compiling crates like `syn` and `quote`.
#[proc_macro_attribute]
#[allow(clippy::missing_panics_doc)]
pub fn visited_node(_args: TokenStream, input: TokenStream) -> TokenStream {
let mut stream = TokenStream::from_str("#[derive(::oxc_ast_macros::VisitedNode)]").unwrap();
pub fn ast(_args: TokenStream, input: TokenStream) -> TokenStream {
let mut stream = TokenStream::from_str("#[derive(::oxc_ast_macros::Ast)]").unwrap();
stream.extend(input);
stream
}
/// Dummy derive macro for a non-existent trait `VisitedNode`.
/// Dummy derive macro for a non-existent trait `Ast`.
///
/// Does not generate any code, only purpose is to allow using `#[scope]` attr in the type def.
#[proc_macro_derive(VisitedNode, attributes(span, scope, visit, visit_as, visit_args))]
pub fn visited_node_derive(_item: TokenStream) -> TokenStream {
#[proc_macro_derive(Ast, attributes(span, scope, visit, visit_as, visit_args))]
pub fn ast_derive(_item: TokenStream) -> TokenStream {
TokenStream::new()
}

View file

@ -72,7 +72,8 @@ class Lines {
function parseFile(code, filename, types) {
const lines = Lines.fromCode(code, filename);
while (!lines.isEnd()) {
if (lines.current() !== '#[visited_node]') {
// if not #[ast(visit, ..)]
if (!/^#\[ast\(.*visit.*\)\]/.test(lines.current())) {
lines.next();
continue;
}
@ -87,7 +88,7 @@ function parseFile(code, filename, types) {
match = lines.next().match(/^pub (enum|struct) ((.+?)(?:<'a>)?) \{/);
if (match) break;
}
lines.position().assert(match, `Could not find enum or struct after #[visited_node]`);
lines.position().assert(match, `Could not find enum or struct after #[ast]`);
const [, kind, rawName, name] = match;
// Find end of struct / enum

View file

@ -66,7 +66,7 @@ function generateWalkForStruct(type, types) {
scopeEnterField = visitedFields.find(field => field.name === enterFieldName);
assert(
scopeEnterField,
`\`visited_node\` attr says to enter scope before field '${enterFieldName}' `
`\`ast\` attr says to enter scope before field '${enterFieldName}' `
+ `in '${type.name}', but that field is not visited`
);
if (scopeEnterField === visitedFields[0]) scopeEnterField = undefined;

View file

@ -27,7 +27,7 @@ use defs::TypeDef;
use generators::{AstBuilderGenerator, AstKindGenerator, VisitGenerator, VisitMutGenerator};
use linker::{linker, Linker};
use schema::{Inherit, Module, REnum, RStruct, RType, Schema};
use util::write_all_to;
use util::{write_all_to, NormalizeError};
use crate::generators::ImplGetSpanGenerator;
@ -250,7 +250,7 @@ fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
if let CliOptions { schema: Some(schema_path), dry_run: false, .. } = cli_options {
let path = schema_path.to_str().expect("invalid path for schema output.");
let schema = serde_json::to_string_pretty(&schema).map_err(|e| e.to_string())?;
let schema = serde_json::to_string_pretty(&schema).normalize()?;
write_all_to(schema.as_bytes(), path)?;
}

View file

@ -5,11 +5,11 @@ use syn::{
parse::{Parse, ParseBuffer},
parse_quote,
punctuated::Punctuated,
Attribute, Generics, Ident, Item, ItemConst, ItemEnum, ItemMacro, ItemStruct, ItemUse, Token,
Type, Variant, Visibility,
Attribute, Generics, Ident, Item, ItemConst, ItemEnum, ItemMacro, ItemStruct, ItemUse, Meta,
MetaList, Path, Token, Type, Variant, Visibility,
};
use crate::TypeName;
use crate::{util::NormalizeError, TypeName};
use super::{parse_file, Itertools, PathBuf, Rc, Read, RefCell, Result, TypeDef, TypeRef};
@ -40,6 +40,7 @@ impl From<Ident> for Inherit {
pub struct EnumMeta {
pub inherits: Vec<Inherit>,
pub visitable: bool,
pub ast: bool,
}
#[derive(Debug)]
@ -74,6 +75,7 @@ impl From<ItemEnum> for REnum {
#[derive(Debug, Default, Clone)]
pub struct StructMeta {
pub visitable: bool,
pub ast: bool,
}
#[derive(Debug)]
@ -152,9 +154,24 @@ impl RType {
}
pub fn set_visitable(&mut self, value: bool) -> Result<()> {
macro_rules! assign {
($it:ident) => {{
debug_assert!($it.meta.ast, "only ast types can be visitable!");
$it.meta.visitable = value;
}};
}
match self {
RType::Enum(it) => it.meta.visitable = value,
RType::Struct(it) => it.meta.visitable = value,
RType::Enum(it) => assign!(it),
RType::Struct(it) => assign!(it),
_ => return Err("Unsupported type!".to_string()),
}
Ok(())
}
pub fn set_ast(&mut self, value: bool) -> Result<()> {
match self {
RType::Enum(it) => it.meta.ast = value,
RType::Struct(it) => it.meta.ast = value,
_ => return Err("Unsupported type!".to_string()),
}
Ok(())
@ -203,10 +220,10 @@ impl Module {
pub fn load(mut self) -> Result<Self> {
assert!(!self.loaded, "can't load twice!");
let mut file = std::fs::File::open(&self.path).map_err(|e| e.to_string())?;
let mut file = std::fs::File::open(&self.path).normalize()?;
let mut content = String::new();
file.read_to_string(&mut content).map_err(|e| e.to_string())?;
let file = parse_file(content.as_str()).map_err(|e| e.to_string())?;
file.read_to_string(&mut content).normalize()?;
let file = parse_file(content.as_str()).normalize()?;
self.shebang = file.shebang;
self.attrs = file.attrs;
self.items = file
@ -311,7 +328,7 @@ pub fn expand(type_def: &TypeRef) -> Result<()> {
inherits,
))
})
.map_err(|e| e.to_string())?;
.normalize()?;
Some(RType::Enum(REnum::with_meta(
enum_,
EnumMeta {
@ -331,16 +348,46 @@ pub fn expand(type_def: &TypeRef) -> Result<()> {
}
pub fn analyze(type_def: &TypeRef) -> Result<()> {
let is_visitable = match &*type_def.borrow() {
enum AstAttr {
None,
Mark,
Visit,
}
let ast_attr = match &*type_def.borrow() {
RType::Enum(REnum { item: ItemEnum { attrs, .. }, .. })
| RType::Struct(RStruct { item: ItemStruct { attrs, .. }, .. }) => {
Some(attrs.iter().any(|attr| attr.path().is_ident("visited_node")))
let attr = attrs.iter().find(|attr| attr.path().is_ident("ast"));
let attr = match attr {
Some(Attribute { meta: Meta::Path(_), .. }) => AstAttr::Mark,
Some(attr @ Attribute { meta: Meta::List(_), .. }) => {
// TODO: support for punctuated list of arguments here!
let args = attr.parse_args::<Path>().normalize()?;
if args.is_ident("visit") {
AstAttr::Visit
} else {
AstAttr::Mark
}
}
Some(_) => return Err(String::from("Invalid arguments in the `ast` attribute!")),
None => AstAttr::None,
};
Some(attr)
}
_ => None,
};
if let Some(is_visitable) = is_visitable {
type_def.borrow_mut().set_visitable(is_visitable)?;
#[allow(clippy::match_same_arms)]
match ast_attr {
Some(AstAttr::Visit) => {
type_def.borrow_mut().set_ast(true)?;
type_def.borrow_mut().set_visitable(true)?;
}
Some(AstAttr::Mark) => {
// AST without visit!
type_def.borrow_mut().set_ast(true)?;
}
Some(AstAttr::None) => { /* non AST types */ }
None => { /* unrelated items like `use`, `type` and `macro` definitions */ }
}
Ok(())

View file

@ -5,6 +5,19 @@ use syn::{GenericArgument, Ident, PathArguments, Type, TypePath};
use crate::{CodegenCtx, TypeRef};
pub trait NormalizeError<T> {
fn normalize(self) -> crate::Result<T>;
}
impl<T, E> NormalizeError<T> for Result<T, E>
where
E: ToString,
{
fn normalize(self) -> crate::Result<T> {
self.map_err(|e| e.to_string())
}
}
pub trait TokenStreamExt {
fn replace_ident(self, needle: &str, replace: &Ident) -> TokenStream;
}