diff --git a/crates/swc_ecma_transforms_optimization/tests/__swc_snapshots__/tests/simplify_dce.rs/issue_1150_1.js b/crates/swc_ecma_transforms_optimization/tests/__swc_snapshots__/tests/simplify_dce.rs/issue_1150_1.js
index edb596654fc1..8e3efc894c5f 100644
--- a/crates/swc_ecma_transforms_optimization/tests/__swc_snapshots__/tests/simplify_dce.rs/issue_1150_1.js
+++ b/crates/swc_ecma_transforms_optimization/tests/__swc_snapshots__/tests/simplify_dce.rs/issue_1150_1.js
@@ -1,5 +1,5 @@
class A {
- constructor(o = {}){
+ constructor(o: AOptions = {}){
const { a = defaultA, c } = o;
this.#a = a;
this.#c = c;
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/input.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/input.js
new file mode 100644
index 000000000000..d69b17010155
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/input.js
@@ -0,0 +1,7 @@
+function A() {
+ return "a";
+}
+const b = "b";
+export function c() {
+ return ;
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/output.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/output.js
new file mode 100644
index 000000000000..dcc099a5ba65
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property/output.js
@@ -0,0 +1,6 @@
+function A() {
+ return "a";
+}
+export function c() {
+ return ;
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/input.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/input.js
new file mode 100644
index 000000000000..450635316d53
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/input.js
@@ -0,0 +1,8 @@
+function A() {
+ return "a";
+}
+const b = "b";
+const c = "c";
+export function d() {
+ return ;
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/output.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/output.js
new file mode 100644
index 000000000000..ef1f791b5cf2
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/property2/output.js
@@ -0,0 +1,6 @@
+function A() {
+ return "a";
+}
+export function d() {
+ return ;
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/input.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/input.js
new file mode 100644
index 000000000000..a5ee2839c7e8
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/input.js
@@ -0,0 +1,8 @@
+function A() {
+ return "a";
+}
+const b = "b";
+const c = "c";
+export function d() {
+ return {c};
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/output.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/output.js
new file mode 100644
index 000000000000..a5ee2839c7e8
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/spread/output.js
@@ -0,0 +1,8 @@
+function A() {
+ return "a";
+}
+const b = "b";
+const c = "c";
+export function d() {
+ return {c};
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/input.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/input.js
new file mode 100644
index 000000000000..819e09994e12
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/input.js
@@ -0,0 +1,8 @@
+function A() {
+ return "a";
+}
+const b = "b";
+const c = "c";
+export function d() {
+ return {c};
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/output.js b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/output.js
new file mode 100644
index 000000000000..819e09994e12
--- /dev/null
+++ b/crates/swc_ecma_transforms_optimization/tests/dce-jsx/var/output.js
@@ -0,0 +1,8 @@
+function A() {
+ return "a";
+}
+const b = "b";
+const c = "c";
+export function d() {
+ return {c};
+}
diff --git a/crates/swc_ecma_transforms_optimization/tests/fixture.rs b/crates/swc_ecma_transforms_optimization/tests/fixture.rs
index 3576f0fa1b44..9ecb1adb07f0 100644
--- a/crates/swc_ecma_transforms_optimization/tests/fixture.rs
+++ b/crates/swc_ecma_transforms_optimization/tests/fixture.rs
@@ -54,6 +54,23 @@ fn dce_repeated(input: PathBuf) {
);
}
+#[testing::fixture("tests/dce-jsx/**/input.js")]
+fn dce_jsx(input: PathBuf) {
+ let output = input.with_file_name("output.js");
+
+ test_fixture(
+ Syntax::Es(EsSyntax {
+ decorators: true,
+ jsx: true,
+ ..Default::default()
+ }),
+ &|t| chain!(remover(t), dce(Default::default(), Mark::new())),
+ &input,
+ &output,
+ Default::default(),
+ );
+}
+
#[testing::fixture("tests/expr-simplifier/**/input.js")]
fn expr(input: PathBuf) {
let output = input.with_file_name("output.js");
diff --git a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs
index 37f8ffc70bf7..12ca339d38cf 100644
--- a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs
+++ b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs
@@ -896,6 +896,24 @@ where
self.declare_decl(&n.local, true, None, false);
}
+ #[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
+ fn visit_jsx_element_name(&mut self, n: &JSXElementName) {
+ let ctx = Ctx {
+ in_pat_of_var_decl: false,
+ in_pat_of_param: false,
+ in_catch_param: false,
+ var_decl_kind_of_pat: None,
+ in_pat_of_var_decl_with_init: false,
+ ..self.ctx
+ };
+
+ n.visit_children_with(&mut *self.with_ctx(ctx));
+
+ if let JSXElementName::Ident(i) = n {
+ self.with_ctx(ctx).report_usage(i);
+ }
+ }
+
#[cfg_attr(feature = "debug", tracing::instrument(skip(self, e)))]
fn visit_member_expr(&mut self, e: &MemberExpr) {
{