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) { {