diff --git a/crates/rspack_core/src/cache/persistent/occasion/make/alternatives/module.rs b/crates/rspack_core/src/cache/persistent/occasion/make/alternatives/module.rs index f27bf7b10c76..4f071ed46baf 100644 --- a/crates/rspack_core/src/cache/persistent/occasion/make/alternatives/module.rs +++ b/crates/rspack_core/src/cache/persistent/occasion/make/alternatives/module.rs @@ -26,14 +26,14 @@ pub struct TempModule { impl TempModule { pub fn transform_from(module: OwnedOrRef) -> OwnedOrRef { let m = module.as_ref(); - OwnedOrRef::Owned(Box::new(Self { + OwnedOrRef::Owned(BoxModule::new(Box::new(Self { id: m.identifier(), build_info: m.build_info().clone(), build_meta: m.build_meta().clone(), dependencies: m.get_dependencies().to_vec(), // clean all of blocks blocks: vec![], - })) + }))) } } diff --git a/crates/rspack_core/src/compilation/make/graph_updater/repair/add.rs b/crates/rspack_core/src/compilation/make/graph_updater/repair/add.rs index 0ada1c36b808..2540f8c6e18e 100644 --- a/crates/rspack_core/src/compilation/make/graph_updater/repair/add.rs +++ b/crates/rspack_core/src/compilation/make/graph_updater/repair/add.rs @@ -2,7 +2,7 @@ use rspack_error::Result; use super::{TaskContext, build::BuildTask, lazy::ProcessUnlazyDependenciesTask}; use crate::{ - BoxDependency, Module, ModuleIdentifier, ModuleProfile, + BoxDependency, BoxModule, ModuleIdentifier, ModuleProfile, compilation::make::ForwardedIdSet, module_graph::{ModuleGraph, ModuleGraphModule}, utils::task_loop::{Task, TaskResult, TaskType}, @@ -11,7 +11,7 @@ use crate::{ #[derive(Debug)] pub struct AddTask { pub original_module_identifier: Option, - pub module: Box, + pub module: BoxModule, pub module_graph_module: Box, pub dependencies: Vec, pub current_profile: Option, diff --git a/crates/rspack_core/src/compilation/make/graph_updater/repair/build.rs b/crates/rspack_core/src/compilation/make/graph_updater/repair/build.rs index 6d5d531a9cc2..db7d73f6ea37 100644 --- a/crates/rspack_core/src/compilation/make/graph_updater/repair/build.rs +++ b/crates/rspack_core/src/compilation/make/graph_updater/repair/build.rs @@ -7,8 +7,9 @@ use super::{ TaskContext, lazy::ProcessUnlazyDependenciesTask, process_dependencies::ProcessDependenciesTask, }; use crate::{ - AsyncDependenciesBlock, BoxDependency, BuildContext, BuildResult, CompilationId, CompilerId, - CompilerOptions, DependencyParents, Module, ModuleProfile, ResolverFactory, SharedPluginDriver, + AsyncDependenciesBlock, BoxDependency, BoxModule, BuildContext, BuildResult, CompilationId, + CompilerId, CompilerOptions, DependencyParents, ModuleProfile, ResolverFactory, + SharedPluginDriver, compilation::make::{ForwardedIdSet, HasLazyDependencies, LazyDependencies}, utils::{ ResourceId, @@ -20,7 +21,7 @@ use crate::{ pub struct BuildTask { pub compiler_id: CompilerId, pub compilation_id: CompilationId, - pub module: Box, + pub module: BoxModule, pub current_profile: Option, pub resolver_factory: Arc, pub compiler_options: Arc, @@ -88,7 +89,7 @@ impl Task for BuildTask { #[derive(Debug)] struct BuildResultTask { - pub module: Box, + pub module: BoxModule, pub build_result: Box, pub plugin_driver: SharedPluginDriver, pub current_profile: Option, diff --git a/crates/rspack_core/src/context_module_factory.rs b/crates/rspack_core/src/context_module_factory.rs index d734c55338a0..809dc5191467 100644 --- a/crates/rspack_core/src/context_module_factory.rs +++ b/crates/rspack_core/src/context_module_factory.rs @@ -304,10 +304,7 @@ impl ContextModuleFactory { context_options: dependency.options().clone(), type_prefix: dependency.type_prefix(), }; - let module = Box::new(ContextModule::new( - self.resolve_dependencies.clone(), - options.clone(), - )); + let module = ContextModule::new(self.resolve_dependencies.clone(), options.clone()).boxed(); (module, Some(options)) } Ok(ResolveResult::Ignored) => { @@ -383,9 +380,10 @@ impl ContextModuleFactory { let module = ContextModule::new( after_resolve_data.resolve_dependencies, context_module_options.clone(), - ); + ) + .boxed(); - Ok(Some(ModuleFactoryResult::new_with_module(Box::new(module)))) + Ok(Some(ModuleFactoryResult::new_with_module(module))) } } } diff --git a/crates/rspack_core/src/dependency/runtime_template.rs b/crates/rspack_core/src/dependency/runtime_template.rs index 2eb253c7fbb2..2ffc88d50594 100644 --- a/crates/rspack_core/src/dependency/runtime_template.rs +++ b/crates/rspack_core/src/dependency/runtime_template.rs @@ -494,9 +494,9 @@ fn get_outgoing_async_modules( helper( compilation, mg, - &**mg - .module_by_identifier(&module) - .expect("should have module"), + mg.module_by_identifier(&module) + .expect("should have module") + .as_ref(), set, visited, ); @@ -547,7 +547,7 @@ pub fn import_statement( ); if phase.is_defer() && !target_module.build_meta().has_top_level_await { - let async_deps = get_outgoing_async_modules(compilation, &**target_module); + let async_deps = get_outgoing_async_modules(compilation, target_module.as_ref()); let import_content = format!( "/* deferred ESM import */{opt_declaration}{import_var} = {};\n", get_property_accessed_deferred_module(exports_type, &module_id_expr, async_deps) diff --git a/crates/rspack_core/src/module.rs b/crates/rspack_core/src/module.rs index 2a17505d1947..8a970bbffcc1 100644 --- a/crates/rspack_core/src/module.rs +++ b/crates/rspack_core/src/module.rs @@ -10,7 +10,7 @@ use async_trait::async_trait; use json::JsonValue; use rspack_cacheable::{ cacheable, cacheable_dyn, - with::{AsOption, AsPreset, AsVec}, + with::{AsInner, AsInnerConverter, AsOption, AsPreset, AsVec}, }; use rspack_collections::{Identifiable, Identifier, IdentifierMap, IdentifierSet}; use rspack_error::{Diagnosable, Result}; @@ -522,22 +522,82 @@ pub fn module_update_hash( } pub trait ModuleExt { - fn boxed(self) -> Box; + fn boxed(self) -> BoxModule; } impl ModuleExt for T { - fn boxed(self) -> Box { - Box::new(self) + fn boxed(self) -> BoxModule { + BoxModule(Box::new(self)) } } -pub type BoxModule = Box; +/// A newtype wrapper around `Box` for improved type safety. +#[cacheable(with=AsInner)] +#[repr(transparent)] +pub struct BoxModule(Box); -impl Identifiable for Box { +impl BoxModule { + /// Create a new BoxModule from a boxed Module trait object. + pub fn new(module: Box) -> Self { + BoxModule(module) + } +} + +impl AsInnerConverter for BoxModule { + type Inner = Box; + + fn to_inner(&self) -> &Self::Inner { + &self.0 + } + + fn from_inner(data: Self::Inner) -> Self { + BoxModule(data) + } +} + +impl std::ops::Deref for BoxModule { + type Target = Box; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::ops::DerefMut for BoxModule { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl From> for BoxModule { + fn from(inner: Box) -> Self { + BoxModule(inner) + } +} + +impl AsRef for BoxModule { + fn as_ref(&self) -> &dyn Module { + self.0.as_ref() + } +} + +impl AsMut for BoxModule { + fn as_mut(&mut self) -> &mut dyn Module { + self.0.as_mut() + } +} + +impl Debug for BoxModule { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Identifiable for BoxModule { /// Uniquely identify a module. If two modules share the same module identifier, then they are considered as the same module. /// e.g `javascript/auto|/index.js` and `javascript/auto|/index.js` are considered as the same. fn identifier(&self) -> Identifier { - self.as_ref().identifier() + self.0.as_ref().identifier() } } @@ -636,7 +696,7 @@ mod test { use rspack_sources::BoxSource; use rspack_util::source_map::{ModuleSourceMapConfig, SourceMapKind}; - use super::Module; + use super::{BoxModule, Module}; use crate::{ AsyncDependenciesBlockIdentifier, BuildContext, BuildResult, CodeGenerationResult, Compilation, ConcatenationScope, Context, DependenciesBlock, DependencyId, ModuleExt, ModuleGraph, @@ -776,8 +836,8 @@ mod test { #[test] fn should_downcast_successfully() { - let a: Box = ExternalModule(String::from("a")).boxed(); - let b: Box = RawModule(String::from("a")).boxed(); + let a: BoxModule = ExternalModule(String::from("a")).boxed(); + let b: BoxModule = RawModule(String::from("a")).boxed(); assert!(a.downcast_ref::().is_some()); assert!(b.downcast_ref::().is_some()); diff --git a/crates/rspack_core/src/self_module_factory.rs b/crates/rspack_core/src/self_module_factory.rs index 76e789ee0aa0..02deec843bd5 100644 --- a/crates/rspack_core/src/self_module_factory.rs +++ b/crates/rspack_core/src/self_module_factory.rs @@ -1,6 +1,6 @@ use rspack_error::Result; -use crate::{ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, SelfModule}; +use crate::{ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, SelfModule}; #[derive(Debug)] pub struct SelfModuleFactory; @@ -11,8 +11,8 @@ impl ModuleFactory for SelfModuleFactory { let issuer = data .issuer_identifier .expect("self module must have issuer"); - Ok(ModuleFactoryResult::new_with_module(Box::new( - SelfModule::new(issuer), - ))) + Ok(ModuleFactoryResult::new_with_module( + SelfModule::new(issuer).boxed(), + )) } } diff --git a/crates/rspack_plugin_devtool/src/source_map_dev_tool_module_options_plugin.rs b/crates/rspack_plugin_devtool/src/source_map_dev_tool_module_options_plugin.rs index b3540ad140a0..a40915cc277d 100644 --- a/crates/rspack_plugin_devtool/src/source_map_dev_tool_module_options_plugin.rs +++ b/crates/rspack_plugin_devtool/src/source_map_dev_tool_module_options_plugin.rs @@ -37,7 +37,8 @@ async fn build_module( module.set_source_map_kind(SourceMapKind::SimpleSourceMap); } if self.cheap { - module.set_source_map_kind(*module.get_source_map_kind() | SourceMapKind::Cheap) + let current_kind = *module.get_source_map_kind(); + module.set_source_map_kind(current_kind | SourceMapKind::Cheap) } Ok(()) } @@ -58,7 +59,8 @@ async fn runtime_module( module.set_source_map_kind(SourceMapKind::SimpleSourceMap); } if self.cheap { - module.set_source_map_kind(*module.get_source_map_kind() | SourceMapKind::Cheap) + let current_kind = *module.get_source_map_kind(); + module.set_source_map_kind(current_kind | SourceMapKind::Cheap) } Ok(()) } diff --git a/crates/rspack_plugin_dll/src/dll_entry/dll_module_factory.rs b/crates/rspack_plugin_dll/src/dll_entry/dll_module_factory.rs index 57481504334d..623e6a3a5ff5 100644 --- a/crates/rspack_plugin_dll/src/dll_entry/dll_module_factory.rs +++ b/crates/rspack_plugin_dll/src/dll_entry/dll_module_factory.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use rspack_core::{ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; +use rspack_core::{ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; use rspack_error::Result; use super::{dll_entry_dependency::DllEntryDependency, dll_module::DllModule}; @@ -16,7 +16,7 @@ impl ModuleFactory for DllModuleFactory { .expect("unreachable"); Ok(ModuleFactoryResult { - module: Some(Box::new(DllModule::new(dll_entry_dependency))), + module: Some(DllModule::new(dll_entry_dependency).boxed()), }) } } diff --git a/crates/rspack_plugin_dll/src/dll_reference/delegated_plugin.rs b/crates/rspack_plugin_dll/src/dll_reference/delegated_plugin.rs index e614c15d9555..d7753b3cb4cc 100644 --- a/crates/rspack_plugin_dll/src/dll_reference/delegated_plugin.rs +++ b/crates/rspack_plugin_dll/src/dll_reference/delegated_plugin.rs @@ -1,7 +1,7 @@ use rspack_core::{ BoxModule, Compilation, CompilationParams, CompilerCompilation, Context, DependencyType, - LibIdentOptions, ModuleFactoryCreateData, NormalModuleCreateData, NormalModuleFactoryFactorize, - NormalModuleFactoryModule, Plugin, + LibIdentOptions, ModuleExt, ModuleFactoryCreateData, NormalModuleCreateData, + NormalModuleFactoryFactorize, NormalModuleFactoryModule, Plugin, }; use rspack_error::Result; use rspack_hook::{plugin, plugin_hook}; @@ -87,26 +87,32 @@ async fn factorize(&self, data: &mut ModuleFactoryCreateData) -> Result() .expect("unreachable"); - Ok(ModuleFactoryResult::new_with_module(Box::new( - CssModule::new(css_dep.clone()), - ))) + Ok(ModuleFactoryResult::new_with_module( + CssModule::new(css_dep.clone()).boxed(), + )) } } diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/esm_export_imported_specifier_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/esm_export_imported_specifier_dependency.rs index a0d690ddddf1..043b83a04de7 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/esm_export_imported_specifier_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/esm_export_imported_specifier_dependency.rs @@ -1323,7 +1323,7 @@ impl Dependency for ESMExportImportedSpecifierDependency { let ids = self.get_ids(module_graph); if let Some(should_error) = self .export_presence_mode - .get_effective_export_presence(&**module) + .get_effective_export_presence(module.as_ref()) { let mut diagnostics = Vec::new(); // don't need to check the import specifier is existed or not when name is None (export *) diff --git a/crates/rspack_plugin_javascript/src/dependency/esm/esm_import_specifier_dependency.rs b/crates/rspack_plugin_javascript/src/dependency/esm/esm_import_specifier_dependency.rs index 92afe8a5c631..9a100dd4b410 100644 --- a/crates/rspack_plugin_javascript/src/dependency/esm/esm_import_specifier_dependency.rs +++ b/crates/rspack_plugin_javascript/src/dependency/esm/esm_import_specifier_dependency.rs @@ -214,7 +214,7 @@ impl Dependency for ESMImportSpecifierDependency { let module = module_graph.module_by_identifier(module)?; if let Some(should_error) = self .export_presence_mode - .get_effective_export_presence(&**module) + .get_effective_export_presence(module.as_ref()) && let Some(diagnostic) = esm_import_dependency_get_linking_error( self, self.get_ids(module_graph), diff --git a/crates/rspack_plugin_javascript/src/plugin/flag_dependency_exports_plugin.rs b/crates/rspack_plugin_javascript/src/plugin/flag_dependency_exports_plugin.rs index 8a93c96e9bc9..afd8c74aa9e6 100644 --- a/crates/rspack_plugin_javascript/src/plugin/flag_dependency_exports_plugin.rs +++ b/crates/rspack_plugin_javascript/src/plugin/flag_dependency_exports_plugin.rs @@ -249,7 +249,7 @@ fn collect_module_exports_specs( } } - let block = &**mg.module_by_identifier(module_id)?; + let block = mg.module_by_identifier(module_id)?.as_ref(); let mut dep_ids = FxIndexSet::default(); walk_block(block, &mut dep_ids, mg); diff --git a/crates/rspack_plugin_lazy_compilation/src/plugin.rs b/crates/rspack_plugin_lazy_compilation/src/plugin.rs index 58701f5c4104..8d83771796f1 100644 --- a/crates/rspack_plugin_lazy_compilation/src/plugin.rs +++ b/crates/rspack_plugin_lazy_compilation/src/plugin.rs @@ -6,7 +6,7 @@ use std::{ use rspack_collections::IdentifierSet; use rspack_core::{ BoxModule, Compilation, CompilationId, CompilationParams, CompilerCompilation, CompilerId, - CompilerMake, DependencyType, EntryDependency, LibIdentOptions, Module, ModuleFactory, + CompilerMake, DependencyType, EntryDependency, LibIdentOptions, Module, ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleIdentifier, NormalModuleCreateData, NormalModuleFactoryModule, Plugin, }; @@ -212,7 +212,7 @@ async fn normal_module_factory_module( context: module_factory_create_data.options.context.as_str(), }); - *module = Box::new(LazyCompilationProxyModule::new( + *module = LazyCompilationProxyModule::new( module_identifier, readable_identifier, lib_ident.map(|ident| ident.into_owned()), @@ -220,7 +220,8 @@ async fn normal_module_factory_module( create_data.resource_resolve_data.resource().to_owned(), active, self.client.clone(), - )); + ) + .boxed(); Ok(()) } diff --git a/crates/rspack_plugin_mf/src/container/container_entry_module_factory.rs b/crates/rspack_plugin_mf/src/container/container_entry_module_factory.rs index 9cf1ba1db57a..d0f348dae927 100644 --- a/crates/rspack_plugin_mf/src/container/container_entry_module_factory.rs +++ b/crates/rspack_plugin_mf/src/container/container_entry_module_factory.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use rspack_core::{ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; +use rspack_core::{ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; use rspack_error::Result; use super::{ @@ -16,13 +16,14 @@ impl ModuleFactory for ContainerEntryModuleFactory { let dep = data.dependencies[0] .downcast_ref::() .expect("dependency of ContainerEntryModuleFactory should be ContainerEntryDependency"); - Ok(ModuleFactoryResult::new_with_module(Box::new( + Ok(ModuleFactoryResult::new_with_module( ContainerEntryModule::new( dep.name.clone(), dep.exposes.clone(), dep.share_scope.clone(), dep.enhanced, - ), - ))) + ) + .boxed(), + )) } } diff --git a/crates/rspack_plugin_mf/src/container/fallback_module_factory.rs b/crates/rspack_plugin_mf/src/container/fallback_module_factory.rs index f0c7c0ee5f02..3ab7e4825ae4 100644 --- a/crates/rspack_plugin_mf/src/container/fallback_module_factory.rs +++ b/crates/rspack_plugin_mf/src/container/fallback_module_factory.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use rspack_core::{ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; +use rspack_core::{ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; use rspack_error::Result; use super::{fallback_dependency::FallbackDependency, fallback_module::FallbackModule}; @@ -13,8 +13,8 @@ impl ModuleFactory for FallbackModuleFactory { let dep = data.dependencies[0] .downcast_ref::() .expect("dependency of FallbackModuleFactory should be FallbackDependency"); - Ok(ModuleFactoryResult::new_with_module(Box::new( - FallbackModule::new(dep.requests.clone()), - ))) + Ok(ModuleFactoryResult::new_with_module( + FallbackModule::new(dep.requests.clone()).boxed(), + )) } } diff --git a/crates/rspack_plugin_mf/src/sharing/provide_shared_module_factory.rs b/crates/rspack_plugin_mf/src/sharing/provide_shared_module_factory.rs index 0ff5a4a00b09..108a7b0fad6e 100644 --- a/crates/rspack_plugin_mf/src/sharing/provide_shared_module_factory.rs +++ b/crates/rspack_plugin_mf/src/sharing/provide_shared_module_factory.rs @@ -1,7 +1,9 @@ use std::borrow::Cow; use async_trait::async_trait; -use rspack_core::{ModuleDependency, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult}; +use rspack_core::{ + ModuleDependency, ModuleExt, ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, +}; use rspack_error::{Diagnosable, Diagnostic, Result}; use super::{ @@ -19,7 +21,7 @@ impl ModuleFactory for ProvideSharedModuleFactory { let dep = data.dependencies[0] .downcast_ref::() .expect("dependency of ProvideSharedModuleFactory should be ProvideSharedDependency"); - Ok(ModuleFactoryResult::new_with_module(Box::new( + Ok(ModuleFactoryResult::new_with_module( ProvideSharedModule::new( dep.share_scope.clone(), dep.name.clone(), @@ -29,8 +31,9 @@ impl ModuleFactory for ProvideSharedModuleFactory { dep.singleton, dep.required_version.clone(), dep.strict_version, - ), - ))) + ) + .boxed(), + )) } } diff --git a/crates/rspack_plugin_split_chunks/src/plugin/max_size.rs b/crates/rspack_plugin_split_chunks/src/plugin/max_size.rs index 92c452bcc7f2..d286e793adf0 100644 --- a/crates/rspack_plugin_split_chunks/src/plugin/max_size.rs +++ b/crates/rspack_plugin_split_chunks/src/plugin/max_size.rs @@ -280,7 +280,7 @@ fn deterministic_grouping_for_modules( .get_chunk_modules(chunk, &module_graph); let nodes = items.into_iter().map(|module| { - let module: &dyn Module = &**module; + let module: &dyn Module = module.as_ref(); GroupItem { module: module.identifier(),