Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions crates/ruff_benchmark/benches/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fn setup_tomllib_case() -> Case {
..Options::default()
});

let mut db = ProjectDatabase::new(metadata, system).unwrap();
let mut db = ProjectDatabase::fallible(metadata, system).unwrap();
let mut tomllib_files = FxHashSet::default();
let mut re: Option<File> = None;

Expand Down Expand Up @@ -239,7 +239,7 @@ fn setup_micro_case(code: &str) -> Case {
..Options::default()
});

let mut db = ProjectDatabase::new(metadata, system).unwrap();
let mut db = ProjectDatabase::fallible(metadata, system).unwrap();
let file = system_path_to_file(&db, SystemPathBuf::from(file_path)).unwrap();

db.set_check_mode(CheckMode::OpenFiles);
Expand Down Expand Up @@ -812,7 +812,7 @@ impl<'a> ProjectBenchmark<'a> {
..Options::default()
});

let mut db = ProjectDatabase::new(metadata, system).unwrap();
let mut db = ProjectDatabase::fallible(metadata, system).unwrap();

db.project().set_included_paths(
&mut db,
Expand Down
2 changes: 1 addition & 1 deletion crates/ruff_benchmark/benches/ty_walltime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ impl<'a> Benchmark<'a> {
..Options::default()
});

let mut db = ProjectDatabase::new(metadata, system).unwrap();
let mut db = ProjectDatabase::fallible(metadata, system).unwrap();

db.project().set_included_paths(
&mut db,
Expand Down
4 changes: 2 additions & 2 deletions crates/ruff_graph/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use ruff_db::files::Files;
use ruff_db::system::{OsSystem, System, SystemPathBuf};
use ruff_db::vendored::{VendoredFileSystem, VendoredFileSystemBuilder};
use ruff_python_ast::PythonVersion;
use ty_module_resolver::{SearchPathSettings, SearchPaths};
use ty_module_resolver::{FallibleStrategy, SearchPathSettings, SearchPaths};
use ty_site_packages::{PythonEnvironment, SysPrefixPathOrigin};

static EMPTY_VENDORED: std::sync::LazyLock<VendoredFileSystem> = std::sync::LazyLock::new(|| {
Expand Down Expand Up @@ -45,7 +45,7 @@ impl ModuleDb {
.into_vec();
}
let search_paths = search_path_settings
.to_search_paths(&system, &EMPTY_VENDORED)
.to_search_paths(&system, &EMPTY_VENDORED, &FallibleStrategy)
.context("Invalid search path settings")?;

let db = Self {
Expand Down
2 changes: 1 addition & 1 deletion crates/ty/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ fn run_check(args: CheckCommand) -> anyhow::Result<ExitStatus> {
let project_options_overrides = ProjectOptionsOverrides::new(config_file, args.into_options());
project_metadata.apply_overrides(&project_options_overrides);

let mut db = ProjectDatabase::new(project_metadata, system)?;
let mut db = ProjectDatabase::fallible(project_metadata, system)?;
let project = db.project();

project.set_verbose(&mut db, verbosity >= VerbosityLevel::Verbose);
Expand Down
2 changes: 1 addition & 1 deletion crates/ty/tests/file_watching.rs
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ where
}
}

let mut db = ProjectDatabase::new(project, system)?;
let mut db = ProjectDatabase::fallible(project, system)?;

if let Some(included_paths) = included_paths {
db.project().set_included_paths(&mut db, included_paths);
Expand Down
2 changes: 1 addition & 1 deletion crates/ty_completion_bench/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ fn main() -> anyhow::Result<ExitCode> {
..Options::default()
});
project_metadata.apply_configuration_files(&system)?;
let db = ProjectDatabase::new(project_metadata, system)?;
let db = ProjectDatabase::fallible(project_metadata, system)?;

let start = std::time::Instant::now();
let mut completions = get_completions(&db, &args.file, offset)?;
Expand Down
2 changes: 1 addition & 1 deletion crates/ty_completion_eval/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ impl Task {
..Options::default()
});
project_metadata.apply_configuration_files(&system)?;
let db = ProjectDatabase::new(project_metadata, system)?;
let db = ProjectDatabase::fallible(project_metadata, system)?;
Ok(Task {
db,
dir: project_path.to_path_buf(),
Expand Down
4 changes: 2 additions & 2 deletions crates/ty_ide/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ mod tests {
impl SitePackagesCursorTestBuilder {
pub(super) fn build(&self) -> CursorTest {
use ty_module_resolver::SearchPathSettings;
use ty_python_semantic::{Program, ProgramSettings};
use ty_python_semantic::{FallibleStrategy, Program, ProgramSettings};

let project_root = SystemPathBuf::from("/src");
let site_packages_path = SystemPathBuf::from("/site-packages");
Expand Down Expand Up @@ -593,7 +593,7 @@ mod tests {
site_packages_paths: vec![site_packages_path.clone()],
..SearchPathSettings::empty()
}
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("valid search paths");

Program::from_settings(
Expand Down
1 change: 1 addition & 0 deletions crates/ty_module_resolver/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ ruff_memory_usage = { workspace = true }
ruff_python_ast = { workspace = true, features = ["salsa"] }
ruff_python_stdlib = { workspace = true }

anyhow = { workspace = true }
camino = { workspace = true }
compact_str = { workspace = true }
get-size2 = { workspace = true }
Expand Down
4 changes: 3 additions & 1 deletion crates/ty_module_resolver/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ pub use resolve::{
SearchPaths, file_to_module, resolve_module, resolve_module_confident, resolve_real_module,
resolve_real_module_confident, resolve_real_shadowable_module,
};
pub use settings::{MisconfigurationMode, SearchPathSettings, SearchPathSettingsError};
pub use settings::{SearchPathSettings, SearchPathSettingsError};
pub use strategy::{FallibleStrategy, MisconfigurationStrategy, UseDefaultStrategy};
pub use typeshed::{
PyVersionRange, TypeshedVersions, TypeshedVersionsParseError, vendored_typeshed_versions,
};
Expand All @@ -28,6 +29,7 @@ mod module_name;
mod path;
mod resolve;
mod settings;
mod strategy;
mod typeshed;

#[cfg(test)]
Expand Down
13 changes: 7 additions & 6 deletions crates/ty_module_resolver/src/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ mod tests {
ModuleResolveMode, ModuleResolveModeIngredient, dynamic_resolution_paths,
};
use crate::settings::SearchPathSettings;
use crate::strategy::FallibleStrategy;
use crate::testing::{FileSpec, MockedTypeshed, TestCase, TestCaseBuilder};

use super::list_modules;
Expand Down Expand Up @@ -966,7 +967,7 @@ mod tests {

db.set_search_paths(
settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -1473,7 +1474,7 @@ not_a_directory

db.set_search_paths(
settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -1524,7 +1525,7 @@ not_a_directory

db.set_search_paths(
settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -1604,7 +1605,7 @@ not_a_directory

let settings = SearchPathSettings::new(vec![src]);
let search_paths = settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("valid search path settings");
db.set_search_paths(search_paths);

Expand Down Expand Up @@ -1644,7 +1645,7 @@ not_a_directory
};
db.set_search_paths(
settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.unwrap(),
);

Expand Down Expand Up @@ -1792,7 +1793,7 @@ not_a_directory

let settings = SearchPathSettings::new(vec![project_directory]);
let search_paths = settings
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings");
db.set_search_paths(search_paths);

Expand Down
110 changes: 47 additions & 63 deletions crates/ty_module_resolver/src/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ use crate::db::Db;
use crate::module::{Module, ModuleKind};
use crate::module_name::ModuleName;
use crate::path::{ModulePath, SearchPath, SystemOrVendoredPathRef};
use crate::strategy::MisconfigurationStrategy;
use crate::typeshed::{TypeshedVersions, vendored_typeshed_versions};
use crate::{MisconfigurationMode, SearchPathSettings, SearchPathSettingsError};
use crate::{SearchPathSettings, SearchPathSettingsError};

/// Resolves a module name to a module.
pub fn resolve_module<'db>(
Expand Down Expand Up @@ -552,11 +553,12 @@ impl SearchPaths {
/// This method also implements the typing spec's [module resolution order].
///
/// [module resolution order]: https://typing.python.org/en/latest/spec/distributing.html#import-resolution-ordering
pub fn from_settings(
pub fn from_settings<Strategy: MisconfigurationStrategy>(
settings: &SearchPathSettings,
system: &dyn System,
vendored: &VendoredFileSystem,
) -> Result<Self, SearchPathSettingsError> {
strategy: &Strategy,
) -> Result<Self, Strategy::Error<SearchPathSettingsError>> {
fn canonicalize(path: &SystemPath, system: &dyn System) -> SystemPathBuf {
system
.canonicalize_path(path)
Expand All @@ -569,7 +571,6 @@ impl SearchPaths {
custom_typeshed: typeshed,
site_packages_paths,
real_stdlib_path,
misconfiguration_mode,
} = settings;

let mut static_paths = vec![];
Expand All @@ -578,30 +579,25 @@ impl SearchPaths {
let path = canonicalize(path, system);
tracing::debug!("Adding extra search-path `{path}`");

match SearchPath::extra(system, path) {
Ok(path) => static_paths.push(path),
Err(err) => {
if *misconfiguration_mode == MisconfigurationMode::UseDefault {
tracing::debug!("Skipping invalid extra search-path: {err}");
} else {
return Err(err.into());
}
}
}
let path = strategy.fallback_opt(
SearchPath::extra(system, path).map_err(SearchPathSettingsError::from),
|err| {
tracing::debug!("Skipping invalid extra search-path: {err}");
},
)?;
static_paths.extend(path);
}

for src_root in src_roots {
tracing::debug!("Adding first-party search path `{src_root}`");
match SearchPath::first_party(system, src_root.to_path_buf()) {
Ok(path) => static_paths.push(path),
Err(err) => {
if *misconfiguration_mode == MisconfigurationMode::UseDefault {
tracing::debug!("Skipping invalid first-party search-path: {err}");
} else {
return Err(err.into());
}
}
}
let path = strategy.fallback_opt(
SearchPath::first_party(system, src_root.to_path_buf())
.map_err(SearchPathSettingsError::from),
|err| {
tracing::debug!("Skipping invalid first-party search-path: {err}");
},
)?;
static_paths.extend(path);
}

let (typeshed_versions, stdlib_path) = if let Some(typeshed) = typeshed {
Expand All @@ -619,20 +615,13 @@ impl SearchPaths {
.and_then(|versions_content| Ok(versions_content.parse()?))
.and_then(|parsed| Ok((parsed, SearchPath::custom_stdlib(system, &typeshed)?)));

match results {
Ok(results) => results,
Err(err) => {
if settings.misconfiguration_mode == MisconfigurationMode::UseDefault {
tracing::debug!("Skipping custom-stdlib search-path: {err}");
(
vendored_typeshed_versions(vendored),
SearchPath::vendored_stdlib(),
)
} else {
return Err(err);
}
}
}
strategy.fallback(results, |err| {
tracing::debug!("Skipping custom-stdlib search-path: {err}");
(
vendored_typeshed_versions(vendored),
SearchPath::vendored_stdlib(),
)
})?
} else {
tracing::debug!("Using vendored stdlib");
(
Expand All @@ -642,17 +631,13 @@ impl SearchPaths {
};

let real_stdlib_path = if let Some(path) = real_stdlib_path {
match SearchPath::real_stdlib(system, path.clone()) {
Ok(path) => Some(path),
Err(err) => {
if *misconfiguration_mode == MisconfigurationMode::UseDefault {
tracing::debug!("Skipping invalid real-stdlib search-path: {err}");
None
} else {
return Err(err.into());
}
}
}
strategy.fallback_opt(
SearchPath::real_stdlib(system, path.clone())
.map_err(SearchPathSettingsError::from),
|err| {
tracing::debug!("Skipping invalid real-stdlib search-path: {err}");
},
)?
} else {
None
};
Expand All @@ -661,16 +646,14 @@ impl SearchPaths {

for path in site_packages_paths {
tracing::debug!("Adding site-packages search path `{path}`");
match SearchPath::site_packages(system, path.clone()) {
Ok(path) => site_packages.push(path),
Err(err) => {
if settings.misconfiguration_mode == MisconfigurationMode::UseDefault {
tracing::debug!("Skipping invalid site-packages search-path: {err}");
} else {
return Err(err.into());
}
}
}
let path = strategy.fallback_opt(
SearchPath::site_packages(system, path.clone())
.map_err(SearchPathSettingsError::from),
|err| {
tracing::debug!("Skipping invalid site-packages search-path: {err}");
},
)?;
site_packages.extend(path);
}

// TODO vendor typeshed's third-party stubs as well as the stdlib and
Expand Down Expand Up @@ -1827,6 +1810,7 @@ mod tests {
use crate::db::tests::TestDb;
use crate::module::ModuleKind;
use crate::module_name::ModuleName;
use crate::strategy::FallibleStrategy;
use crate::testing::{FileSpec, MockedTypeshed, TestCase, TestCaseBuilder};

use super::*;
Expand Down Expand Up @@ -2387,7 +2371,7 @@ mod tests {
site_packages_paths: vec![site_packages],
..SearchPathSettings::empty()
}
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -2926,7 +2910,7 @@ not_a_directory
site_packages_paths: vec![venv_site_packages, system_site_packages],
..SearchPathSettings::new(vec![SystemPathBuf::from("/src")])
}
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -2994,7 +2978,7 @@ not_a_directory

db.set_search_paths(
SearchPathSettings::new(vec![src])
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings"),
);

Expand Down Expand Up @@ -3032,7 +3016,7 @@ not_a_directory
site_packages_paths: vec![site_packages.clone()],
..SearchPathSettings::empty()
}
.to_search_paths(db.system(), db.vendored())
.to_search_paths(db.system(), db.vendored(), &FallibleStrategy)
.expect("Valid search path settings");
db.set_search_paths(search_paths);

Expand Down
Loading
Loading