mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
refactor(ast): order AST type fields in visitation order (#3228)
Reorder the fields in a couple of AST types. `walk_*` functions in `oxc_traverse` visit the fields in the order they appear in AST. So this change means that decorators are visited before classes and methods that they decorate.
This commit is contained in:
parent
c84c116ac3
commit
4208733180
4 changed files with 564 additions and 562 deletions
|
|
@ -2343,13 +2343,13 @@ pub struct Class<'a> {
|
||||||
pub r#type: ClassType,
|
pub r#type: ClassType,
|
||||||
#[cfg_attr(feature = "serialize", serde(flatten))]
|
#[cfg_attr(feature = "serialize", serde(flatten))]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
pub decorators: Vec<'a, Decorator<'a>>,
|
||||||
pub id: Option<BindingIdentifier<'a>>,
|
pub id: Option<BindingIdentifier<'a>>,
|
||||||
pub super_class: Option<Expression<'a>>,
|
pub super_class: Option<Expression<'a>>,
|
||||||
pub body: Box<'a, ClassBody<'a>>,
|
pub body: Box<'a, ClassBody<'a>>,
|
||||||
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
|
pub type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
|
||||||
pub super_type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
|
pub super_type_parameters: Option<Box<'a, TSTypeParameterInstantiation<'a>>>,
|
||||||
pub implements: Option<Vec<'a, TSClassImplements<'a>>>,
|
pub implements: Option<Vec<'a, TSClassImplements<'a>>>,
|
||||||
pub decorators: Vec<'a, Decorator<'a>>,
|
|
||||||
/// Valid Modifiers: `export`, `abstract`
|
/// Valid Modifiers: `export`, `abstract`
|
||||||
pub modifiers: Modifiers<'a>,
|
pub modifiers: Modifiers<'a>,
|
||||||
}
|
}
|
||||||
|
|
@ -2499,6 +2499,7 @@ pub struct MethodDefinition<'a> {
|
||||||
pub r#type: MethodDefinitionType,
|
pub r#type: MethodDefinitionType,
|
||||||
#[cfg_attr(feature = "serialize", serde(flatten))]
|
#[cfg_attr(feature = "serialize", serde(flatten))]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
pub decorators: Vec<'a, Decorator<'a>>,
|
||||||
pub key: PropertyKey<'a>,
|
pub key: PropertyKey<'a>,
|
||||||
pub value: Box<'a, Function<'a>>, // FunctionExpression
|
pub value: Box<'a, Function<'a>>, // FunctionExpression
|
||||||
pub kind: MethodDefinitionKind,
|
pub kind: MethodDefinitionKind,
|
||||||
|
|
@ -2507,7 +2508,6 @@ pub struct MethodDefinition<'a> {
|
||||||
pub r#override: bool,
|
pub r#override: bool,
|
||||||
pub optional: bool,
|
pub optional: bool,
|
||||||
pub accessibility: Option<TSAccessibility>,
|
pub accessibility: Option<TSAccessibility>,
|
||||||
pub decorators: Vec<'a, Decorator<'a>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
|
|
|
||||||
|
|
@ -937,13 +937,13 @@ impl<'a> AstBuilder<'a> {
|
||||||
self.alloc(Class {
|
self.alloc(Class {
|
||||||
r#type,
|
r#type,
|
||||||
span,
|
span,
|
||||||
|
decorators,
|
||||||
id,
|
id,
|
||||||
super_class,
|
super_class,
|
||||||
body,
|
body,
|
||||||
type_parameters,
|
type_parameters,
|
||||||
super_type_parameters,
|
super_type_parameters,
|
||||||
implements,
|
implements,
|
||||||
decorators,
|
|
||||||
modifiers,
|
modifiers,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -2346,10 +2346,16 @@ pub(crate) unsafe fn walk_class<'a, Tr: Traverse<'a>>(
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) {
|
) {
|
||||||
traverser.enter_class(&mut *node, ctx);
|
traverser.enter_class(&mut *node, ctx);
|
||||||
ctx.push_stack(Ancestor::ClassId(ancestor::ClassWithoutId(node)));
|
ctx.push_stack(Ancestor::ClassDecorators(ancestor::ClassWithoutDecorators(node)));
|
||||||
|
for item in (*((node as *mut u8).add(ancestor::OFFSET_CLASS_DECORATORS) as *mut Vec<Decorator>))
|
||||||
|
.iter_mut()
|
||||||
|
{
|
||||||
|
walk_decorator(traverser, item as *mut _, ctx);
|
||||||
|
}
|
||||||
if let Some(field) =
|
if let Some(field) =
|
||||||
&mut *((node as *mut u8).add(ancestor::OFFSET_CLASS_ID) as *mut Option<BindingIdentifier>)
|
&mut *((node as *mut u8).add(ancestor::OFFSET_CLASS_ID) as *mut Option<BindingIdentifier>)
|
||||||
{
|
{
|
||||||
|
ctx.retag_stack(AncestorType::ClassId);
|
||||||
walk_binding_identifier(traverser, field as *mut _, ctx);
|
walk_binding_identifier(traverser, field as *mut _, ctx);
|
||||||
}
|
}
|
||||||
if let Some(field) =
|
if let Some(field) =
|
||||||
|
|
@ -2385,12 +2391,6 @@ pub(crate) unsafe fn walk_class<'a, Tr: Traverse<'a>>(
|
||||||
walk_ts_class_implements(traverser, item as *mut _, ctx);
|
walk_ts_class_implements(traverser, item as *mut _, ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.retag_stack(AncestorType::ClassDecorators);
|
|
||||||
for item in (*((node as *mut u8).add(ancestor::OFFSET_CLASS_DECORATORS) as *mut Vec<Decorator>))
|
|
||||||
.iter_mut()
|
|
||||||
{
|
|
||||||
walk_decorator(traverser, item as *mut _, ctx);
|
|
||||||
}
|
|
||||||
ctx.pop_stack();
|
ctx.pop_stack();
|
||||||
traverser.exit_class(&mut *node, ctx);
|
traverser.exit_class(&mut *node, ctx);
|
||||||
}
|
}
|
||||||
|
|
@ -2444,7 +2444,16 @@ pub(crate) unsafe fn walk_method_definition<'a, Tr: Traverse<'a>>(
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) {
|
) {
|
||||||
traverser.enter_method_definition(&mut *node, ctx);
|
traverser.enter_method_definition(&mut *node, ctx);
|
||||||
ctx.push_stack(Ancestor::MethodDefinitionKey(ancestor::MethodDefinitionWithoutKey(node)));
|
ctx.push_stack(Ancestor::MethodDefinitionDecorators(
|
||||||
|
ancestor::MethodDefinitionWithoutDecorators(node),
|
||||||
|
));
|
||||||
|
for item in (*((node as *mut u8).add(ancestor::OFFSET_METHOD_DEFINITION_DECORATORS)
|
||||||
|
as *mut Vec<Decorator>))
|
||||||
|
.iter_mut()
|
||||||
|
{
|
||||||
|
walk_decorator(traverser, item as *mut _, ctx);
|
||||||
|
}
|
||||||
|
ctx.retag_stack(AncestorType::MethodDefinitionKey);
|
||||||
walk_property_key(
|
walk_property_key(
|
||||||
traverser,
|
traverser,
|
||||||
(node as *mut u8).add(ancestor::OFFSET_METHOD_DEFINITION_KEY) as *mut PropertyKey,
|
(node as *mut u8).add(ancestor::OFFSET_METHOD_DEFINITION_KEY) as *mut PropertyKey,
|
||||||
|
|
@ -2457,13 +2466,6 @@ pub(crate) unsafe fn walk_method_definition<'a, Tr: Traverse<'a>>(
|
||||||
as *mut Box<Function>)) as *mut _,
|
as *mut Box<Function>)) as *mut _,
|
||||||
ctx,
|
ctx,
|
||||||
);
|
);
|
||||||
ctx.retag_stack(AncestorType::MethodDefinitionDecorators);
|
|
||||||
for item in (*((node as *mut u8).add(ancestor::OFFSET_METHOD_DEFINITION_DECORATORS)
|
|
||||||
as *mut Vec<Decorator>))
|
|
||||||
.iter_mut()
|
|
||||||
{
|
|
||||||
walk_decorator(traverser, item as *mut _, ctx);
|
|
||||||
}
|
|
||||||
ctx.pop_stack();
|
ctx.pop_stack();
|
||||||
traverser.exit_method_definition(&mut *node, ctx);
|
traverser.exit_method_definition(&mut *node, ctx);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue