Skip to main content

ty_module_resolver/
lib.rs

1use std::hash::BuildHasherDefault;
2use std::iter::FusedIterator;
3
4use ruff_db::system::SystemPath;
5use rustc_hash::FxHasher;
6
7pub use db::Db;
8pub use environment::{ResolverEnvironment, ResolverFile};
9pub use module::KnownModule;
10pub use module::Module;
11pub use module_name::{ImportingFile, ModuleName, ModuleNameResolutionError};
12pub use path::{SearchPath, SearchPathError};
13pub use resolve::{
14    SearchPaths, file_to_module, resolve_module, resolve_module_confident,
15    resolve_module_for_import_from, resolve_real_module, resolve_real_module_confident,
16    resolve_real_shadowable_module,
17};
18pub use settings::{SearchPathSettings, SearchPathSettingsError};
19pub use strategy::{FallibleStrategy, MisconfigurationStrategy, UseDefaultStrategy};
20pub use typeshed::{PyVersionRange, TypeshedVersions, TypeshedVersionsParseError};
21
22pub use list::{all_modules, list_modules};
23pub use module_glob::{ModuleGlobError, ModuleGlobSet, ModuleGlobSetBuilder, ModuleNameMatch};
24pub use resolve::{ModuleResolveMode, SearchPathIterator, search_paths};
25
26mod db;
27mod environment;
28mod list;
29mod module;
30mod module_glob;
31mod module_name;
32mod path;
33mod resolve;
34mod settings;
35mod strategy;
36mod typeshed;
37
38type FxOrderMap<K, V> = ordermap::map::OrderMap<K, V, BuildHasherDefault<FxHasher>>;
39
40#[cfg(test)]
41mod testing;
42
43/// Returns an iterator over all search paths pointing to a system path
44pub fn system_module_search_paths<'db>(
45    db: &'db dyn Db,
46    resolver_environment: ResolverEnvironment<'db>,
47) -> SystemModuleSearchPathsIter<'db> {
48    SystemModuleSearchPathsIter {
49        // Always run in `Typing` mode because we want to include as much as possible
50        // and we don't care about the "real" stdlib
51        inner: search_paths(db, resolver_environment, ModuleResolveMode::Typing),
52    }
53}
54
55pub struct SystemModuleSearchPathsIter<'db> {
56    inner: SearchPathIterator<'db>,
57}
58
59impl<'db> Iterator for SystemModuleSearchPathsIter<'db> {
60    type Item = &'db SystemPath;
61
62    fn next(&mut self) -> Option<Self::Item> {
63        loop {
64            let next = self.inner.next()?;
65
66            if let Some(system_path) = next.as_system_path() {
67                return Some(system_path);
68            }
69        }
70    }
71}
72
73impl FusedIterator for SystemModuleSearchPathsIter<'_> {}