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