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
11 changes: 11 additions & 0 deletions crates/rspack_plugin_javascript/src/parser_plugin/drive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,17 @@ impl JavascriptParserPlugin for JavaScriptParserPluginDrive {
None
}

fn is_pure(&self, parser: &mut JavascriptParser, expr: &Expr) -> Option<bool> {
for plugin in &self.plugins {
let res = plugin.is_pure(parser, expr);
// `SyncBailHook`
if res.is_some() {
return res;
}
}
None
}

fn member_chain_of_call_member_chain(
&self,
parser: &mut JavascriptParser,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,12 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
}

if let Some(class_decl) = stmt.as_class_decl()
&& is_pure_class(class_decl.class(), self.unresolved_context, parser.comments)
&& is_pure_class(
parser,
class_decl.class(),
self.unresolved_context,
parser.comments,
)
{
let name = &class_decl
.ident()
Expand Down Expand Up @@ -425,15 +430,25 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
let decl = &export_default_decl.decl;

if let DefaultDecl::Class(class_expr) = decl
&& is_pure_class(&class_expr.class, self.unresolved_context, parser.comments)
&& is_pure_class(
parser,
&class_expr.class,
self.unresolved_context,
parser.comments,
)
{
let variable = Self::tag_top_level_symbol(parser, &DEFAULT_STAR_JS_WORD);
parser
.inner_graph
.class_with_top_level_symbol
.insert(decl.span(), variable);
} else if let DefaultDecl::Fn(fn_expr) = decl
&& is_pure_function(&fn_expr.function, self.unresolved_context, parser.comments)
&& is_pure_function(
parser,
&fn_expr.function,
self.unresolved_context,
parser.comments,
)
{
let variable = Self::tag_top_level_symbol(parser, &DEFAULT_STAR_JS_WORD);
parser
Expand All @@ -447,7 +462,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
// https://github.com/estree/estree/blob/master/es2015.md#exportdefaultdeclaration
// but SWC using ExportDefaultExpr to represent `export default 1`
if let ModuleDecl::ExportDefaultExpr(ExportDefaultExpr { expr, .. }) = export_decl
&& is_pure_expression(expr, self.unresolved_context, parser.comments)
&& is_pure_expression(parser, expr, self.unresolved_context, parser.comments)
{
let export_part = &**expr;
let variable = Self::tag_top_level_symbol(parser, &DEFAULT_STAR_JS_WORD);
Expand Down Expand Up @@ -485,6 +500,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {

if init.is_class()
&& is_pure_class(
parser,
&init.as_class().expect("should be class").class,
self.unresolved_context,
parser.comments,
Expand All @@ -496,7 +512,7 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
.inner_graph
.class_with_top_level_symbol
.insert(init.span(), v);
} else if is_pure_expression(init, self.unresolved_context, parser.comments) {
} else if is_pure_expression(parser, init, self.unresolved_context, parser.comments) {
let v = Self::tag_top_level_symbol(parser, name);
parser
.inner_graph
Expand Down Expand Up @@ -587,11 +603,18 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
return None;
}

let is_pure_super_class = is_pure_expression(
parser,
super_class,
self.unresolved_context,
parser.comments,
);

if let Some(v) = parser
.inner_graph
.class_with_top_level_symbol
.get(&class_decl_or_expr.span())
&& is_pure_expression(super_class, self.unresolved_context, parser.comments)
&& is_pure_super_class
{
parser.inner_graph.set_top_level_symbol(Some(v.clone()));

Expand Down Expand Up @@ -644,14 +667,14 @@ impl JavascriptParserPlugin for InnerGraphPlugin {
if !parser.inner_graph.is_enabled() || !parser.is_top_level_scope() {
return None;
}
let pure_member =
is_pure_class_member(parser, element, self.unresolved_context, parser.comments);
if let Some(v) = parser
.inner_graph
.class_with_top_level_symbol
.get(&class_decl_or_expr.span())
{
if !element.is_static()
|| is_pure_class_member(element, self.unresolved_context, parser.comments)
{
if !element.is_static() || pure_member {
parser.inner_graph.set_top_level_symbol(Some(v.clone()));
if !matches!(element, ClassMember::Method(_)) && element.is_static() {
Self::on_usage(
Expand Down
Loading
Loading