From 4b11183732b5c547a34522423a0f7432a92e9a6d Mon Sep 17 00:00:00 2001 From: Dunqing Date: Sun, 18 Feb 2024 17:37:07 +0800 Subject: [PATCH] refactor(transformer/decorators): move get_decorator_info inside the decorators (#2426) --- .../src/proposals/decorators.rs | 267 +++++++++--------- 1 file changed, 135 insertions(+), 132 deletions(-) diff --git a/crates/oxc_transformer/src/proposals/decorators.rs b/crates/oxc_transformer/src/proposals/decorators.rs index 5e5c1a178..a60b5e6ed 100644 --- a/crates/oxc_transformer/src/proposals/decorators.rs +++ b/crates/oxc_transformer/src/proposals/decorators.rs @@ -370,136 +370,6 @@ impl<'a> Decorators<'a> { class.body.body.insert(0, static_block); } } 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_static = false; @@ -521,7 +391,7 @@ impl<'a> Decorators<'a> { def.decorators.iter().for_each(|decorator| { 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(); @@ -544,7 +414,7 @@ impl<'a> Decorators<'a> { def.decorators.iter().for_each(|decorator| { 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(); @@ -793,4 +663,137 @@ impl<'a> Decorators<'a> { 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) + } }