teach file_to_module the meaning of desperation as well

This commit is contained in:
Aria Desires 2025-12-01 21:05:25 -05:00
parent 40ed26aa3f
commit 14f503695d
1 changed files with 29 additions and 7 deletions

View File

@ -205,13 +205,35 @@ pub(crate) fn file_to_module(db: &dyn Db, file: File) -> Option<Module<'_>> {
let path = SystemOrVendoredPathRef::try_from_file(db, file)?; let path = SystemOrVendoredPathRef::try_from_file(db, file)?;
let module_name = search_paths(db, ModuleResolveMode::StubsAllowed).find_map(|candidate| { let module_name = search_paths(db, ModuleResolveMode::StubsAllowed)
let relative_path = match path { .find_map(|candidate| {
SystemOrVendoredPathRef::System(path) => candidate.relativize_system_path(path), let relative_path = match path {
SystemOrVendoredPathRef::Vendored(path) => candidate.relativize_vendored_path(path), SystemOrVendoredPathRef::System(path) => candidate.relativize_system_path(path),
}?; SystemOrVendoredPathRef::Vendored(path) => candidate.relativize_vendored_path(path),
relative_path.to_module_name() }?;
})?; relative_path.to_module_name()
})
.or_else(|| {
// As a last desperate attempt, try to resolve a module name relative to the nearest pyproject.toml
let system = db.system();
let importing_path = file.path(db).as_system_path()?;
for dir in importing_path.ancestors() {
let pyproject = dir.join("pyproject.toml");
if system.path_exists(&pyproject) {
let candidate = SearchPath::extra(system, dir.to_owned()).ok()?;
let relative_path = match path {
SystemOrVendoredPathRef::System(path) => {
candidate.relativize_system_path(path)
}
SystemOrVendoredPathRef::Vendored(path) => {
candidate.relativize_vendored_path(path)
}
}?;
return relative_path.to_module_name();
}
}
None
})?;
// Resolve the module name to see if Python would resolve the name to the same path. // Resolve the module name to see if Python would resolve the name to the same path.
// If it doesn't, then that means that multiple modules have the same name in different // If it doesn't, then that means that multiple modules have the same name in different