From 22c8e2e1e9914ed161482dea9e63cd34504b6cbd Mon Sep 17 00:00:00 2001 From: magic-akari Date: Mon, 19 Feb 2024 11:14:20 +0800 Subject: [PATCH] fix(es/typescript): Handle exported JSX members (#8642) **Related issue:** - Closes #8640 --- .../fixture/issues-8xxx/8640/input/.swcrc | 19 +++++++++++++++++++ .../fixture/issues-8xxx/8640/input/index.tsx | 6 ++++++ .../fixture/issues-8xxx/8640/output/index.tsx | 6 ++++++ crates/swc_ecma_utils/src/lib.rs | 14 ++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8640/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8640/input/index.tsx create mode 100644 crates/swc/tests/fixture/issues-8xxx/8640/output/index.tsx diff --git a/crates/swc/tests/fixture/issues-8xxx/8640/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8640/input/.swcrc new file mode 100644 index 000000000000..d44c52128da8 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8640/input/.swcrc @@ -0,0 +1,19 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true + }, + "target": "es2020", + "loose": false, + "minify": { + "compress": false, + "mangle": false + }, + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8640/input/index.tsx b/crates/swc/tests/fixture/issues-8xxx/8640/input/index.tsx new file mode 100644 index 000000000000..bb831f1bd9c2 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8640/input/index.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; + +export namespace Ns { + export const Context = React.createContext() + export const Component = () => ; +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8640/output/index.tsx b/crates/swc/tests/fixture/issues-8xxx/8640/output/index.tsx new file mode 100644 index 000000000000..37f19d8dccb9 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8640/output/index.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +export var Ns; +(function(Ns) { + Ns.Context = React.createContext(); + Ns.Component = ()=>React.createElement(Ns.Context.Provider, null); +})(Ns || (Ns = {})); diff --git a/crates/swc_ecma_utils/src/lib.rs b/crates/swc_ecma_utils/src/lib.rs index 5c4b16423bcf..61562fedf53f 100644 --- a/crates/swc_ecma_utils/src/lib.rs +++ b/crates/swc_ecma_utils/src/lib.rs @@ -3212,6 +3212,20 @@ where } } } + + fn visit_mut_jsx_object(&mut self, n: &mut JSXObject) { + n.visit_mut_children_with(self); + + if let JSXObject::Ident(ident) = n { + if let Some(expr) = self.query.query_jsx(ident) { + *n = match expr { + JSXElementName::Ident(ident) => ident.into(), + JSXElementName::JSXMemberExpr(expr) => Box::new(expr).into(), + JSXElementName::JSXNamespacedName(..) => unimplemented!(), + } + } + } + } } #[cfg(test)]