diff options
Diffstat (limited to 'cli/factory.rs')
-rw-r--r-- | cli/factory.rs | 116 |
1 files changed, 77 insertions, 39 deletions
diff --git a/cli/factory.rs b/cli/factory.rs index 2797afb29..9f3719510 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -22,6 +22,7 @@ use crate::file_fetcher::FileFetcher; use crate::graph_util::FileWatcherReporter; use crate::graph_util::ModuleGraphBuilder; use crate::graph_util::ModuleGraphContainer; +use crate::graph_util::ModuleGraphCreator; use crate::http_util::HttpClient; use crate::module_loader::CliModuleLoaderFactory; use crate::module_loader::ModuleLoadPreparer; @@ -55,6 +56,7 @@ use crate::worker::CliMainWorkerOptions; use std::path::PathBuf; use deno_core::error::AnyError; +use deno_core::futures::FutureExt; use deno_core::parking_lot::Mutex; use deno_core::FeatureChecker; @@ -116,6 +118,7 @@ impl<T> Default for Deferred<T> { } impl<T> Deferred<T> { + #[inline(always)] pub fn get_or_try_init( &self, create: impl FnOnce() -> Result<T, AnyError>, @@ -123,12 +126,16 @@ impl<T> Deferred<T> { self.0.get_or_try_init(create) } + #[inline(always)] pub fn get_or_init(&self, create: impl FnOnce() -> T) -> &T { self.0.get_or_init(create) } pub async fn get_or_try_init_async( &self, + // some futures passed here are boxed because it was discovered + // that they were called a lot, causing other futures to get + // really big causing stack overflows on Windows create: impl Future<Output = Result<T, AnyError>>, ) -> Result<&T, AnyError> { if self.0.get().is_none() { @@ -164,6 +171,7 @@ struct CliFactoryServices { resolver: Deferred<Arc<CliGraphResolver>>, maybe_file_watcher_reporter: Deferred<Option<FileWatcherReporter>>, module_graph_builder: Deferred<Arc<ModuleGraphBuilder>>, + module_graph_creator: Deferred<Arc<ModuleGraphCreator>>, module_load_preparer: Deferred<Arc<ModuleLoadPreparer>>, node_code_translator: Deferred<Arc<CliNodeCodeTranslator>>, node_resolver: Deferred<Arc<NodeResolver>>, @@ -212,14 +220,16 @@ impl CliFactory { let caches = Arc::new(Caches::new(self.deno_dir_provider().clone())); // Warm up the caches we know we'll likely need based on the CLI mode match self.options.sub_command() { - DenoSubcommand::Run(_) => { + DenoSubcommand::Run(_) + | DenoSubcommand::Bench(_) + | DenoSubcommand::Test(_) + | DenoSubcommand::Check(_) => { _ = caches.dep_analysis_db(); _ = caches.node_analysis_db(); - } - DenoSubcommand::Check(_) => { - _ = caches.dep_analysis_db(); - _ = caches.node_analysis_db(); - _ = caches.type_checking_cache_db(); + if self.options.type_check_mode().is_true() { + _ = caches.fast_check_db(); + _ = caches.type_checking_cache_db(); + } } _ => {} } @@ -437,7 +447,7 @@ impl CliFactory { npm_registry_url: crate::args::npm_registry_default_url().to_owned(), }) }).await - }) + }.boxed_local()) .await } @@ -471,32 +481,37 @@ impl CliFactory { self .services .resolver - .get_or_try_init_async(async { - Ok(Arc::new(CliGraphResolver::new(CliGraphResolverOptions { - fs: self.fs().clone(), - cjs_resolutions: Some(self.cjs_resolutions().clone()), - sloppy_imports_resolver: if self.options.unstable_sloppy_imports() { - Some(SloppyImportsResolver::new(self.fs().clone())) - } else { - None - }, - node_resolver: Some(self.node_resolver().await?.clone()), - npm_resolver: if self.options.no_npm() { - None - } else { - Some(self.npm_resolver().await?.clone()) - }, - package_json_deps_provider: self.package_json_deps_provider().clone(), - maybe_jsx_import_source_config: self - .options - .to_maybe_jsx_import_source_config()?, - maybe_import_map: self.maybe_import_map().await?.clone(), - maybe_vendor_dir: self.options.vendor_dir_path(), - bare_node_builtins_enabled: self - .options - .unstable_bare_node_builtins(), - }))) - }) + .get_or_try_init_async( + async { + Ok(Arc::new(CliGraphResolver::new(CliGraphResolverOptions { + fs: self.fs().clone(), + cjs_resolutions: Some(self.cjs_resolutions().clone()), + sloppy_imports_resolver: if self.options.unstable_sloppy_imports() { + Some(SloppyImportsResolver::new(self.fs().clone())) + } else { + None + }, + node_resolver: Some(self.node_resolver().await?.clone()), + npm_resolver: if self.options.no_npm() { + None + } else { + Some(self.npm_resolver().await?.clone()) + }, + package_json_deps_provider: self + .package_json_deps_provider() + .clone(), + maybe_jsx_import_source_config: self + .options + .to_maybe_jsx_import_source_config()?, + maybe_import_map: self.maybe_import_map().await?.clone(), + maybe_vendor_dir: self.options.vendor_dir_path(), + bare_node_builtins_enabled: self + .options + .unstable_bare_node_builtins(), + }))) + } + .boxed_local(), + ) .await } @@ -554,12 +569,15 @@ impl CliFactory { self .services .node_resolver - .get_or_try_init_async(async { - Ok(Arc::new(NodeResolver::new( - self.fs().clone(), - self.npm_resolver().await?.clone().into_npm_resolver(), - ))) - }) + .get_or_try_init_async( + async { + Ok(Arc::new(NodeResolver::new( + self.fs().clone(), + self.npm_resolver().await?.clone().into_npm_resolver(), + ))) + } + .boxed_local(), + ) .await } @@ -594,6 +612,7 @@ impl CliFactory { Ok(Arc::new(TypeChecker::new( self.caches()?.clone(), self.options.clone(), + self.module_graph_builder().await?.clone(), self.node_resolver().await?.clone(), self.npm_resolver().await?.clone(), ))) @@ -610,6 +629,7 @@ impl CliFactory { .get_or_try_init_async(async { Ok(Arc::new(ModuleGraphBuilder::new( self.options.clone(), + self.caches()?.clone(), self.fs().clone(), self.resolver().await?.clone(), self.npm_resolver().await?.clone(), @@ -620,6 +640,24 @@ impl CliFactory { self.emit_cache()?.clone(), self.file_fetcher()?.clone(), self.global_http_cache()?.clone(), + ))) + }) + .await + } + + pub async fn module_graph_creator( + &self, + ) -> Result<&Arc<ModuleGraphCreator>, AnyError> { + self + .services + .module_graph_creator + .get_or_try_init_async(async { + Ok(Arc::new(ModuleGraphCreator::new( + self.options.clone(), + self.fs().clone(), + self.npm_resolver().await?.clone(), + self.module_graph_builder().await?.clone(), + self.maybe_lockfile().clone(), self.type_checker().await?.clone(), ))) }) |