Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use swc_core::{
use super::{InnerGraphPlugin, JavascriptParserPlugin};
use crate::{
dependency::{ESMImportSideEffectDependency, ESMImportSpecifierDependency},
parser_plugin::inner_graph::state::InnerGraphUsageOperation,
utils::object_properties::get_attributes,
visitors::{
AllowedMemberTypes, ExportedVariableInfo, JavascriptParser, MemberExpressionInfo, TagInfoData,
Expand Down Expand Up @@ -158,13 +159,7 @@ impl JavascriptParserPlugin for ESMImportDependencyParserPlugin {

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<ESMImportSpecifierDependency>()
{
dep.set_used_by_exports(used_by_exports);
}
}),
InnerGraphUsageOperation::ESMImportSpecifier(dep_idx),
);

Some(true)
Expand Down Expand Up @@ -226,13 +221,7 @@ impl JavascriptParserPlugin for ESMImportDependencyParserPlugin {

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<ESMImportSpecifierDependency>()
{
dep.set_used_by_exports(used_by_exports);
}
}),
InnerGraphUsageOperation::ESMImportSpecifier(dep_idx),
);

Some(true)
Expand Down Expand Up @@ -294,13 +283,7 @@ impl JavascriptParserPlugin for ESMImportDependencyParserPlugin {

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<ESMImportSpecifierDependency>()
{
dep.set_used_by_exports(used_by_exports);
}
}),
InnerGraphUsageOperation::ESMImportSpecifier(dep_idx),
);

parser.walk_expr_or_spread(&call_expr.args);
Expand Down Expand Up @@ -361,13 +344,7 @@ impl JavascriptParserPlugin for ESMImportDependencyParserPlugin {

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<ESMImportSpecifierDependency>()
{
dep.set_used_by_exports(used_by_exports);
}
}),
InnerGraphUsageOperation::ESMImportSpecifier(dep_idx),
);

Some(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use swc_core::{
},
};

use super::state::UsageCallback;
use super::state::InnerGraphUsageOperation;
use crate::{
ClassExt,
dependency::PureExpressionDependency,
Expand Down Expand Up @@ -138,16 +138,7 @@ impl InnerGraphPlugin {
let pure_part_end = pure_part.real_hi();
Self::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep = PureExpressionDependency::new(
(pure_part_start, pure_part_end).into(),
*parser.module_identifier,
);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression((pure_part_start, pure_part_end).into()),
);
}
}
Expand Down Expand Up @@ -259,7 +250,7 @@ impl InnerGraphPlugin {
}

let mut finalized = vec![];
for (symbol, cbs) in state.usage_callback_map.drain() {
for (symbol, cbs) in state.usage_map.drain() {
let usage = state.inner_graph.get(&symbol);
let used_by_exports = if let Some(usage) = usage {
match usage {
Expand All @@ -278,8 +269,31 @@ impl InnerGraphPlugin {
}
}

for (cb, used_by_exports) in finalized {
cb(parser, Some(used_by_exports));
for (op, used_by_exports) in finalized {
match op {
InnerGraphUsageOperation::PureExpression(range) => {
// Only create dependency when the expression is conditionally used
if !matches!(used_by_exports, UsedByExports::Bool(true)) {
let mut dep = PureExpressionDependency::new(range, *parser.module_identifier);
dep.set_used_by_exports(Some(used_by_exports));
parser.add_dependency(Box::new(dep));
}
}
InnerGraphUsageOperation::ESMImportSpecifier(dep_idx) => {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<crate::dependency::ESMImportSpecifierDependency>()
{
dep.set_used_by_exports(Some(used_by_exports));
}
}
InnerGraphUsageOperation::URLDependency(dep_idx) => {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<crate::dependency::URLDependency>()
{
dep.set_used_by_exports(Some(used_by_exports));
}
}
}
}
}

Expand All @@ -292,21 +306,20 @@ impl InnerGraphPlugin {
parser.inner_graph.add_usage(symbol, usage);
}

pub fn on_usage(parser: &mut JavascriptParser, on_usage_callback: UsageCallback) {
if parser.inner_graph.is_enabled() {
if let Some(symbol) = parser.inner_graph.get_top_level_symbol() {
parser
.inner_graph
.usage_callback_map
.entry(symbol)
.or_default()
.push(on_usage_callback);
} else {
on_usage_callback(parser, Some(UsedByExports::Bool(true)));
}
} else {
on_usage_callback(parser, None);
}
pub fn on_usage(parser: &mut JavascriptParser, operation: InnerGraphUsageOperation) {
if parser.inner_graph.is_enabled()
&& let Some(symbol) = parser.inner_graph.get_top_level_symbol()
{
parser
.inner_graph
.usage_map
.entry(symbol)
.or_default()
.push(operation);
// When inner graph is enabled but no top-level symbol, the expression is always used,
// so we skip adding PureExpressionDependency (same as UsedByExports::Bool(true))
}
// When inner graph is disabled, we skip adding PureExpressionDependency (same as None)
}

pub fn tag_top_level_symbol(
Expand Down Expand Up @@ -565,16 +578,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
let pure_part_end = pure_part.real_hi();
Self::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep = PureExpressionDependency::new(
(pure_part_start, pure_part_end).into(),
*parser.module_identifier,
);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression((pure_part_start, pure_part_end).into()),
);
}
}
Expand Down Expand Up @@ -623,14 +627,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {

Self::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep =
PureExpressionDependency::new(expr_span.into(), *parser.module_identifier);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression(expr_span.into()),
);
}

Expand Down Expand Up @@ -703,14 +700,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
if !matches!(element, ClassMember::Method(_)) && element.is_static() {
Self::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep =
PureExpressionDependency::new(expr_span.into(), *parser.module_identifier);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression(expr_span.into()),
);
}
} else {
Expand Down Expand Up @@ -748,29 +738,15 @@ impl JavascriptParserPlugin for InnerGraphPlugin {

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep =
PureExpressionDependency::new(super_span.into(), *parser.module_identifier);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression(super_span.into()),
);
} else if decl.init.is_none() || !decl.init.as_ref().expect("unreachable").is_class() {
let init = decl.init.as_ref().expect("should have initialization");
let init_span = init.span();

InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if !matches!(used_by_exports, Some(UsedByExports::Bool(true)) | None) {
let mut dep =
PureExpressionDependency::new(init_span.into(), *parser.module_identifier);
dep.set_used_by_exports(used_by_exports);
parser.add_dependency(Box::new(dep));
}
}),
InnerGraphUsageOperation::PureExpression(init_span.into()),
);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
use std::collections::hash_map::Entry;

use rspack_core::UsedByExports;
use rspack_core::DependencyRange;
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
use swc_core::common::Span;

use super::plugin::TopLevelSymbol;
use crate::{
parser_plugin::inner_graph::plugin::{
InnerGraphMapSetValue, InnerGraphMapUsage, InnerGraphMapValue,
},
visitors::JavascriptParser,
use crate::parser_plugin::inner_graph::plugin::{
InnerGraphMapSetValue, InnerGraphMapUsage, InnerGraphMapValue,
};

pub type UsageCallback = Box<dyn Fn(&mut JavascriptParser, Option<UsedByExports>)>;
/// The operation to be performed when processing inner graph usage.
#[derive(Debug, Clone)]
pub enum InnerGraphUsageOperation {
/// Create PureExpressionDependency with the given range
PureExpression(DependencyRange),
/// Set used_by_exports on ESMImportSpecifierDependency at the given dependency index
ESMImportSpecifier(usize),
/// Set used_by_exports on URLDependency at the given dependency index
URLDependency(usize),
}

#[derive(Default)]
pub struct InnerGraphState {
pub(crate) inner_graph: HashMap<TopLevelSymbol, InnerGraphMapValue>,
pub(crate) usage_callback_map: HashMap<TopLevelSymbol, Vec<UsageCallback>>,
pub(crate) usage_map: HashMap<TopLevelSymbol, Vec<InnerGraphUsageOperation>>,
current_top_level_symbol: Option<TopLevelSymbol>,
enable: bool,

Expand Down
14 changes: 3 additions & 11 deletions crates/rspack_plugin_javascript/src/parser_plugin/url_plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ use url::Url;

use super::JavascriptParserPlugin;
use crate::{
InnerGraphPlugin,
dependency::{URLContextDependency, URLDependency},
magic_comment::try_extract_magic_comment,
parser_plugin::inner_graph::plugin::InnerGraphPlugin,
parser_plugin::inner_graph::state::InnerGraphUsageOperation,
visitors::{ExprRef, JavascriptParser, context_reg_exp, create_context_dependency},
};

Expand Down Expand Up @@ -166,16 +167,7 @@ impl JavascriptParserPlugin for URLPlugin {
);
let dep_idx = parser.next_dependency_idx();
parser.add_dependency(Box::new(dep));
InnerGraphPlugin::on_usage(
parser,
Box::new(move |parser, used_by_exports| {
if let Some(dep) = parser.get_dependency_mut(dep_idx)
&& let Some(dep) = dep.downcast_mut::<URLDependency>()
{
dep.set_used_by_exports(used_by_exports);
}
}),
);
InnerGraphPlugin::on_usage(parser, InnerGraphUsageOperation::URLDependency(dep_idx));
return Some(true);
}

Expand Down
Loading