Skip to main content

rolldown_common/ecmascript/
dynamic_import_usage.rs

1use oxc::semantic::{ReferenceId, SymbolId};
2use oxc_str::CompactStr;
3use rustc_hash::{FxHashMap, FxHashSet};
4
5use crate::ImportRecordIdx;
6
7#[derive(Default, Debug)]
8pub struct DynamicImportUsageInfo {
9  /// e.g
10  /// ```js
11  /// import('mod').then(mod => {
12  ///   mod.test // ref1
13  ///   mod // ref2
14  /// })
15  /// ```
16  /// record all these dynamic import binding reference id
17  /// used for analyze how dynamic import binding is used (partially or fully used),
18  pub dynamic_import_binding_reference_id: FxHashSet<ReferenceId>,
19  pub dynamic_import_binding_to_import_record_idx: FxHashMap<SymbolId, ImportRecordIdx>,
20  pub dynamic_import_exports_usage: FxHashMap<ImportRecordIdx, DynamicImportExportsUsage>,
21}
22
23#[derive(Debug, Clone)]
24pub enum DynamicImportExportsUsage {
25  Complete,
26  Partial(FxHashSet<CompactStr>),
27  /// This is used for insert a single export to Partial
28  /// so that we don't need to create `FxHashSet` for each insertion
29  Single(CompactStr),
30}
31
32impl DynamicImportExportsUsage {
33  pub fn merge(&mut self, other: Self) {
34    match (&mut *self, other) {
35      (Self::Complete, _) => {}
36      (_, Self::Complete) => {
37        *self = DynamicImportExportsUsage::Complete;
38      }
39      (Self::Partial(lhs), rhs) => match rhs {
40        DynamicImportExportsUsage::Complete => unreachable!(),
41        DynamicImportExportsUsage::Partial(rhs) => {
42          lhs.extend(rhs);
43        }
44        DynamicImportExportsUsage::Single(name) => {
45          lhs.insert(name);
46        }
47      },
48      (Self::Single(name), rhs) => {
49        let set = match rhs {
50          DynamicImportExportsUsage::Complete => unreachable!(),
51          DynamicImportExportsUsage::Partial(mut rhs) => {
52            rhs.insert(name.clone());
53            rhs
54          }
55          DynamicImportExportsUsage::Single(rhs) => {
56            let mut set = FxHashSet::default();
57            set.insert(rhs);
58            set.insert(name.clone());
59            set
60          }
61        };
62        *self = DynamicImportExportsUsage::Partial(set);
63      }
64    }
65  }
66}