Skip to content

Commit 866af6c

Browse files
authoredOct 2, 2024··
perf(es/typescript): Reduce unnecessary visits (#9605)
1 parent 2f06fc5 commit 866af6c

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed
 

‎.changeset/thick-ants-applaud.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_ecma_transforms_typescript: patch
3+
swc_core: patch
4+
---
5+
6+
perf(es/typescript): Reduce unnecessary visits

‎crates/swc_ecma_transforms_typescript/src/strip_import_export.rs

+20-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::mem;
2-
31
use swc_common::collections::{AHashMap, AHashSet};
42
use swc_ecma_ast::*;
53
use swc_ecma_utils::stack_size::maybe_grow_default;
@@ -8,7 +6,7 @@ use swc_ecma_visit::{noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith};
86
use crate::{strip_type::IsConcrete, ImportsNotUsedAsValues};
97

108
#[derive(Debug, Default)]
11-
struct UsageCollect {
9+
pub(crate) struct UsageCollect {
1210
id_usage: AHashSet<Id>,
1311
import_chain: AHashMap<Id, Id>,
1412
}
@@ -145,7 +143,7 @@ fn get_module_ident(ts_entity_name: &TsEntityName) -> &Ident {
145143
}
146144

147145
#[derive(Debug, Default)]
148-
struct DeclareCollect {
146+
pub(crate) struct DeclareCollect {
149147
id_type: AHashSet<Id>,
150148
id_value: AHashSet<Id>,
151149
}
@@ -284,20 +282,22 @@ impl DeclareCollect {
284282
/// import.
285283
#[derive(Default)]
286284
pub(crate) struct StripImportExport {
287-
pub id_usage: AHashSet<Id>,
288285
pub import_not_used_as_values: ImportsNotUsedAsValues,
286+
pub usage_info: UsageCollect,
287+
pub declare_info: DeclareCollect,
289288
}
290289

291290
impl VisitMut for StripImportExport {
292-
fn visit_mut_module_items(&mut self, n: &mut Vec<ModuleItem>) {
293-
let mut usage_info = UsageCollect::from(mem::take(&mut self.id_usage));
294-
let mut declare_info = DeclareCollect::default();
291+
fn visit_mut_module(&mut self, n: &mut Module) {
292+
n.visit_with(&mut self.usage_info);
293+
n.visit_with(&mut self.declare_info);
295294

296-
n.visit_with(&mut usage_info);
297-
n.visit_with(&mut declare_info);
295+
self.usage_info.analyze_import_chain();
298296

299-
usage_info.analyze_import_chain();
297+
n.visit_mut_children_with(self);
298+
}
300299

300+
fn visit_mut_module_items(&mut self, n: &mut Vec<ModuleItem>) {
301301
let mut strip_ts_import_equals = StripTsImportEquals;
302302

303303
n.retain_mut(|module_item| match module_item {
@@ -317,29 +317,29 @@ impl VisitMut for StripImportExport {
317317

318318
let id = named.local.to_id();
319319

320-
if declare_info.has_value(&id) {
320+
if self.declare_info.has_value(&id) {
321321
return false;
322322
}
323323

324-
usage_info.has_usage(&id)
324+
self.usage_info.has_usage(&id)
325325
}
326326
ImportSpecifier::Default(default) => {
327327
let id = default.local.to_id();
328328

329-
if declare_info.has_value(&id) {
329+
if self.declare_info.has_value(&id) {
330330
return false;
331331
}
332332

333-
usage_info.has_usage(&id)
333+
self.usage_info.has_usage(&id)
334334
}
335335
ImportSpecifier::Namespace(namespace) => {
336336
let id = namespace.local.to_id();
337337

338-
if declare_info.has_value(&id) {
338+
if self.declare_info.has_value(&id) {
339339
return false;
340340
}
341341

342-
usage_info.has_usage(&id)
342+
self.usage_info.has_usage(&id)
343343
}
344344
});
345345

@@ -363,7 +363,7 @@ impl VisitMut for StripImportExport {
363363
}) if src.is_none() => {
364364
let id = ident.to_id();
365365

366-
!declare_info.has_pure_type(&id)
366+
!self.declare_info.has_pure_type(&id)
367367
}
368368
ExportSpecifier::Named(ExportNamedSpecifier { is_type_only, .. }) => {
369369
!is_type_only
@@ -383,7 +383,7 @@ impl VisitMut for StripImportExport {
383383
.map(|ident| {
384384
let id = ident.to_id();
385385

386-
!declare_info.has_pure_type(&id)
386+
!self.declare_info.has_pure_type(&id)
387387
})
388388
.unwrap_or(true),
389389
ModuleItem::ModuleDecl(ModuleDecl::TsImportEquals(ts_import_equals_decl)) => {
@@ -395,7 +395,7 @@ impl VisitMut for StripImportExport {
395395
return true;
396396
}
397397

398-
usage_info.has_usage(&ts_import_equals_decl.id.to_id())
398+
self.usage_info.has_usage(&ts_import_equals_decl.id.to_id())
399399
}
400400
ModuleItem::Stmt(Stmt::Decl(Decl::TsModule(ref ts_module)))
401401
if ts_module.body.is_some() =>

‎crates/swc_ecma_transforms_typescript/src/typescript.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ impl VisitMut for TypeScript {
4444

4545
if !self.config.verbatim_module_syntax {
4646
n.visit_mut_with(&mut StripImportExport {
47-
id_usage: mem::take(&mut self.id_usage),
4847
import_not_used_as_values: self.config.import_not_used_as_values,
48+
usage_info: mem::take(&mut self.id_usage).into(),
49+
..Default::default()
4950
});
5051
}
5152

0 commit comments

Comments
 (0)
Please sign in to comment.