// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. use std::path::PathBuf; use std::sync::Arc; use once_cell::sync::OnceCell; use super::cache_db::CacheDB; use super::cache_db::CacheDBConfiguration; use super::check::TYPE_CHECK_CACHE_DB; use super::code_cache::CODE_CACHE_DB; use super::deno_dir::DenoDirProvider; use super::fast_check::FAST_CHECK_CACHE_DB; use super::incremental::INCREMENTAL_CACHE_DB; use super::module_info::MODULE_INFO_CACHE_DB; use super::node::NODE_ANALYSIS_CACHE_DB; pub struct Caches { dir_provider: Arc, fmt_incremental_cache_db: OnceCell, lint_incremental_cache_db: OnceCell, dep_analysis_db: OnceCell, fast_check_db: OnceCell, node_analysis_db: OnceCell, type_checking_cache_db: OnceCell, code_cache_db: OnceCell, } impl Caches { pub fn new(dir: Arc) -> Self { Self { dir_provider: dir, fmt_incremental_cache_db: Default::default(), lint_incremental_cache_db: Default::default(), dep_analysis_db: Default::default(), fast_check_db: Default::default(), node_analysis_db: Default::default(), type_checking_cache_db: Default::default(), code_cache_db: Default::default(), } } fn make_db( cell: &OnceCell, config: &'static CacheDBConfiguration, path: Option, ) -> CacheDB { cell .get_or_init(|| { if let Some(path) = path { CacheDB::from_path( config, path, crate::version::DENO_VERSION_INFO.deno, ) } else { CacheDB::in_memory(config, crate::version::DENO_VERSION_INFO.deno) } }) .clone() } pub fn fmt_incremental_cache_db(&self) -> CacheDB { Self::make_db( &self.fmt_incremental_cache_db, &INCREMENTAL_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.fmt_incremental_cache_db_file_path()), ) } pub fn lint_incremental_cache_db(&self) -> CacheDB { Self::make_db( &self.lint_incremental_cache_db, &INCREMENTAL_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.lint_incremental_cache_db_file_path()), ) } pub fn dep_analysis_db(&self) -> CacheDB { Self::make_db( &self.dep_analysis_db, &MODULE_INFO_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.dep_analysis_db_file_path()), ) } pub fn fast_check_db(&self) -> CacheDB { Self::make_db( &self.fast_check_db, &FAST_CHECK_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.fast_check_cache_db_file_path()), ) } pub fn node_analysis_db(&self) -> CacheDB { Self::make_db( &self.node_analysis_db, &NODE_ANALYSIS_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.node_analysis_db_file_path()), ) } pub fn type_checking_cache_db(&self) -> CacheDB { Self::make_db( &self.type_checking_cache_db, &TYPE_CHECK_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.type_checking_cache_db_file_path()), ) } pub fn code_cache_db(&self) -> CacheDB { Self::make_db( &self.code_cache_db, &CODE_CACHE_DB, self .dir_provider .get_or_create() .ok() .map(|dir| dir.code_cache_db_file_path()), ) } }