refactor(transformer/decorators): optimizing code with ast.private_field (#2249)

This commit is contained in:
Dunqing 2024-02-01 22:30:48 +08:00 committed by GitHub
parent f4674f33b2
commit de6d2f5dc5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 102 additions and 99 deletions

View file

@ -599,6 +599,21 @@ impl<'a> AstBuilder<'a> {
self.member_expression(self.static_member(span, object, property, optional)) self.member_expression(self.static_member(span, object, property, optional))
} }
pub fn private_field(
&self,
span: Span,
object: Expression<'a>,
field: PrivateIdentifier,
optional: bool,
) -> MemberExpression<'a> {
MemberExpression::PrivateFieldExpression(PrivateFieldExpression {
span,
object,
field,
optional,
})
}
pub fn private_field_expression( pub fn private_field_expression(
&self, &self,
span: Span, span: Span,
@ -606,12 +621,7 @@ impl<'a> AstBuilder<'a> {
field: PrivateIdentifier, field: PrivateIdentifier,
optional: bool, optional: bool,
) -> Expression<'a> { ) -> Expression<'a> {
self.member_expression(MemberExpression::PrivateFieldExpression(PrivateFieldExpression { self.member_expression(self.private_field(span, object, field, optional))
span,
object,
field,
optional,
}))
} }
pub fn new_expression( pub fn new_expression(

View file

@ -371,37 +371,87 @@ impl<'a> Decorators<'a> {
} }
} 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 // https://github.com/babel/babel/blob/eccbd203383487f6957dcf086aa83d773691560b/packages/babel-helpers/src/helpers/applyDecs2305.ts#L7-L45
let get_decorator_info = let get_decorator_info = |key: &PropertyKey<'a>,
|key: &PropertyKey<'a>, flag: u8,
flag: u8, decorator: &Decorator<'a>,
decorator: &Decorator<'a>, ast: &AstBuilder<'a>| {
ast: &AstBuilder<'a>| { let name = key.name();
let name = key.name(); // [dec, flag, name, defaultValue | (o) => o.#a, (o, v) => o.#a = v]
// [dec, flag, name, defaultValue | (o) => o.#a, (o, v) => o.#a = v] let mut decorator_elements = ast.new_vec_with_capacity(2);
let mut decorator_elements = ast.new_vec_with_capacity(2); decorator_elements
decorator_elements .push(ArrayExpressionElement::Expression(ast.copy(&decorator.expression)));
.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( decorator_elements.push(ArrayExpressionElement::Expression(
ast.literal_number_expression(NumberLiteral::new( ast.literal_string_expression(StringLiteral::new(SPAN, name.clone())),
SPAN,
0f64,
ast.new_str(flag.to_string().as_str()),
oxc_syntax::NumberBase::Decimal,
)),
)); ));
if let Some(name) = name {
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( decorator_elements.push(ArrayExpressionElement::Expression(
ast.literal_string_expression(StringLiteral::new(SPAN, name.clone())), ast.arrow_expression(
SPAN,
true,
false,
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,
),
)); ));
if key.is_private_identifier() { {
// (o) => o.#a // (o, v) => o.#a = v
let mut items = ast.new_vec_single(ast.formal_parameter( items.push(ast.formal_parameter(
SPAN, SPAN,
ast.binding_pattern( ast.binding_pattern(
ast.binding_pattern_identifier(BindingIdentifier::new( ast.binding_pattern_identifier(BindingIdentifier::new(
SPAN, SPAN,
"o".into(), "v".into(),
)), )),
None, None,
false, false,
@ -410,21 +460,14 @@ impl<'a> Decorators<'a> {
false, false,
ast.new_vec(), ast.new_vec(),
)); ));
let private_identifier = ast.private_field_expression(
SPAN,
ast.identifier_reference_expression(IdentifierReference::new(
SPAN,
"o".into(),
)),
PrivateIdentifier::new(SPAN, name),
false,
);
let params = ast.formal_parameters( let params = ast.formal_parameters(
SPAN, SPAN,
FormalParameterKind::ArrowFormalParameters, FormalParameterKind::ArrowFormalParameters,
ast.copy(&items), items,
None, None,
); );
decorator_elements.push(ArrayExpressionElement::Expression( decorator_elements.push(ArrayExpressionElement::Expression(
ast.arrow_expression( ast.arrow_expression(
SPAN, SPAN,
@ -437,77 +480,27 @@ impl<'a> Decorators<'a> {
ast.new_vec(), ast.new_vec(),
ast.new_vec_single(ast.expression_statement( ast.new_vec_single(ast.expression_statement(
SPAN, SPAN,
ast.copy(&private_identifier), ast.assignment_expression(
)),
),
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,
ast.copy(&items),
None,
);
decorator_elements.push(ArrayExpressionElement::Expression(
ast.arrow_expression(
SPAN,
true,
false,
false,
params,
ast.function_body(
SPAN,
ast.new_vec(),
ast.new_vec_single(
ast.expression_statement(
SPAN, SPAN,
ast.assignment_expression( AssignmentOperator::Assign,
SPAN, ast.simple_assignment_target_member_expression(
AssignmentOperator::Assign, private_field,
ast.simple_assignment_target_member_expression( ),
ast.copy( ast.identifier_reference_expression(
private_identifier IdentifierReference::new(SPAN, "v".into()),
.get_member_expr()
.unwrap(),
),
),
ast.identifier_reference_expression(
IdentifierReference::new(SPAN, "v".into()),
),
), ),
), ),
), )),
), ),
None, None,
None, None,
), ),
)); ));
}
} }
} }
ast.array_expression(SPAN, decorator_elements, 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;