Skip to content

Commit 4799b51

Browse files
authored
fix: inline enum not only properties used (#11740)
1 parent 1682a94 commit 4799b51

File tree

6 files changed

+45
-67
lines changed

6 files changed

+45
-67
lines changed

crates/rspack_plugin_javascript/src/dependency/esm/esm_export_specifier_dependency.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use rspack_core::{
1010
};
1111
use swc_core::ecma::atoms::Atom;
1212

13+
use crate::is_export_inlined;
14+
1315
// Create _webpack_require__.d(__webpack_exports__, {}) for each export.
1416
#[cacheable]
1517
#[derive(Debug, Clone)]
@@ -177,15 +179,7 @@ impl DependencyTemplate for ESMExportSpecifierDependencyTemplate {
177179
return false;
178180
}
179181
let export_name = &[dep.name.clone(), enum_key.clone()];
180-
let exports_info = module_graph.get_prefetched_exports_info(
181-
&module.identifier(),
182-
PrefetchExportsInfoMode::Nested(export_name),
183-
);
184-
let Some(export_info) = exports_info.get_read_only_export_info_recursive(export_name)
185-
else {
186-
return false;
187-
};
188-
export_info.get_inline().is_some()
182+
is_export_inlined(&module_graph, &module.identifier(), export_name, *runtime)
189183
});
190184
if all_enum_member_inlined {
191185
return;

crates/rspack_plugin_javascript/src/dependency/esm/esm_import_specifier_dependency.rs

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use super::{
2525
};
2626
use crate::{
2727
connection_active_inline_value_for_esm_import_specifier, connection_active_used_by_exports,
28-
visitors::DestructuringAssignmentProperty,
28+
is_export_inlined, visitors::DestructuringAssignmentProperty,
2929
};
3030

3131
#[cacheable]
@@ -513,33 +513,7 @@ impl DependencyTemplate for ESMImportSpecifierDependencyTemplate {
513513
*runtime,
514514
&compilation.module_graph_cache_artifact,
515515
)
516-
&& {
517-
let used_name = if ids.is_empty() {
518-
let exports_info = ExportsInfoGetter::prefetch_used_info_without_name(
519-
&module_graph.get_exports_info(con.module_identifier()),
520-
&module_graph,
521-
*runtime,
522-
false,
523-
);
524-
ExportsInfoGetter::get_used_name(
525-
GetUsedNameParam::WithoutNames(&exports_info),
526-
*runtime,
527-
ids,
528-
)
529-
} else {
530-
let exports_info = module_graph.get_prefetched_exports_info(
531-
con.module_identifier(),
532-
PrefetchExportsInfoMode::Nested(ids),
533-
);
534-
ExportsInfoGetter::get_used_name(
535-
GetUsedNameParam::WithNames(&exports_info),
536-
*runtime,
537-
ids,
538-
)
539-
};
540-
541-
!used_name.map(|used| used.is_inlined()).unwrap_or_default()
542-
}
516+
&& !is_export_inlined(&module_graph, con.module_identifier(), ids, *runtime)
543517
{
544518
return;
545519
}

crates/rspack_plugin_javascript/src/dependency/export_info_dependency.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use rspack_cacheable::{
55
};
66
use rspack_core::{
77
DependencyCodeGeneration, DependencyTemplate, DependencyTemplateType, ExportProvided,
8-
PrefetchExportsInfoMode, TemplateContext, TemplateReplaceSource, UsageState, UsedExports,
8+
ExportsInfoGetter, GetUsedNameParam, PrefetchExportsInfoMode, TemplateContext,
9+
TemplateReplaceSource, UsageState, UsedExports, UsedName,
910
};
1011
use swc_core::ecma::atoms::Atom;
1112

@@ -88,17 +89,12 @@ impl ExportInfoDependency {
8889
can_mangle.map(|v| v.to_string())
8990
}
9091
"canInline" => {
91-
let inlinable = if let Some(export_info) =
92-
exports_info.get_read_only_export_info_recursive(export_name)
93-
{
94-
export_info.get_inline()
95-
} else {
96-
exports_info.other_exports_info().get_inline()
97-
};
98-
Some(match inlinable {
99-
Some(inlined) => format!("inlined {}", inlined.render()),
100-
_ => "no inline".to_string(),
101-
})
92+
let used_name = ExportsInfoGetter::get_used_name(
93+
GetUsedNameParam::WithNames(&exports_info),
94+
*runtime,
95+
export_name,
96+
);
97+
Some(matches!(used_name, Some(UsedName::Inlined(_))).to_string())
10298
}
10399
"used" => {
104100
let used = exports_info.get_used(export_name, *runtime);

crates/rspack_plugin_javascript/src/parser_plugin/inline_const.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use rspack_core::{
2-
Dependency, DependencyId, EvaluatedInlinableValue, ExportMode, ModuleGraph,
3-
ModuleGraphConnection, PrefetchExportsInfoMode, RuntimeSpec, UsageState,
2+
Dependency, DependencyId, EvaluatedInlinableValue, ExportMode, ExportsInfoGetter,
3+
GetUsedNameParam, ModuleGraph, ModuleGraphConnection, ModuleIdentifier, PrefetchExportsInfoMode,
4+
RuntimeSpec, UsageState, UsedName,
45
};
5-
use rspack_util::ryu_js;
6+
use rspack_util::{atom::Atom, ryu_js};
67
use swc_core::ecma::ast::{ModuleDecl, ModuleItem, Program, VarDeclarator};
78

89
use super::JavascriptParserPlugin;
@@ -143,6 +144,27 @@ fn inline_value_enabled(dependency_id: &DependencyId, mg: &ModuleGraph) -> bool
143144
inline_const_enabled || inline_enum_enabled
144145
}
145146

147+
pub fn is_export_inlined(
148+
mg: &ModuleGraph,
149+
module: &ModuleIdentifier,
150+
ids: &[Atom],
151+
runtime: Option<&RuntimeSpec>,
152+
) -> bool {
153+
let used_name = if ids.is_empty() {
154+
let exports_info = ExportsInfoGetter::prefetch_used_info_without_name(
155+
&mg.get_exports_info(module),
156+
mg,
157+
runtime,
158+
false,
159+
);
160+
ExportsInfoGetter::get_used_name(GetUsedNameParam::WithoutNames(&exports_info), runtime, ids)
161+
} else {
162+
let exports_info = mg.get_prefetched_exports_info(module, PrefetchExportsInfoMode::Nested(ids));
163+
ExportsInfoGetter::get_used_name(GetUsedNameParam::WithNames(&exports_info), runtime, ids)
164+
};
165+
matches!(used_name, Some(UsedName::Inlined(_)))
166+
}
167+
146168
pub fn connection_active_inline_value_for_esm_import_specifier(
147169
dependency: &ESMImportSpecifierDependency,
148170
connection: &ModuleGraphConnection,
@@ -154,14 +176,7 @@ pub fn connection_active_inline_value_for_esm_import_specifier(
154176
}
155177
let module = connection.module_identifier();
156178
let ids = dependency.get_ids(mg);
157-
let exports_info = mg.get_prefetched_exports_info(module, PrefetchExportsInfoMode::Nested(ids));
158-
if exports_info.other_exports_info().get_used(runtime) != UsageState::Unused {
159-
return true;
160-
}
161-
let Some(export_info) = exports_info.get_read_only_export_info_recursive(ids) else {
162-
return true;
163-
};
164-
export_info.get_inline().is_none()
179+
!is_export_inlined(mg, module, ids, runtime)
165180
}
166181

167182
pub fn connection_active_inline_value_for_esm_export_imported_specifier(
@@ -186,12 +201,7 @@ pub fn connection_active_inline_value_for_esm_export_imported_specifier(
186201
if item.hidden || item.checked {
187202
return true;
188203
}
189-
let exports_info =
190-
mg.get_prefetched_exports_info(module, PrefetchExportsInfoMode::Nested(&item.ids));
191-
let Some(export_info) = exports_info.get_read_only_export_info_recursive(&item.ids) else {
192-
return true;
193-
};
194-
if export_info.get_inline().is_none() {
204+
if !is_export_inlined(mg, module, &item.ids, runtime) {
195205
return true;
196206
}
197207
}

crates/rspack_plugin_javascript/src/parser_plugin/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub(crate) use self::{
5757
initialize_evaluating::InitializeEvaluating,
5858
inline_const::{
5959
InlineConstPlugin, connection_active_inline_value_for_esm_export_imported_specifier,
60-
connection_active_inline_value_for_esm_import_specifier,
60+
connection_active_inline_value_for_esm_import_specifier, is_export_inlined,
6161
},
6262
inner_graph::{connection_active_used_by_exports, plugin::*, state::InnerGraphState},
6363
javascript_meta_info_plugin::JavascriptMetaInfoPlugin,

tests/rspack-test/configCases/inline-enum/basic/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,14 @@ it("should not inline if enum is not only properties used", () => {
7373
expect(e.A).toBe(0);
7474
expect(e.B).toBe(1);
7575
})(notOnlyPropertiesUsed.E);
76+
expect(notOnlyPropertiesUsed.E.A).toBe(0);
77+
expect(notOnlyPropertiesUsed.E.B).toBe(1);
7678
// END:G
7779
const block = generated.match(/\/\/ START:G([\s\S]*)\/\/ END:G/)[1];
7880
expect(block.includes(`(e.A).toBe(0)`)).toBe(true);
7981
expect(block.includes(`(e.B).toBe(1)`)).toBe(true);
82+
expect(block.includes(`E.A).toBe(0)`)).toBe(true);
83+
expect(block.includes(`E.B).toBe(1)`)).toBe(true);
8084
expect(block.includes(`inlined export`)).toBe(false);
8185
})
8286

0 commit comments

Comments
 (0)