rolldown_common/ecmascript/
dynamic_import_usage.rs1use 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 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 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}