mirror of
https://github.com/danbulant/oxc
synced 2026-05-25 04:42:10 +00:00
refactor(transformer/decorators): move get_decorator_info inside the decorators (#2426)
This commit is contained in:
parent
0fd945fdad
commit
4b11183732
1 changed files with 135 additions and 132 deletions
|
|
@ -370,136 +370,6 @@ impl<'a> Decorators<'a> {
|
||||||
class.body.body.insert(0, static_block);
|
class.body.body.insert(0, static_block);
|
||||||
}
|
}
|
||||||
} else if has_member_decorator {
|
} else if has_member_decorator {
|
||||||
// https://github.com/babel/babel/blob/eccbd203383487f6957dcf086aa83d773691560b/packages/babel-helpers/src/helpers/applyDecs2305.ts#L7-L45
|
|
||||||
let get_decorator_info = |key: &PropertyKey<'a>,
|
|
||||||
flag: u8,
|
|
||||||
decorator: &Decorator<'a>,
|
|
||||||
ast: &AstBuilder<'a>| {
|
|
||||||
let name = key.name();
|
|
||||||
// [dec, flag, name, defaultValue | (o) => o.#a, (o, v) => o.#a = v]
|
|
||||||
let mut decorator_elements = ast.new_vec_with_capacity(2);
|
|
||||||
decorator_elements
|
|
||||||
.push(ArrayExpressionElement::Expression(ast.copy(&decorator.expression)));
|
|
||||||
decorator_elements.push(ArrayExpressionElement::Expression(
|
|
||||||
ast.literal_number_expression(NumberLiteral::new(
|
|
||||||
SPAN,
|
|
||||||
0f64,
|
|
||||||
ast.new_str(flag.to_string().as_str()),
|
|
||||||
oxc_syntax::NumberBase::Decimal,
|
|
||||||
)),
|
|
||||||
));
|
|
||||||
if let Some(name) = name {
|
|
||||||
decorator_elements.push(ArrayExpressionElement::Expression(
|
|
||||||
ast.literal_string_expression(StringLiteral::new(SPAN, name.clone())),
|
|
||||||
));
|
|
||||||
|
|
||||||
if key.is_private_identifier() {
|
|
||||||
// (o) => o.#a
|
|
||||||
let mut items = ast.new_vec_single(ast.formal_parameter(
|
|
||||||
SPAN,
|
|
||||||
ast.binding_pattern(
|
|
||||||
ast.binding_pattern_identifier(BindingIdentifier::new(
|
|
||||||
SPAN,
|
|
||||||
"o".into(),
|
|
||||||
)),
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
ast.new_vec(),
|
|
||||||
));
|
|
||||||
let private_field = ast.private_field(
|
|
||||||
SPAN,
|
|
||||||
ast.identifier_reference_expression(IdentifierReference::new(
|
|
||||||
SPAN,
|
|
||||||
"o".into(),
|
|
||||||
)),
|
|
||||||
PrivateIdentifier::new(SPAN, name),
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
let params = ast.formal_parameters(
|
|
||||||
SPAN,
|
|
||||||
FormalParameterKind::ArrowFormalParameters,
|
|
||||||
ast.copy(&items),
|
|
||||||
None,
|
|
||||||
);
|
|
||||||
decorator_elements.push(ArrayExpressionElement::Expression(
|
|
||||||
ast.arrow_expression(
|
|
||||||
SPAN,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
params,
|
|
||||||
ast.function_body(
|
|
||||||
SPAN,
|
|
||||||
ast.new_vec(),
|
|
||||||
ast.new_vec_single(ast.expression_statement(
|
|
||||||
SPAN,
|
|
||||||
ast.member_expression(ast.copy(&private_field)),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
),
|
|
||||||
));
|
|
||||||
|
|
||||||
{
|
|
||||||
// (o, v) => o.#a = v
|
|
||||||
items.push(ast.formal_parameter(
|
|
||||||
SPAN,
|
|
||||||
ast.binding_pattern(
|
|
||||||
ast.binding_pattern_identifier(BindingIdentifier::new(
|
|
||||||
SPAN,
|
|
||||||
"v".into(),
|
|
||||||
)),
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
ast.new_vec(),
|
|
||||||
));
|
|
||||||
|
|
||||||
let params = ast.formal_parameters(
|
|
||||||
SPAN,
|
|
||||||
FormalParameterKind::ArrowFormalParameters,
|
|
||||||
items,
|
|
||||||
None,
|
|
||||||
);
|
|
||||||
|
|
||||||
decorator_elements.push(ArrayExpressionElement::Expression(
|
|
||||||
ast.arrow_expression(
|
|
||||||
SPAN,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
params,
|
|
||||||
ast.function_body(
|
|
||||||
SPAN,
|
|
||||||
ast.new_vec(),
|
|
||||||
ast.new_vec_single(ast.expression_statement(
|
|
||||||
SPAN,
|
|
||||||
ast.assignment_expression(
|
|
||||||
SPAN,
|
|
||||||
AssignmentOperator::Assign,
|
|
||||||
ast.simple_assignment_target_member_expression(
|
|
||||||
private_field,
|
|
||||||
),
|
|
||||||
ast.identifier_reference_expression(
|
|
||||||
IdentifierReference::new(SPAN, "v".into()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ast.array_expression(SPAN, decorator_elements, None)
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut is_proto = false;
|
let mut is_proto = false;
|
||||||
let mut is_static = false;
|
let mut is_static = false;
|
||||||
|
|
||||||
|
|
@ -521,7 +391,7 @@ impl<'a> Decorators<'a> {
|
||||||
|
|
||||||
def.decorators.iter().for_each(|decorator| {
|
def.decorators.iter().for_each(|decorator| {
|
||||||
member_decorators_vec.push(ArrayExpressionElement::Expression(
|
member_decorators_vec.push(ArrayExpressionElement::Expression(
|
||||||
get_decorator_info(&def.key, flag, decorator, &self.ast),
|
self.get_decorator_info(&def.key, flag, decorator),
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
def.decorators.clear();
|
def.decorators.clear();
|
||||||
|
|
@ -544,7 +414,7 @@ impl<'a> Decorators<'a> {
|
||||||
|
|
||||||
def.decorators.iter().for_each(|decorator| {
|
def.decorators.iter().for_each(|decorator| {
|
||||||
member_decorators_vec.push(ArrayExpressionElement::Expression(
|
member_decorators_vec.push(ArrayExpressionElement::Expression(
|
||||||
get_decorator_info(&def.key, flag.bits(), decorator, &self.ast),
|
self.get_decorator_info(&def.key, flag.bits(), decorator),
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
def.decorators.clear();
|
def.decorators.clear();
|
||||||
|
|
@ -793,4 +663,137 @@ impl<'a> Decorators<'a> {
|
||||||
Modifiers::empty(),
|
Modifiers::empty(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// https://github.com/babel/babel/blob/eccbd203383487f6957dcf086aa83d773691560b/packages/babel-helpers/src/helpers/applyDecs2305.ts#L7-L45
|
||||||
|
fn get_decorator_info(
|
||||||
|
&self,
|
||||||
|
key: &PropertyKey<'a>,
|
||||||
|
flag: u8,
|
||||||
|
decorator: &Decorator<'a>,
|
||||||
|
) -> Expression<'a> {
|
||||||
|
let name = key.name();
|
||||||
|
// [dec, flag, name, defaultValue | (o) => o.#a, (o, v) => o.#a = v]
|
||||||
|
let mut decorator_elements = self.ast.new_vec_with_capacity(2);
|
||||||
|
decorator_elements
|
||||||
|
.push(ArrayExpressionElement::Expression(self.ast.copy(&decorator.expression)));
|
||||||
|
decorator_elements.push(ArrayExpressionElement::Expression(
|
||||||
|
self.ast.literal_number_expression(NumberLiteral::new(
|
||||||
|
SPAN,
|
||||||
|
0f64,
|
||||||
|
self.ast.new_str(flag.to_string().as_str()),
|
||||||
|
oxc_syntax::NumberBase::Decimal,
|
||||||
|
)),
|
||||||
|
));
|
||||||
|
if let Some(name) = name {
|
||||||
|
decorator_elements.push(ArrayExpressionElement::Expression(
|
||||||
|
self.ast.literal_string_expression(StringLiteral::new(SPAN, name.clone())),
|
||||||
|
));
|
||||||
|
|
||||||
|
if key.is_private_identifier() {
|
||||||
|
// (o) => o.#a
|
||||||
|
let mut items =
|
||||||
|
self.ast.new_vec_single(self.ast.formal_parameter(
|
||||||
|
SPAN,
|
||||||
|
self.ast.binding_pattern(
|
||||||
|
self.ast.binding_pattern_identifier(BindingIdentifier::new(
|
||||||
|
SPAN,
|
||||||
|
"o".into(),
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
self.ast.new_vec(),
|
||||||
|
));
|
||||||
|
let private_field = self.ast.private_field(
|
||||||
|
SPAN,
|
||||||
|
self.ast.identifier_reference_expression(IdentifierReference::new(
|
||||||
|
SPAN,
|
||||||
|
"o".into(),
|
||||||
|
)),
|
||||||
|
PrivateIdentifier::new(SPAN, name),
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
let params = self.ast.formal_parameters(
|
||||||
|
SPAN,
|
||||||
|
FormalParameterKind::ArrowFormalParameters,
|
||||||
|
self.ast.copy(&items),
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
decorator_elements.push(ArrayExpressionElement::Expression(
|
||||||
|
self.ast.arrow_expression(
|
||||||
|
SPAN,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
params,
|
||||||
|
self.ast.function_body(
|
||||||
|
SPAN,
|
||||||
|
self.ast.new_vec(),
|
||||||
|
self.ast.new_vec_single(self.ast.expression_statement(
|
||||||
|
SPAN,
|
||||||
|
self.ast.member_expression(self.ast.copy(&private_field)),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
|
{
|
||||||
|
// (o, v) => o.#a = v
|
||||||
|
items.push(self.ast.formal_parameter(
|
||||||
|
SPAN,
|
||||||
|
self.ast.binding_pattern(
|
||||||
|
self.ast.binding_pattern_identifier(BindingIdentifier::new(
|
||||||
|
SPAN,
|
||||||
|
"v".into(),
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
self.ast.new_vec(),
|
||||||
|
));
|
||||||
|
|
||||||
|
let params = self.ast.formal_parameters(
|
||||||
|
SPAN,
|
||||||
|
FormalParameterKind::ArrowFormalParameters,
|
||||||
|
items,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
|
||||||
|
decorator_elements.push(ArrayExpressionElement::Expression(
|
||||||
|
self.ast.arrow_expression(
|
||||||
|
SPAN,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
params,
|
||||||
|
self.ast.function_body(
|
||||||
|
SPAN,
|
||||||
|
self.ast.new_vec(),
|
||||||
|
self.ast.new_vec_single(self.ast.expression_statement(
|
||||||
|
SPAN,
|
||||||
|
self.ast.assignment_expression(
|
||||||
|
SPAN,
|
||||||
|
AssignmentOperator::Assign,
|
||||||
|
self.ast.simple_assignment_target_member_expression(
|
||||||
|
private_field,
|
||||||
|
),
|
||||||
|
self.ast.identifier_reference_expression(
|
||||||
|
IdentifierReference::new(SPAN, "v".into()),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.ast.array_expression(SPAN, decorator_elements, None)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue