fix(transformer): arrow function transform alter </this> (#3627)

Arrow function transform transforms `this` in `<this>` (JSX opening element), but was missing out transforming `</this>` (JSX closing element).
This commit is contained in:
overlookmotel 2024-06-12 02:59:22 +00:00
parent e32ce00bfb
commit 0c4ccb4906
3 changed files with 19 additions and 25 deletions

View file

@ -119,34 +119,21 @@ impl<'a> ArrowFunctions<'a> {
}
/// Change <this></this> to <_this></_this>, and mark it as found
pub fn transform_jsx_opening_element(&mut self, elem: &mut JSXOpeningElement<'a>) {
pub fn transform_jsx_element_name(&mut self, name: &mut JSXElementName<'a>) {
if !self.is_inside_arrow_function() {
return;
}
let mut change_ident = |ident: &mut JSXIdentifier<'a>| {
if ident.name == "this" {
self.mark_this_as_found();
ident.name = self.get_this_name();
let ident = match name {
JSXElementName::Identifier(ident) => ident,
JSXElementName::MemberExpression(member_expr) => {
member_expr.get_object_identifier_mut()
}
JSXElementName::NamespacedName(_) => return,
};
match &mut elem.name {
JSXElementName::Identifier(ref mut ident) => change_ident(ident),
JSXElementName::MemberExpression(ref mut member) => {
let mut member_expr = member;
loop {
match &mut member_expr.object {
JSXMemberExpressionObject::Identifier(ident) => {
change_ident(ident);
break;
}
JSXMemberExpressionObject::MemberExpression(expr) => {
member_expr = expr;
}
}
}
}
JSXElementName::NamespacedName(_) => {}
if ident.name == "this" {
self.mark_this_as_found();
ident.name = self.get_this_name();
}
}

View file

@ -43,9 +43,9 @@ impl<'a> ES2015<'a> {
}
}
pub fn transform_jsx_opening_element(&mut self, elem: &mut JSXOpeningElement<'a>) {
pub fn transform_jsx_element_name(&mut self, elem: &mut JSXElementName<'a>) {
if self.options.arrow_function.is_some() {
self.arrow_functions.transform_jsx_opening_element(elem);
self.arrow_functions.transform_jsx_element_name(elem);
}
}

View file

@ -201,7 +201,14 @@ impl<'a> Traverse<'a> for Transformer<'a> {
) {
self.x0_typescript.transform_jsx_opening_element(elem);
self.x1_react.transform_jsx_opening_element(elem, ctx);
self.x3_es2015.transform_jsx_opening_element(elem);
}
fn enter_jsx_element_name(
&mut self,
elem: &mut JSXElementName<'a>,
_ctx: &mut TraverseCtx<'a>,
) {
self.x3_es2015.transform_jsx_element_name(elem);
}
fn enter_method_definition(