diff options
Diffstat (limited to 'core/modules.rs')
-rw-r--r-- | core/modules.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/core/modules.rs b/core/modules.rs index b6220bb3b..3d335f8eb 100644 --- a/core/modules.rs +++ b/core/modules.rs @@ -328,6 +328,7 @@ pub type InternalModuleLoaderCb = pub struct InternalModuleLoader { module_loader: Rc<dyn ModuleLoader>, esm_sources: Vec<ExtensionFileSource>, + used_esm_sources: RefCell<HashMap<String, bool>>, maybe_load_callback: Option<InternalModuleLoaderCb>, } @@ -336,6 +337,7 @@ impl Default for InternalModuleLoader { Self { module_loader: Rc::new(NoopModuleLoader), esm_sources: vec![], + used_esm_sources: RefCell::new(HashMap::default()), maybe_load_callback: None, } } @@ -347,14 +349,43 @@ impl InternalModuleLoader { esm_sources: Vec<ExtensionFileSource>, maybe_load_callback: Option<InternalModuleLoaderCb>, ) -> Self { + let used_esm_sources: HashMap<String, bool> = esm_sources + .iter() + .map(|file_source| (file_source.specifier.to_string(), false)) + .collect(); + InternalModuleLoader { module_loader: module_loader.unwrap_or_else(|| Rc::new(NoopModuleLoader)), esm_sources, + used_esm_sources: RefCell::new(used_esm_sources), maybe_load_callback, } } } +impl Drop for InternalModuleLoader { + fn drop(&mut self) { + let used_esm_sources = self.used_esm_sources.get_mut(); + let unused_modules: Vec<_> = used_esm_sources + .iter() + .filter(|(_s, v)| !*v) + .map(|(s, _)| s) + .collect(); + + if !unused_modules.is_empty() { + let mut msg = + "Following modules were passed to InternalModuleLoader but never used:\n" + .to_string(); + for m in unused_modules { + msg.push_str(" - "); + msg.push_str(m); + msg.push('\n'); + } + panic!("{}", msg); + } + } +} + impl ModuleLoader for InternalModuleLoader { fn resolve( &self, @@ -400,6 +431,12 @@ impl ModuleLoader for InternalModuleLoader { .find(|file_source| file_source.specifier == module_specifier.as_str()); if let Some(file_source) = maybe_file_source { + { + let mut used_esm_sources = self.used_esm_sources.borrow_mut(); + let used = used_esm_sources.get_mut(&file_source.specifier).unwrap(); + *used = true; + } + let result = if let Some(load_callback) = &self.maybe_load_callback { load_callback(file_source) } else { |