From 8921fbb54cda836d76b08e8187f757b58ad739ef Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Sat, 21 Sep 2024 16:35:06 +0200 Subject: [PATCH] `vendored_typeshed_versions` should use `db.vendored` (#13434) --- .../src/module_resolver/resolver.rs | 32 +++++-------------- .../src/module_resolver/typeshed/versions.rs | 27 ++++++---------- crates/ruff_graph/src/db.rs | 14 ++++---- 3 files changed, 24 insertions(+), 49 deletions(-) diff --git a/crates/red_knot_python_semantic/src/module_resolver/resolver.rs b/crates/red_knot_python_semantic/src/module_resolver/resolver.rs index daf25fd0704ec..3be650eda3d57 100644 --- a/crates/red_knot_python_semantic/src/module_resolver/resolver.rs +++ b/crates/red_knot_python_semantic/src/module_resolver/resolver.rs @@ -1,20 +1,21 @@ -use rustc_hash::{FxBuildHasher, FxHashSet}; use std::borrow::Cow; use std::iter::FusedIterator; -use std::ops::Deref; + +use rustc_hash::{FxBuildHasher, FxHashSet}; use ruff_db::files::{File, FilePath, FileRootKind}; use ruff_db::system::{DirectoryEntry, System, SystemPath, SystemPathBuf}; use ruff_db::vendored::{VendoredFileSystem, VendoredPath}; -use super::module::{Module, ModuleKind}; -use super::path::{ModulePath, SearchPath, SearchPathValidationError}; use crate::db::Db; use crate::module_name::ModuleName; use crate::module_resolver::typeshed::{vendored_typeshed_versions, TypeshedVersions}; use crate::site_packages::VirtualEnvironment; use crate::{Program, PythonVersion, SearchPathSettings, SitePackages}; +use super::module::{Module, ModuleKind}; +use super::path::{ModulePath, SearchPath, SearchPathValidationError}; + /// Resolves a module name to a module. pub fn resolve_module(db: &dyn Db, module_name: ModuleName) -> Option { let interned_name = ModuleNameIngredient::new(db, module_name); @@ -136,7 +137,7 @@ pub(crate) struct SearchPaths { /// for the first `site-packages` path site_packages: Vec, - typeshed_versions: ResolvedTypeshedVersions, + typeshed_versions: TypeshedVersions, } impl SearchPaths { @@ -202,11 +203,11 @@ impl SearchPaths { let search_path = SearchPath::custom_stdlib(db, &custom_typeshed)?; - (ResolvedTypeshedVersions::Custom(parsed), search_path) + (parsed, search_path) } else { tracing::debug!("Using vendored stdlib"); ( - ResolvedTypeshedVersions::Vendored(vendored_typeshed_versions()), + vendored_typeshed_versions(db), SearchPath::vendored_stdlib(), ) }; @@ -279,23 +280,6 @@ impl SearchPaths { } } -#[derive(Debug, PartialEq, Eq)] -enum ResolvedTypeshedVersions { - Vendored(&'static TypeshedVersions), - Custom(TypeshedVersions), -} - -impl Deref for ResolvedTypeshedVersions { - type Target = TypeshedVersions; - - fn deref(&self) -> &Self::Target { - match self { - ResolvedTypeshedVersions::Vendored(versions) => versions, - ResolvedTypeshedVersions::Custom(versions) => versions, - } - } -} - /// Collect all dynamic search paths. For each `site-packages` path: /// - Collect that `site-packages` path /// - Collect any search paths listed in `.pth` files in that `site-packages` directory diff --git a/crates/red_knot_python_semantic/src/module_resolver/typeshed/versions.rs b/crates/red_knot_python_semantic/src/module_resolver/typeshed/versions.rs index f4851858a91d0..bce245459711c 100644 --- a/crates/red_knot_python_semantic/src/module_resolver/typeshed/versions.rs +++ b/crates/red_knot_python_semantic/src/module_resolver/typeshed/versions.rs @@ -4,25 +4,19 @@ use std::num::{NonZeroU16, NonZeroUsize}; use std::ops::{RangeFrom, RangeInclusive}; use std::str::FromStr; -use once_cell::sync::Lazy; use rustc_hash::FxHashMap; -use super::vendored::vendored_typeshed_stubs; use crate::db::Db; use crate::module_name::ModuleName; use crate::{Program, PythonVersion}; -static VENDORED_VERSIONS: Lazy = Lazy::new(|| { +pub(in crate::module_resolver) fn vendored_typeshed_versions(db: &dyn Db) -> TypeshedVersions { TypeshedVersions::from_str( - &vendored_typeshed_stubs() + &db.vendored() .read_to_string("stdlib/VERSIONS") - .unwrap(), + .expect("The vendored typeshed stubs should contain a VERSIONS file"), ) - .unwrap() -}); - -pub(crate) fn vendored_typeshed_versions() -> &'static TypeshedVersions { - &VENDORED_VERSIONS + .expect("The VERSIONS file in the vendored typeshed stubs should be well-formed") } pub(crate) fn typeshed_versions(db: &dyn Db) -> &TypeshedVersions { @@ -332,6 +326,8 @@ mod tests { use insta::assert_snapshot; + use crate::db::tests::TestDb; + use super::*; const TYPESHED_STDLIB_DIR: &str = "stdlib"; @@ -353,12 +349,9 @@ mod tests { #[test] fn can_parse_vendored_versions_file() { - let versions_data = include_str!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/vendor/typeshed/stdlib/VERSIONS" - )); + let db = TestDb::new(); - let versions = TypeshedVersions::from_str(versions_data).unwrap(); + let versions = vendored_typeshed_versions(&db); assert!(versions.len() > 100); assert!(versions.len() < 1000); @@ -395,9 +388,9 @@ mod tests { #[test] fn typeshed_versions_consistent_with_vendored_stubs() { - const VERSIONS_DATA: &str = include_str!("../../../vendor/typeshed/stdlib/VERSIONS"); + let db = TestDb::new(); + let vendored_typeshed_versions = vendored_typeshed_versions(&db); let vendored_typeshed_dir = Path::new("vendor/typeshed").canonicalize().unwrap(); - let vendored_typeshed_versions = TypeshedVersions::from_str(VERSIONS_DATA).unwrap(); let mut empty_iterator = true; diff --git a/crates/ruff_graph/src/db.rs b/crates/ruff_graph/src/db.rs index 5b3e660248c63..d0323f6c062c2 100644 --- a/crates/ruff_graph/src/db.rs +++ b/crates/ruff_graph/src/db.rs @@ -1,5 +1,7 @@ use anyhow::Result; -use red_knot_python_semantic::{Db, Program, ProgramSettings, PythonVersion, SearchPathSettings}; +use red_knot_python_semantic::{ + vendored_typeshed_stubs, Db, Program, ProgramSettings, PythonVersion, SearchPathSettings, +}; use ruff_db::files::{File, Files}; use ruff_db::system::{OsSystem, System, SystemPathBuf}; use ruff_db::vendored::VendoredFileSystem; @@ -11,7 +13,6 @@ pub struct ModuleDb { storage: salsa::Storage, files: Files, system: OsSystem, - vendored: VendoredFileSystem, } impl ModuleDb { @@ -26,12 +27,10 @@ impl ModuleDb { .next() .ok_or_else(|| anyhow::anyhow!("No source roots provided"))?; - let mut search_paths = SearchPathSettings::new(src_root.to_path_buf()); + let mut search_paths = SearchPathSettings::new(src_root); // Add the remaining source roots as extra paths. - for src_root in src_roots { - search_paths.extra_paths.push(src_root.to_path_buf()); - } + search_paths.extra_paths.extend(src_roots); search_paths }; @@ -54,7 +53,6 @@ impl ModuleDb { Self { storage: self.storage.clone(), system: self.system.clone(), - vendored: self.vendored.clone(), files: self.files.snapshot(), } } @@ -72,7 +70,7 @@ impl Upcast for ModuleDb { #[salsa::db] impl SourceDb for ModuleDb { fn vendored(&self) -> &VendoredFileSystem { - &self.vendored + vendored_typeshed_stubs() } fn system(&self) -> &dyn System {