From af33f876c33cd30a913606f64cb9f146bee4af41 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Wed, 2 Oct 2024 13:47:56 +0800 Subject: [PATCH 1/2] perf(es/typescript): Reduce unnecessary visits --- .../src/strip_import_export.rs | 40 +++++++++---------- .../src/typescript.rs | 3 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/crates/swc_ecma_transforms_typescript/src/strip_import_export.rs b/crates/swc_ecma_transforms_typescript/src/strip_import_export.rs index 65719a3922a4..ecb5362d5a6c 100644 --- a/crates/swc_ecma_transforms_typescript/src/strip_import_export.rs +++ b/crates/swc_ecma_transforms_typescript/src/strip_import_export.rs @@ -1,5 +1,3 @@ -use std::mem; - use swc_common::collections::{AHashMap, AHashSet}; use swc_ecma_ast::*; use swc_ecma_utils::stack_size::maybe_grow_default; @@ -8,7 +6,7 @@ use swc_ecma_visit::{noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith}; use crate::{strip_type::IsConcrete, ImportsNotUsedAsValues}; #[derive(Debug, Default)] -struct UsageCollect { +pub(crate) struct UsageCollect { id_usage: AHashSet, import_chain: AHashMap, } @@ -145,7 +143,7 @@ fn get_module_ident(ts_entity_name: &TsEntityName) -> &Ident { } #[derive(Debug, Default)] -struct DeclareCollect { +pub(crate) struct DeclareCollect { id_type: AHashSet, id_value: AHashSet, } @@ -284,20 +282,22 @@ impl DeclareCollect { /// import. #[derive(Default)] pub(crate) struct StripImportExport { - pub id_usage: AHashSet, pub import_not_used_as_values: ImportsNotUsedAsValues, + pub usage_info: UsageCollect, + pub declare_info: DeclareCollect, } impl VisitMut for StripImportExport { - fn visit_mut_module_items(&mut self, n: &mut Vec) { - let mut usage_info = UsageCollect::from(mem::take(&mut self.id_usage)); - let mut declare_info = DeclareCollect::default(); + fn visit_mut_module(&mut self, n: &mut Module) { + n.visit_with(&mut self.usage_info); + n.visit_with(&mut self.declare_info); - n.visit_with(&mut usage_info); - n.visit_with(&mut declare_info); + self.usage_info.analyze_import_chain(); - usage_info.analyze_import_chain(); + n.visit_mut_children_with(self); + } + fn visit_mut_module_items(&mut self, n: &mut Vec) { let mut strip_ts_import_equals = StripTsImportEquals; n.retain_mut(|module_item| match module_item { @@ -317,29 +317,29 @@ impl VisitMut for StripImportExport { let id = named.local.to_id(); - if declare_info.has_value(&id) { + if self.declare_info.has_value(&id) { return false; } - usage_info.has_usage(&id) + self.usage_info.has_usage(&id) } ImportSpecifier::Default(default) => { let id = default.local.to_id(); - if declare_info.has_value(&id) { + if self.declare_info.has_value(&id) { return false; } - usage_info.has_usage(&id) + self.usage_info.has_usage(&id) } ImportSpecifier::Namespace(namespace) => { let id = namespace.local.to_id(); - if declare_info.has_value(&id) { + if self.declare_info.has_value(&id) { return false; } - usage_info.has_usage(&id) + self.usage_info.has_usage(&id) } }); @@ -363,7 +363,7 @@ impl VisitMut for StripImportExport { }) if src.is_none() => { let id = ident.to_id(); - !declare_info.has_pure_type(&id) + !self.declare_info.has_pure_type(&id) } ExportSpecifier::Named(ExportNamedSpecifier { is_type_only, .. }) => { !is_type_only @@ -383,7 +383,7 @@ impl VisitMut for StripImportExport { .map(|ident| { let id = ident.to_id(); - !declare_info.has_pure_type(&id) + !self.declare_info.has_pure_type(&id) }) .unwrap_or(true), ModuleItem::ModuleDecl(ModuleDecl::TsImportEquals(ts_import_equals_decl)) => { @@ -395,7 +395,7 @@ impl VisitMut for StripImportExport { return true; } - usage_info.has_usage(&ts_import_equals_decl.id.to_id()) + self.usage_info.has_usage(&ts_import_equals_decl.id.to_id()) } ModuleItem::Stmt(Stmt::Decl(Decl::TsModule(ref ts_module))) if ts_module.body.is_some() => diff --git a/crates/swc_ecma_transforms_typescript/src/typescript.rs b/crates/swc_ecma_transforms_typescript/src/typescript.rs index e99181156d2c..f60fde8fb8e2 100644 --- a/crates/swc_ecma_transforms_typescript/src/typescript.rs +++ b/crates/swc_ecma_transforms_typescript/src/typescript.rs @@ -44,8 +44,9 @@ impl VisitMut for TypeScript { if !self.config.verbatim_module_syntax { n.visit_mut_with(&mut StripImportExport { - id_usage: mem::take(&mut self.id_usage), import_not_used_as_values: self.config.import_not_used_as_values, + usage_info: mem::take(&mut self.id_usage).into(), + ..Default::default() }); } From ed09efefb9851c7ae988040887bcd246964c12fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 2 Oct 2024 15:09:12 +0900 Subject: [PATCH 2/2] Create thick-ants-applaud.md --- .changeset/thick-ants-applaud.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/thick-ants-applaud.md diff --git a/.changeset/thick-ants-applaud.md b/.changeset/thick-ants-applaud.md new file mode 100644 index 000000000000..0e5fc9045996 --- /dev/null +++ b/.changeset/thick-ants-applaud.md @@ -0,0 +1,6 @@ +--- +swc_ecma_transforms_typescript: patch +swc_core: patch +--- + +perf(es/typescript): Reduce unnecessary visits