use crate::Db; use crate::python_platform::PythonPlatform; use ruff_db::system::SystemPath; use ruff_python_ast::PythonVersion; use salsa::Durability; use salsa::Setter; use ty_module_resolver::SearchPaths; use ty_site_packages::PythonVersionWithSource; #[salsa::input(singleton, heap_size=ruff_memory_usage::heap_size)] pub struct Program { #[returns(ref)] pub python_version_with_source: PythonVersionWithSource, #[returns(ref)] pub python_platform: PythonPlatform, #[returns(ref)] pub search_paths: SearchPaths, } impl Program { pub fn init_or_update(db: &mut dyn Db, settings: ProgramSettings) -> Self { match Self::try_get(db) { Some(program) => { program.update_from_settings(db, settings); program } None => Self::from_settings(db, settings), } } pub fn from_settings(db: &dyn Db, settings: ProgramSettings) -> Self { let ProgramSettings { python_version, python_platform, search_paths, } = settings; search_paths.try_register_static_roots(db); Program::builder(python_version, python_platform, search_paths) .durability(Durability::HIGH) .new(db) } pub fn python_version(self, db: &dyn Db) -> PythonVersion { self.python_version_with_source(db).version } pub fn update_from_settings(self, db: &mut dyn Db, settings: ProgramSettings) { let ProgramSettings { python_version, python_platform, search_paths, } = settings; if self.search_paths(db) != &search_paths { tracing::debug!("Updating search paths"); search_paths.try_register_static_roots(db); self.set_search_paths(db).to(search_paths); } if &python_platform != self.python_platform(db) { tracing::debug!("Updating python platform: `{python_platform:?}`"); self.set_python_platform(db).to(python_platform); } if &python_version != self.python_version_with_source(db) { tracing::debug!( "Updating python version: Python {version}", version = python_version.version ); self.set_python_version_with_source(db).to(python_version); } } pub fn custom_stdlib_search_path(self, db: &dyn Db) -> Option<&SystemPath> { self.search_paths(db).custom_stdlib() } } #[derive(Clone, Debug, Eq, PartialEq)] pub struct ProgramSettings { pub python_version: PythonVersionWithSource, pub python_platform: PythonPlatform, pub search_paths: SearchPaths, }