Skip to content

Commit 0f1a693

Browse files
committed
refactor: nested exports info data of getters part 2
1 parent d28fc43 commit 0f1a693

File tree

6 files changed

+62
-72
lines changed

6 files changed

+62
-72
lines changed

crates/rspack_core/src/concatenated_module.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2194,10 +2194,7 @@ impl ConcatenatedModule {
21942194
let exports_info = mg.get_prefetched_exports_info(&info.id(), Some(&export_name));
21952195
// webpack use `get_exports_info` here, https://github.com/webpack/webpack/blob/ac7e531436b0d47cd88451f497cdfd0dad41535d/lib/optimize/ConcatenatedModule.js#L377-L377
21962196
// But in our arch, there is no way to modify module graph during code_generation phase, so we use `get_export_info_without_mut_module_graph` instead.`
2197-
let export_info = exports_info
2198-
.data()
2199-
.id
2200-
.get_export_info_without_mut_module_graph(mg, &export_name[0]);
2197+
let export_info = exports_info.get_export_info_without_mut_module_graph(&export_name[0]);
22012198
let export_info_hash_key = export_info.as_hash_key();
22022199

22032200
if already_visited.contains(&export_info_hash_key) {
@@ -2216,7 +2213,7 @@ impl ConcatenatedModule {
22162213
ModuleInfo::Concatenated(info) => {
22172214
let export_id = export_name.first().cloned();
22182215
if matches!(
2219-
export_info.provided(mg),
2216+
export_info.provided(),
22202217
Some(crate::ExportProvided::NotProvided)
22212218
) {
22222219
needed_namespace_objects.insert(info.module);

crates/rspack_core/src/exports/export_info.rs

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,8 @@ impl ExportInfoData {
235235
if valid_target_module_filter(&target.module) {
236236
return FindTargetRetEnum::Value(target);
237237
}
238-
let exports_info = mg.get_exports_info(&target.module);
238+
let exports_info = mg.get_prefetched_exports_info(&target.module, None);
239239
let export_info = exports_info.get_export_info_without_mut_module_graph(
240-
mg,
241240
&target.export.as_ref().expect("should have export")[0],
242241
);
243242
let export_info_hash_key = export_info.as_hash_key();
@@ -373,11 +372,11 @@ impl ExportInfoData {
373372
// and the Static variant represents the most situation which FlagDependencyExportsPlugin can
374373
// analyze the exports statically.
375374
#[derive(Debug)]
376-
pub enum MaybeDynamicTargetExportInfo {
377-
Static(ExportInfo),
375+
pub enum MaybeDynamicTargetExportInfo<'a> {
376+
Static(&'a ExportInfoData),
378377
Dynamic {
379378
export_name: Atom,
380-
other_export_info: ExportInfo,
379+
other_export_info: &'a ExportInfoData,
381380
data: ExportInfoData,
382381
},
383382
}
@@ -391,28 +390,26 @@ pub enum MaybeDynamicTargetExportInfoHashKey {
391390
},
392391
}
393392

394-
impl MaybeDynamicTargetExportInfo {
393+
impl<'a> MaybeDynamicTargetExportInfo<'a> {
395394
pub fn as_hash_key(&self) -> MaybeDynamicTargetExportInfoHashKey {
396395
match self {
397396
MaybeDynamicTargetExportInfo::Static(export_info) => {
398-
MaybeDynamicTargetExportInfoHashKey::ExportInfo(*export_info)
397+
MaybeDynamicTargetExportInfoHashKey::ExportInfo(export_info.id())
399398
}
400399
MaybeDynamicTargetExportInfo::Dynamic {
401400
export_name,
402401
other_export_info,
403402
..
404403
} => MaybeDynamicTargetExportInfoHashKey::TemporaryData {
405404
export_name: export_name.clone(),
406-
other_export_info: *other_export_info,
405+
other_export_info: other_export_info.id(),
407406
},
408407
}
409408
}
410409

411-
pub fn provided<'a>(&'a self, mg: &'a ModuleGraph) -> Option<&'a ExportProvided> {
410+
pub fn provided(&'a self) -> Option<&'a ExportProvided> {
412411
match self {
413-
MaybeDynamicTargetExportInfo::Static(export_info) => {
414-
ExportInfoGetter::provided(export_info.as_data(mg))
415-
}
412+
MaybeDynamicTargetExportInfo::Static(export_info) => ExportInfoGetter::provided(export_info),
416413
MaybeDynamicTargetExportInfo::Dynamic { data, .. } => data.provided.as_ref(),
417414
}
418415
}
@@ -433,8 +430,7 @@ impl MaybeDynamicTargetExportInfo {
433430
) -> FindTargetRetEnum {
434431
match self {
435432
MaybeDynamicTargetExportInfo::Static(export_info) => {
436-
let data = export_info.as_data(mg);
437-
data.find_target_impl(mg, valid_target_module_filter, visited)
433+
export_info.find_target_impl(mg, valid_target_module_filter, visited)
438434
}
439435
MaybeDynamicTargetExportInfo::Dynamic { data, .. } => {
440436
data.find_target_impl(mg, valid_target_module_filter, visited)
@@ -462,8 +458,7 @@ impl MaybeDynamicTargetExportInfo {
462458
) -> Option<ResolvedExportInfoTargetWithCircular> {
463459
match self {
464460
MaybeDynamicTargetExportInfo::Static(export_info) => {
465-
let export_info_data = export_info.as_data(mg);
466-
export_info_data.get_target_proxy(mg, resolve_filter, already_visited)
461+
export_info.get_target_proxy(mg, resolve_filter, already_visited)
467462
}
468463
MaybeDynamicTargetExportInfo::Dynamic { data, .. } => {
469464
if !data.target_is_set || data.target.is_empty() {
@@ -479,14 +474,10 @@ impl MaybeDynamicTargetExportInfo {
479474
}
480475
}
481476

482-
fn get_max_target<'a>(
483-
&'a self,
484-
mg: &'a ModuleGraph,
485-
) -> Cow<'a, HashMap<Option<DependencyId>, ExportInfoTargetValue>> {
477+
fn get_max_target(&self) -> Cow<HashMap<Option<DependencyId>, ExportInfoTargetValue>> {
486478
match self {
487479
MaybeDynamicTargetExportInfo::Static(export_info) => {
488-
let data = export_info.as_data(mg);
489-
ExportInfoGetter::get_max_target(data)
480+
ExportInfoGetter::get_max_target(export_info)
490481
}
491482
MaybeDynamicTargetExportInfo::Dynamic { data, .. } => ExportInfoGetter::get_max_target(data),
492483
}
@@ -498,11 +489,11 @@ impl MaybeDynamicTargetExportInfo {
498489
resolve_filter: ResolveFilterFnTy,
499490
) -> Option<ResolvedExportInfoTarget> {
500491
let data = match self {
501-
MaybeDynamicTargetExportInfo::Static(export_info) => export_info.as_data(mg),
492+
MaybeDynamicTargetExportInfo::Static(export_info) => *export_info,
502493
MaybeDynamicTargetExportInfo::Dynamic { data, .. } => data,
503494
};
504495
let target = data.get_target_with_filter(mg, resolve_filter)?;
505-
let max_target = self.get_max_target(mg);
496+
let max_target = self.get_max_target();
506497
let original_target = max_target
507498
.values()
508499
.next()
@@ -568,8 +559,8 @@ fn resolve_target(
568559
return Some(ResolvedExportInfoTargetWithCircular::Target(target));
569560
};
570561

571-
let exports_info = mg.get_exports_info(&target.module);
572-
let export_info = exports_info.get_export_info_without_mut_module_graph(mg, name);
562+
let exports_info = mg.get_prefetched_exports_info(&target.module, None);
563+
let export_info = exports_info.get_export_info_without_mut_module_graph(name);
573564
let export_info_hash_key = export_info.as_hash_key();
574565
if already_visited.contains(&export_info_hash_key) {
575566
return Some(ResolvedExportInfoTargetWithCircular::Circular);

crates/rspack_core/src/exports/exports_info.rs

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use rspack_util::atom::Atom;
77
use serde::Serialize;
88

99
use super::{
10-
ExportInfo, ExportInfoData, ExportInfoGetter, ExportInfoSetter, ExportProvided,
11-
MaybeDynamicTargetExportInfo, UsageKey, UsageState, NEXT_EXPORTS_INFO_UKEY,
10+
ExportInfo, ExportInfoData, ExportInfoGetter, ExportInfoSetter, ExportProvided, UsageKey,
11+
UsageState, NEXT_EXPORTS_INFO_UKEY,
1212
};
1313
use crate::{Compilation, DependencyId, ModuleGraph, Nullable, RuntimeSpec};
1414

@@ -241,34 +241,6 @@ impl ExportsInfo {
241241
new_info_id
242242
}
243243

244-
// An alternative version of `get_export_info`, and don't need `&mut ModuleGraph`.
245-
// You can use this when you can't or don't want to use `&mut ModuleGraph`.
246-
// Currently this function is used to finding a reexport's target.
247-
pub fn get_export_info_without_mut_module_graph(
248-
&self,
249-
mg: &ModuleGraph,
250-
name: &Atom,
251-
) -> MaybeDynamicTargetExportInfo {
252-
let exports_info = self.as_exports_info(mg);
253-
let redirect_id = exports_info.redirect_to;
254-
let other_exports_info_id = exports_info.other_exports_info;
255-
let export_info_id = exports_info.exports.get(name);
256-
if let Some(export_info_id) = export_info_id {
257-
return MaybeDynamicTargetExportInfo::Static(*export_info_id);
258-
}
259-
if let Some(redirect_id) = redirect_id {
260-
return redirect_id.get_export_info_without_mut_module_graph(mg, name);
261-
}
262-
263-
let other_export_info = mg.get_export_info_by_id(&other_exports_info_id);
264-
let data = ExportInfoData::new(Some(name.clone()), Some(other_export_info));
265-
MaybeDynamicTargetExportInfo::Dynamic {
266-
export_name: name.clone(),
267-
other_export_info: other_exports_info_id,
268-
data,
269-
}
270-
}
271-
272244
pub fn set_has_use_info(&self, mg: &mut ModuleGraph) {
273245
let exports_info = self.as_exports_info(mg);
274246
let side_effects_only_info_id = exports_info.side_effects_only_info;

crates/rspack_core/src/exports/exports_info_getter.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use super::{
77
ExportInfoData, ExportInfoGetter, ExportProvided, ExportsInfo, ProvidedExports, UsageState,
88
UsedName,
99
};
10-
use crate::{ModuleGraph, RuntimeSpec, UsedExports};
10+
use crate::{MaybeDynamicTargetExportInfo, ModuleGraph, RuntimeSpec, UsedExports};
1111

1212
/**
1313
* Used to store data pre-fetched from Module Graph
@@ -291,6 +291,39 @@ impl<'a> PrefetchedExportsInfoWrapper<'a> {
291291
}
292292
ProvidedExports::ProvidedNames(ret)
293293
}
294+
295+
// An alternative version of `get_export_info`, and don't need `&mut ModuleGraph`.
296+
// You can use this when you can't or don't want to use `&mut ModuleGraph`.
297+
// Currently this function is used to finding a reexport's target.
298+
pub fn get_export_info_without_mut_module_graph(
299+
&self,
300+
name: &Atom,
301+
) -> MaybeDynamicTargetExportInfo {
302+
self.get_export_info_without_mut_module_graph_impl(&self.entry, name)
303+
}
304+
305+
fn get_export_info_without_mut_module_graph_impl(
306+
&self,
307+
exports_info: &ExportsInfo,
308+
name: &Atom,
309+
) -> MaybeDynamicTargetExportInfo {
310+
let data = self
311+
.exports
312+
.get(exports_info)
313+
.expect("should have nested exports info");
314+
if let Some(export_info) = data.exports.get(name) {
315+
return MaybeDynamicTargetExportInfo::Static(export_info.inner);
316+
}
317+
if let Some(redirect) = &data.redirect_to {
318+
return self.get_export_info_without_mut_module_graph_impl(redirect, name);
319+
}
320+
321+
MaybeDynamicTargetExportInfo::Dynamic {
322+
export_name: name.clone(),
323+
other_export_info: data.other_exports_info.inner,
324+
data: ExportInfoData::new(Some(name.clone()), Some(data.other_exports_info.inner)),
325+
}
326+
}
294327
}
295328

296329
#[derive(Debug, Clone)]

crates/rspack_core/src/module_graph/mod.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,13 +1067,9 @@ impl<'a> ModuleGraph<'a> {
10671067
active_partial.exports_info_map.insert(id, info);
10681068
}
10691069

1070-
pub fn try_get_export_info_by_id(&self, id: &ExportInfo) -> Option<&ExportInfoData> {
1071-
self.loop_partials(|p| p.export_info_map.get(id))
1072-
}
1073-
10741070
pub fn get_export_info_by_id(&self, id: &ExportInfo) -> &ExportInfoData {
10751071
self
1076-
.try_get_export_info_by_id(id)
1072+
.loop_partials(|p| p.export_info_map.get(id))
10771073
.expect("should have export info")
10781074
}
10791075

crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -851,8 +851,8 @@ fn can_optimize_connection(
851851
if let Some(dep) = dep.downcast_ref::<ESMExportImportedSpecifierDependency>()
852852
&& let Some(name) = &dep.name
853853
{
854-
let exports_info = module_graph.get_exports_info(&original_module);
855-
let export_info = exports_info.get_export_info_without_mut_module_graph(module_graph, name);
854+
let exports_info = module_graph.get_prefetched_exports_info(&original_module, None);
855+
let export_info = exports_info.get_export_info_without_mut_module_graph(name);
856856

857857
let target = export_info.can_move_target(
858858
module_graph,
@@ -876,7 +876,7 @@ fn can_optimize_connection(
876876
.unwrap_or_else(|| ids.get(1..).unwrap_or_default().to_vec());
877877
let need_move_target = match export_info {
878878
MaybeDynamicTargetExportInfo::Static(export_info) => Some(SideEffectsDoOptimizeMoveTarget {
879-
export_info,
879+
export_info: export_info.id(),
880880
target_export: target.export,
881881
}),
882882
MaybeDynamicTargetExportInfo::Dynamic { .. } => None,
@@ -894,8 +894,9 @@ fn can_optimize_connection(
894894
&& let ids = dep.get_ids(module_graph)
895895
&& !ids.is_empty()
896896
{
897-
let exports_info = module_graph.get_exports_info(connection.module_identifier());
898-
let export_info = exports_info.get_export_info_without_mut_module_graph(module_graph, &ids[0]);
897+
let exports_info =
898+
module_graph.get_prefetched_exports_info(connection.module_identifier(), None);
899+
let export_info = exports_info.get_export_info_without_mut_module_graph(&ids[0]);
899900

900901
let target = export_info.get_target_with_filter(
901902
module_graph,

0 commit comments

Comments
 (0)