refactor(transformer/decorators): move get_decorator_info inside the decorators (#2426)

This commit is contained in:
Dunqing 2024-02-18 17:37:07 +08:00 committed by GitHub
parent 0fd945fdad
commit 4b11183732
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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)
}
} }