From df0912a3da7e11ed82345e6c5f213b61ecfdc8b9 Mon Sep 17 00:00:00 2001 From: pshu Date: Wed, 3 Dec 2025 15:59:08 +0800 Subject: [PATCH 1/3] refactor: all deref option --- crates/rspack_core/src/compilation/mod.rs | 38 +++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/crates/rspack_core/src/compilation/mod.rs b/crates/rspack_core/src/compilation/mod.rs index f03eee9b7be8..42d293cc278a 100644 --- a/crates/rspack_core/src/compilation/mod.rs +++ b/crates/rspack_core/src/compilation/mod.rs @@ -78,7 +78,7 @@ define_hook!(CompilationExecuteModule: define_hook!(CompilationFinishModules: Series(compilation: &mut Compilation, async_modules_artifact: &mut AsyncModulesArtifact)); define_hook!(CompilationSeal: Series(compilation: &mut Compilation)); define_hook!(CompilationConcatenationScope: SeriesBail(compilation: &Compilation, curr_module: ModuleIdentifier) -> ConcatenationScope); -define_hook!(CompilationOptimizeDependencies: SeriesBail(compilation: &mut Compilation) -> bool); +define_hook!(CompilationOptimizeDependencies: SeriesBail(compilation: &mut Compilation, side_effects_optimize_artifact: &mut SideEffectsOptimizeArtifact, diagnostics: &mut Vec) -> bool); define_hook!(CompilationOptimizeModules: SeriesBail(compilation: &mut Compilation) -> bool); define_hook!(CompilationAfterOptimizeModules: Series(compilation: &mut Compilation)); define_hook!(CompilationOptimizeChunks: SeriesBail(compilation: &mut Compilation) -> bool); @@ -251,35 +251,35 @@ pub struct Compilation { // artifact for collect_dependencies_diagnostics pub dependencies_diagnostics_artifact: DerefOption, // artifact for side_effects_flag_plugin - pub side_effects_optimize_artifact: SideEffectsOptimizeArtifact, + pub side_effects_optimize_artifact: DerefOption, // artifact for module_ids - pub module_ids_artifact: ModuleIdsArtifact, + pub module_ids_artifact: DerefOption, // artifact for chunk_ids - pub chunk_ids_artifact: ChunkIdsArtifact, + pub chunk_ids_artifact: DerefOption, // artifact for code_generation pub code_generation_results: BindingCell, // artifact for create_module_hashes - pub cgm_hash_artifact: CgmHashArtifact, + pub cgm_hash_artifact: DerefOption, // artifact for process_modules_runtime_requirements - pub cgm_runtime_requirements_artifact: CgmRuntimeRequirementsArtifact, + pub cgm_runtime_requirements_artifact: DerefOption, // artifact for process_chunks_runtime_requirements - pub cgc_runtime_requirements_artifact: CgcRuntimeRequirementsArtifact, + pub cgc_runtime_requirements_artifact: DerefOption, // artifact for create_hash - pub chunk_hashes_artifact: ChunkHashesArtifact, + pub chunk_hashes_artifact: DerefOption, // artifact for create_chunk_assets - pub chunk_render_artifact: ChunkRenderArtifact, + pub chunk_render_artifact: DerefOption, // artifact for caching get_mode - pub module_graph_cache_artifact: ModuleGraphCacheArtifact, + pub module_graph_cache_artifact: DerefOption, // artifact for caching module static info - pub module_static_cache_artifact: ModuleStaticCacheArtifact, + pub module_static_cache_artifact: DerefOption, // artifact for chunk render cache - pub chunk_render_cache_artifact: ChunkRenderCacheArtifact, - pub imported_by_defer_modules_artifact: ImportedByDeferModulesArtifact, + pub chunk_render_cache_artifact: DerefOption, + pub imported_by_defer_modules_artifact: DerefOption, pub code_generated_modules: IdentifierSet, pub build_time_executed_modules: IdentifierSet, pub old_cache: Arc, - pub build_chunk_graph_artifact: BuildChunkGraphArtifact, + pub build_chunk_graph_artifact: DerefOption, pub incremental: Incremental, pub hash: Option, @@ -299,7 +299,7 @@ pub struct Compilation { pub modified_files: ArcPathSet, pub removed_files: ArcPathSet, - pub build_module_graph_artifact: BuildModuleGraphArtifact, + pub build_module_graph_artifact: DerefOption, pub input_filesystem: Arc, pub intermediate_filesystem: Arc, @@ -391,7 +391,7 @@ impl Compilation { dependencies_diagnostics_artifact: DerefOption::new( DependenciesDiagnosticsArtifact::default(), ), - side_effects_optimize_artifact: Default::default(), + side_effects_optimize_artifact: DerefOption::new(Default::default()), module_ids_artifact: Default::default(), chunk_ids_artifact: Default::default(), code_generation_results: Default::default(), @@ -1650,15 +1650,19 @@ impl Compilation { let start = logger.time("optimize dependencies"); // https://github.com/webpack/webpack/blob/d15c73469fd71cf98734685225250148b68ddc79/lib/Compilation.js#L2812-L2814 + let mut side_effects_optimize_artifact = self.side_effects_optimize_artifact.take(); + let mut diagnostics: Vec = vec![]; while matches!( plugin_driver .compilation_hooks .optimize_dependencies - .call(self) + .call(self, &mut side_effects_optimize_artifact, &mut diagnostics) .await .map_err(|e| e.wrap_err("caused by plugins in Compilation.hooks.optimizeDependencies"))?, Some(true) ) {} + self.side_effects_optimize_artifact = DerefOption::new(side_effects_optimize_artifact); + self.extend_diagnostics(diagnostics); logger.time_end(start); From 74f5638461e6fca48f283abe503f387b480a23c0 Mon Sep 17 00:00:00 2001 From: pshu Date: Wed, 3 Dec 2025 17:39:56 +0800 Subject: [PATCH 2/3] refactor: clear errors --- crates/rspack_core/src/compilation/mod.rs | 41 +++++++++---------- .../src/plugin/module_concatenation_plugin.rs | 14 +++---- .../src/plugin/side_effects_flag_plugin.rs | 7 ++-- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/crates/rspack_core/src/compilation/mod.rs b/crates/rspack_core/src/compilation/mod.rs index 42d293cc278a..2a618b05367b 100644 --- a/crates/rspack_core/src/compilation/mod.rs +++ b/crates/rspack_core/src/compilation/mod.rs @@ -4,7 +4,6 @@ use std::{ collections::{VecDeque, hash_map}, fmt::{self, Debug}, hash::{BuildHasherDefault, Hash}, - mem, sync::{ Arc, atomic::{AtomicBool, AtomicU32, Ordering}, @@ -78,7 +77,7 @@ define_hook!(CompilationExecuteModule: define_hook!(CompilationFinishModules: Series(compilation: &mut Compilation, async_modules_artifact: &mut AsyncModulesArtifact)); define_hook!(CompilationSeal: Series(compilation: &mut Compilation)); define_hook!(CompilationConcatenationScope: SeriesBail(compilation: &Compilation, curr_module: ModuleIdentifier) -> ConcatenationScope); -define_hook!(CompilationOptimizeDependencies: SeriesBail(compilation: &mut Compilation, side_effects_optimize_artifact: &mut SideEffectsOptimizeArtifact, diagnostics: &mut Vec) -> bool); +define_hook!(CompilationOptimizeDependencies: SeriesBail(compilation: &mut Compilation) -> bool); define_hook!(CompilationOptimizeModules: SeriesBail(compilation: &mut Compilation) -> bool); define_hook!(CompilationAfterOptimizeModules: Series(compilation: &mut Compilation)); define_hook!(CompilationOptimizeChunks: SeriesBail(compilation: &mut Compilation) -> bool); @@ -408,11 +407,12 @@ impl Compilation { CacheOptions::Memory { max_generations } => max_generations.unwrap_or(1), CacheOptions::Disabled => 0, // FIXME: this should be removed in future }, - )), + )) + .into(), build_time_executed_modules: Default::default(), old_cache, incremental, - build_chunk_graph_artifact: Default::default(), + build_chunk_graph_artifact: DerefOption::new(Default::default()), hash: None, @@ -428,7 +428,7 @@ impl Compilation { module_executor, in_finish_make: AtomicBool::new(false), - build_module_graph_artifact: BuildModuleGraphArtifact::default(), + build_module_graph_artifact: BuildModuleGraphArtifact::default().into(), modified_files, removed_files, input_filesystem, @@ -455,7 +455,7 @@ impl Compilation { ); } pub fn swap_build_module_graph_artifact(&mut self, make_artifact: &mut BuildModuleGraphArtifact) { - mem::swap(&mut self.build_module_graph_artifact, make_artifact); + self.build_module_graph_artifact.swap(make_artifact); } pub fn get_module_graph(&self) -> ModuleGraphRef<'_> { @@ -690,7 +690,7 @@ impl Compilation { self.add_entry(entry, options).await?; } - let make_artifact = mem::take(&mut self.build_module_graph_artifact); + let make_artifact = self.build_module_graph_artifact.take(); self.build_module_graph_artifact = update_module_graph( self, make_artifact, @@ -704,7 +704,8 @@ impl Compilation { .collect(), )], ) - .await?; + .await? + .into(); Ok(()) } @@ -737,7 +738,7 @@ impl Compilation { // Recheck entry and clean useless entry // This should before finish_modules hook is called, ensure providedExports effects on new added modules - let make_artifact = mem::take(&mut self.build_module_graph_artifact); + let make_artifact = self.build_module_graph_artifact.take(); self.build_module_graph_artifact = update_module_graph( self, make_artifact, @@ -751,7 +752,8 @@ impl Compilation { .collect(), )], ) - .await?; + .await? + .into(); Ok(()) } @@ -1047,8 +1049,8 @@ impl Compilation { self.module_executor = Some(module_executor); } - let artifact = std::mem::take(&mut self.build_module_graph_artifact); - self.build_module_graph_artifact = build_module_graph(self, artifact).await?; + let artifact = self.build_module_graph_artifact.take(); + self.build_module_graph_artifact = build_module_graph(self, artifact).await?.into(); self.in_finish_make.store(true, Ordering::Release); @@ -1060,7 +1062,7 @@ impl Compilation { module_identifiers: IdentifierSet, f: impl Fn(Vec<&BoxModule>) -> T, ) -> Result { - let artifact = std::mem::take(&mut self.build_module_graph_artifact); + let artifact = self.build_module_graph_artifact.take(); // https://github.com/webpack/webpack/blob/19ca74127f7668aaf60d59f4af8fcaee7924541a/lib/Compilation.js#L2462C21-L2462C25 self.module_graph_cache_artifact.unfreeze(); @@ -1070,7 +1072,8 @@ impl Compilation { artifact, vec![UpdateParam::ForceBuildModules(module_identifiers.clone())], ) - .await?; + .await? + .into(); let module_graph = self.get_module_graph(); Ok(f(module_identifiers @@ -1465,8 +1468,8 @@ impl Compilation { pub async fn finish_build_module_graph(&mut self) -> Result<()> { self.in_finish_make.store(false, Ordering::Release); // clean up the entry deps - let make_artifact = std::mem::take(&mut self.build_module_graph_artifact); - self.build_module_graph_artifact = finish_build_module_graph(self, make_artifact).await?; + let make_artifact = self.build_module_graph_artifact.take(); + self.build_module_graph_artifact = finish_build_module_graph(self, make_artifact).await?.into(); // sync assets to module graph from module_executor if let Some(module_executor) = &mut self.module_executor { let mut module_executor = std::mem::take(module_executor); @@ -1650,19 +1653,15 @@ impl Compilation { let start = logger.time("optimize dependencies"); // https://github.com/webpack/webpack/blob/d15c73469fd71cf98734685225250148b68ddc79/lib/Compilation.js#L2812-L2814 - let mut side_effects_optimize_artifact = self.side_effects_optimize_artifact.take(); - let mut diagnostics: Vec = vec![]; while matches!( plugin_driver .compilation_hooks .optimize_dependencies - .call(self, &mut side_effects_optimize_artifact, &mut diagnostics) + .call(self) .await .map_err(|e| e.wrap_err("caused by plugins in Compilation.hooks.optimizeDependencies"))?, Some(true) ) {} - self.side_effects_optimize_artifact = DerefOption::new(side_effects_optimize_artifact); - self.extend_diagnostics(diagnostics); logger.time_end(start); diff --git a/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs b/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs index 9af417d86ff3..3d1e9eb5f8df 100644 --- a/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs +++ b/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs @@ -5,10 +5,10 @@ use rayon::prelude::*; use rspack_collections::{IdentifierDashMap, IdentifierIndexSet, IdentifierMap, IdentifierSet}; use rspack_core::{ BoxDependency, Compilation, CompilationOptimizeChunkModules, DependencyId, DependencyType, - ExportProvided, ExportsInfoGetter, ExtendedReferencedExport, ImportedByDeferModulesArtifact, - LibIdentOptions, Logger, Module, ModuleExt, ModuleGraph, ModuleGraphCacheArtifact, - ModuleGraphConnection, ModuleGraphModule, ModuleIdentifier, Plugin, PrefetchExportsInfoMode, - ProvidedExports, RuntimeCondition, RuntimeSpec, SourceType, + DerefOption, ExportProvided, ExportsInfoGetter, ExtendedReferencedExport, + ImportedByDeferModulesArtifact, LibIdentOptions, Logger, Module, ModuleExt, ModuleGraph, + ModuleGraphCacheArtifact, ModuleGraphConnection, ModuleGraphModule, ModuleIdentifier, Plugin, + PrefetchExportsInfoMode, ProvidedExports, RuntimeCondition, RuntimeSpec, SourceType, concatenated_module::{ ConcatenatedInnerModule, ConcatenatedModule, RootModuleContext, is_esm_dep_like, }, @@ -840,7 +840,7 @@ impl ModuleConcatenationPlugin { let logger = compilation.get_logger("rspack.ModuleConcatenationPlugin"); if compilation.options.experiments.defer_import { - let mut imported_by_defer_modules_artifact = ImportedByDeferModulesArtifact::default(); + let mut artifact = ImportedByDeferModulesArtifact::default(); let module_graph = compilation.get_module_graph(); for dep in module_graph.dependencies().values() { if dep.get_phase().is_defer() @@ -850,10 +850,10 @@ impl ModuleConcatenationPlugin { ) && let Some(module) = module_graph.module_identifier_by_dependency_id(dep.id()) { - imported_by_defer_modules_artifact.insert(*module); + artifact.insert(*module); } } - compilation.imported_by_defer_modules_artifact = imported_by_defer_modules_artifact; + compilation.imported_by_defer_modules_artifact = DerefOption::new(artifact); } let mut relevant_modules = vec![]; diff --git a/crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs b/crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs index 0578b46f04fe..dc2b161b4ba8 100644 --- a/crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs +++ b/crates/rspack_plugin_javascript/src/plugin/side_effects_flag_plugin.rs @@ -8,9 +8,10 @@ use rspack_core::{ ModuleGraph, ModuleGraphConnection, ModuleIdentifier, NormalModuleCreateData, NormalModuleFactoryModule, Plugin, PrefetchExportsInfoMode, RayonConsumer, ResolvedExportInfoTarget, SideEffectsDoOptimize, SideEffectsDoOptimizeMoveTarget, + SideEffectsOptimizeArtifact, incremental::{self, IncrementalPasses, Mutation}, }; -use rspack_error::Result; +use rspack_error::{Diagnostic, Result}; use rspack_hook::{plugin, plugin_hook}; use rspack_paths::{AssertUtf8, Utf8Path}; use sugar_path::SugarPath; @@ -155,7 +156,7 @@ async fn optimize_dependencies(&self, compilation: &mut Compilation) -> Result Result Date: Wed, 10 Dec 2025 20:54:50 +0800 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=F0=9F=8E=A8=20defaul=20to=20So?= =?UTF-8?q?me(T)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rspack_core/src/compilation/mod.rs | 2 +- crates/rspack_core/src/utils/deref_option.rs | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/rspack_core/src/compilation/mod.rs b/crates/rspack_core/src/compilation/mod.rs index 308b09d38d95..e10e65d7de2c 100644 --- a/crates/rspack_core/src/compilation/mod.rs +++ b/crates/rspack_core/src/compilation/mod.rs @@ -428,7 +428,7 @@ impl Compilation { module_executor, in_finish_make: AtomicBool::new(false), - build_module_graph_artifact: BuildModuleGraphArtifact::default().into(), + build_module_graph_artifact: Default::default(), modified_files, removed_files, input_filesystem, diff --git a/crates/rspack_core/src/utils/deref_option.rs b/crates/rspack_core/src/utils/deref_option.rs index 6767ac9e1b3b..e5a9ef11613b 100644 --- a/crates/rspack_core/src/utils/deref_option.rs +++ b/crates/rspack_core/src/utils/deref_option.rs @@ -3,9 +3,18 @@ use std::{ ops::{Deref, DerefMut}, }; -#[derive(Debug, Default)] +#[derive(Debug)] pub struct DerefOption(Option); +impl Default for DerefOption +where + T: Default, +{ + fn default() -> Self { + Self(Some(T::default())) + } +} + impl From for DerefOption { fn from(value: T) -> Self { Self::new(value) @@ -40,10 +49,7 @@ impl Deref for DerefOption { .unwrap_or_else(|| panic!("should set in compilation first")) } } -impl DerefMut for DerefOption -where - T: Debug, -{ +impl DerefMut for DerefOption { fn deref_mut(&mut self) -> &mut Self::Target { self .0