1use oxc_span::Span;
11
12use crate::ExportName;
13
14use super::types::{
15 CachedDynamicImport, CachedDynamicImportPattern, CachedExport, CachedImport, CachedMember,
16 CachedModule, CachedReExport, CachedRequireCall, CachedSuppression, IMPORT_KIND_DEFAULT,
17 IMPORT_KIND_NAMED, IMPORT_KIND_NAMESPACE, IMPORT_KIND_SIDE_EFFECT,
18};
19
20#[must_use]
22pub fn cached_to_module(
23 cached: &CachedModule,
24 file_id: fallow_types::discover::FileId,
25) -> crate::ModuleInfo {
26 use crate::{
27 DynamicImportInfo, ExportInfo, ImportInfo, ImportedName, MemberInfo, ModuleInfo,
28 ReExportInfo, RequireCallInfo,
29 };
30
31 let exports = cached
32 .exports
33 .iter()
34 .map(|e| ExportInfo {
35 name: if e.is_default {
36 ExportName::Default
37 } else {
38 ExportName::Named(e.name.clone())
39 },
40 local_name: e.local_name.clone(),
41 is_type_only: e.is_type_only,
42 is_public: e.is_public,
43 span: Span::new(e.span_start, e.span_end),
44 members: e
45 .members
46 .iter()
47 .map(|m| MemberInfo {
48 name: m.name.clone(),
49 kind: m.kind,
50 span: Span::new(m.span_start, m.span_end),
51 has_decorator: m.has_decorator,
52 })
53 .collect(),
54 super_class: e.super_class.clone(),
55 })
56 .collect();
57
58 let imports = cached
59 .imports
60 .iter()
61 .map(|i| ImportInfo {
62 source: i.source.clone(),
63 imported_name: match i.kind {
64 IMPORT_KIND_DEFAULT => ImportedName::Default,
65 IMPORT_KIND_NAMESPACE => ImportedName::Namespace,
66 IMPORT_KIND_SIDE_EFFECT => ImportedName::SideEffect,
67 _ => ImportedName::Named(i.imported_name.clone()),
69 },
70 local_name: i.local_name.clone(),
71 is_type_only: i.is_type_only,
72 span: Span::new(i.span_start, i.span_end),
73 source_span: Span::new(i.source_span_start, i.source_span_end),
74 })
75 .collect();
76
77 let re_exports = cached
78 .re_exports
79 .iter()
80 .map(|r| ReExportInfo {
81 source: r.source.clone(),
82 imported_name: r.imported_name.clone(),
83 exported_name: r.exported_name.clone(),
84 is_type_only: r.is_type_only,
85 })
86 .collect();
87
88 let dynamic_imports = cached
89 .dynamic_imports
90 .iter()
91 .map(|d| DynamicImportInfo {
92 source: d.source.clone(),
93 span: Span::new(d.span_start, d.span_end),
94 destructured_names: d.destructured_names.clone(),
95 local_name: d.local_name.clone(),
96 })
97 .collect();
98
99 let require_calls = cached
100 .require_calls
101 .iter()
102 .map(|r| RequireCallInfo {
103 source: r.source.clone(),
104 span: Span::new(r.span_start, r.span_end),
105 destructured_names: r.destructured_names.clone(),
106 local_name: r.local_name.clone(),
107 })
108 .collect();
109
110 let dynamic_import_patterns = cached
111 .dynamic_import_patterns
112 .iter()
113 .map(|p| crate::DynamicImportPattern {
114 prefix: p.prefix.clone(),
115 suffix: p.suffix.clone(),
116 span: Span::new(p.span_start, p.span_end),
117 })
118 .collect();
119
120 let suppressions = cached
121 .suppressions
122 .iter()
123 .map(|s| crate::suppress::Suppression {
124 line: s.line,
125 kind: if s.kind == 0 {
126 None
127 } else {
128 crate::suppress::IssueKind::from_discriminant(s.kind)
129 },
130 })
131 .collect();
132
133 ModuleInfo {
134 file_id,
135 exports,
136 imports,
137 re_exports,
138 dynamic_imports,
139 dynamic_import_patterns,
140 require_calls,
141 member_accesses: cached.member_accesses.clone(),
142 whole_object_uses: cached.whole_object_uses.clone(),
143 has_cjs_exports: cached.has_cjs_exports,
144 content_hash: cached.content_hash,
145 suppressions,
146 unused_import_bindings: cached.unused_import_bindings.clone(),
147 line_offsets: cached.line_offsets.clone(),
148 complexity: cached.complexity.clone(),
149 flag_uses: cached.flag_uses.clone(),
150 }
151}
152
153#[must_use]
159pub fn module_to_cached(
160 module: &crate::ModuleInfo,
161 mtime_secs: u64,
162 file_size: u64,
163) -> CachedModule {
164 CachedModule {
165 content_hash: module.content_hash,
166 mtime_secs,
167 file_size,
168 exports: module
169 .exports
170 .iter()
171 .map(|e| CachedExport {
172 name: match &e.name {
173 ExportName::Named(n) => n.clone(),
174 ExportName::Default => String::new(),
175 },
176 is_default: matches!(e.name, ExportName::Default),
177 is_type_only: e.is_type_only,
178 is_public: e.is_public,
179 local_name: e.local_name.clone(),
180 span_start: e.span.start,
181 span_end: e.span.end,
182 members: e
183 .members
184 .iter()
185 .map(|m| CachedMember {
186 name: m.name.clone(),
187 kind: m.kind,
188 span_start: m.span.start,
189 span_end: m.span.end,
190 has_decorator: m.has_decorator,
191 })
192 .collect(),
193 super_class: e.super_class.clone(),
194 })
195 .collect(),
196 imports: module
197 .imports
198 .iter()
199 .map(|i| {
200 let (kind, imported_name) = match &i.imported_name {
201 crate::ImportedName::Named(n) => (IMPORT_KIND_NAMED, n.clone()),
202 crate::ImportedName::Default => (IMPORT_KIND_DEFAULT, String::new()),
203 crate::ImportedName::Namespace => (IMPORT_KIND_NAMESPACE, String::new()),
204 crate::ImportedName::SideEffect => (IMPORT_KIND_SIDE_EFFECT, String::new()),
205 };
206 CachedImport {
207 source: i.source.clone(),
208 imported_name,
209 local_name: i.local_name.clone(),
210 is_type_only: i.is_type_only,
211 kind,
212 span_start: i.span.start,
213 span_end: i.span.end,
214 source_span_start: i.source_span.start,
215 source_span_end: i.source_span.end,
216 }
217 })
218 .collect(),
219 re_exports: module
220 .re_exports
221 .iter()
222 .map(|r| CachedReExport {
223 source: r.source.clone(),
224 imported_name: r.imported_name.clone(),
225 exported_name: r.exported_name.clone(),
226 is_type_only: r.is_type_only,
227 })
228 .collect(),
229 dynamic_imports: module
230 .dynamic_imports
231 .iter()
232 .map(|d| CachedDynamicImport {
233 source: d.source.clone(),
234 span_start: d.span.start,
235 span_end: d.span.end,
236 destructured_names: d.destructured_names.clone(),
237 local_name: d.local_name.clone(),
238 })
239 .collect(),
240 require_calls: module
241 .require_calls
242 .iter()
243 .map(|r| CachedRequireCall {
244 source: r.source.clone(),
245 span_start: r.span.start,
246 span_end: r.span.end,
247 destructured_names: r.destructured_names.clone(),
248 local_name: r.local_name.clone(),
249 })
250 .collect(),
251 member_accesses: module.member_accesses.clone(),
252 whole_object_uses: module.whole_object_uses.clone(),
253 dynamic_import_patterns: module
254 .dynamic_import_patterns
255 .iter()
256 .map(|p| CachedDynamicImportPattern {
257 prefix: p.prefix.clone(),
258 suffix: p.suffix.clone(),
259 span_start: p.span.start,
260 span_end: p.span.end,
261 })
262 .collect(),
263 has_cjs_exports: module.has_cjs_exports,
264 unused_import_bindings: module.unused_import_bindings.clone(),
265 suppressions: module
266 .suppressions
267 .iter()
268 .map(|s| CachedSuppression {
269 line: s.line,
270 kind: s
271 .kind
272 .map_or(0, crate::suppress::IssueKind::to_discriminant),
273 })
274 .collect(),
275 line_offsets: module.line_offsets.clone(),
276 complexity: module.complexity.clone(),
277 flag_uses: module.flag_uses.clone(),
278 }
279}