diff --git a/crates/next-custom-transforms/src/react_compiler.rs b/crates/next-custom-transforms/src/react_compiler.rs index 984e5a771c379..f126e39d1e8e1 100644 --- a/crates/next-custom-transforms/src/react_compiler.rs +++ b/crates/next-custom-transforms/src/react_compiler.rs @@ -1,5 +1,5 @@ use swc_core::ecma::{ - ast::{Callee, Expr, FnDecl, FnExpr, Pat, Program, ReturnStmt, VarDeclarator}, + ast::{Callee, Expr, FnDecl, FnExpr, Pat, Program, ReturnStmt, Stmt, VarDeclarator}, visit::{Visit, VisitWith}, }; @@ -34,6 +34,25 @@ impl Visit for Finder { node.visit_children_with(self); } + fn visit_expr(&mut self, node: &Expr) { + if self.found { + return; + } + if matches!( + node, + Expr::JSXMember(..) + | Expr::JSXNamespacedName(..) + | Expr::JSXEmpty(..) + | Expr::JSXElement(..) + | Expr::JSXFragment(..) + ) { + self.found = true; + return; + } + + node.visit_children_with(self); + } + fn visit_fn_decl(&mut self, node: &FnDecl) { let old = self.is_interested; self.is_interested = node.ident.sym.starts_with("use") @@ -47,7 +66,7 @@ impl Visit for Finder { fn visit_fn_expr(&mut self, node: &FnExpr) { let old = self.is_interested; - self.is_interested = node.ident.as_ref().is_some_and(|ident| { + self.is_interested |= node.ident.as_ref().is_some_and(|ident| { ident.sym.starts_with("use") || ident.sym.starts_with(|c: char| c.is_ascii_uppercase()) }); @@ -69,6 +88,13 @@ impl Visit for Finder { node.visit_children_with(self); } + fn visit_stmt(&mut self, node: &Stmt) { + if self.found { + return; + } + node.visit_children_with(self); + } + fn visit_var_declarator(&mut self, node: &VarDeclarator) { let old = self.is_interested;