mirror of
https://github.com/astral-sh/ruff
synced 2026-01-21 13:30:49 -05:00
90 lines
2.6 KiB
Rust
90 lines
2.6 KiB
Rust
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,
|
|
}
|