Port Pyright's import resolver to Rust (#5381)

## Summary

This PR contains the first step towards enabling robust first-party,
third-party, and standard library import resolution in Ruff (including
support for `typeshed`, stub files, native modules, etc.) by porting
Pyright's import resolver to Rust.

The strategy taken here was to start with a more-or-less direct port of
the Pyright's TypeScript resolver. The code is intentionally similar,
and the test suite is effectively a superset of Pyright's test suite for
its own resolver. Due to the nature of the port, the code is very, very
non-idiomatic for Rust. The code is also entirely unused outside of the
test suite, and no effort has been made to integrate it with the rest of
the codebase.

Future work will include:

- Refactoring the code (now that it works) to match Rust and Ruff
idioms.
- Further testing, in practice, to ensure that the resolver can resolve
imports in a complex project, when provided with a virtual environment
path.
- Caching, to minimize filesystem lookups and redundant resolutions.
- Integration into Ruff itself (use Ruff's existing settings, find rules
that can make use of robust resolution, etc.)
This commit is contained in:
Charlie Marsh 2023-06-27 12:15:07 -04:00 committed by GitHub
parent 502e15585d
commit 1ed227a1e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 2343 additions and 1 deletions

View file

@ -0,0 +1,14 @@
//! Support for native Python extension modules.
use std::ffi::OsStr;
use std::path::Path;
/// Returns `true` if the given file extension is that of a native module.
pub(crate) fn is_native_module_file_extension(file_extension: &OsStr) -> bool {
file_extension == "so" || file_extension == "pyd" || file_extension == "dylib"
}
/// Returns `true` if the given file name is that of a native module.
pub(crate) fn is_native_module_file_name(_module_name: &Path, _file_name: &Path) -> bool {
todo!()
}