Skip to content

Commit d048d29

Browse files
committed
Consolidate submodule resolving code between types.rs and ide_support.rs
1 parent 934aaa2 commit d048d29

File tree

2 files changed

+25
-28
lines changed

2 files changed

+25
-28
lines changed

crates/ty_python_semantic/src/types.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use infer::nearest_enclosing_class;
2-
use itertools::Either;
2+
use itertools::{Either, Itertools};
33
use ruff_db::parsed::parsed_module;
44

55
use std::slice::Iter;
@@ -7535,6 +7535,23 @@ impl<'db> ModuleLiteralType<'db> {
75357535
self._importing_file(db)
75367536
}
75377537

7538+
fn available_submodule_attributes(&self, db: &'db dyn Db) -> impl Iterator<Item = Name> {
7539+
self.importing_file(db)
7540+
.into_iter()
7541+
.flat_map(|file| imported_modules(db, file))
7542+
.filter_map(move |submodule_name| submodule_name.relative_to(self.module(db).name()))
7543+
.filter_map(|relative_submodule| relative_submodule.components().next().map(Name::from))
7544+
}
7545+
7546+
fn resolve_submodule(self, db: &'db dyn Db, name: &str) -> Option<Type<'db>> {
7547+
let importing_file = self.importing_file(db)?;
7548+
let relative_submodule_name = ModuleName::new(name)?;
7549+
let mut absolute_submodule_name = self.module(db).name().clone();
7550+
absolute_submodule_name.extend(&relative_submodule_name);
7551+
let submodule = resolve_module(db, &absolute_submodule_name)?;
7552+
Some(Type::module_literal(db, importing_file, &submodule))
7553+
}
7554+
75387555
fn static_member(self, db: &'db dyn Db, name: &str) -> PlaceAndQualifiers<'db> {
75397556
// `__dict__` is a very special member that is never overridden by module globals;
75407557
// we should always look it up directly as an attribute on `types.ModuleType`,
@@ -7554,17 +7571,9 @@ impl<'db> ModuleLiteralType<'db> {
75547571
// the parent module's `__init__.py` file being evaluated. That said, we have
75557572
// chosen to always have the submodule take priority. (This matches pyright's
75567573
// current behavior, but is the opposite of mypy's current behavior.)
7557-
if let Some(importing_file) = self.importing_file(db) {
7558-
if let Some(submodule_name) = ModuleName::new(name) {
7559-
let imported_submodules = imported_modules(db, importing_file);
7560-
let mut full_submodule_name = self.module(db).name().clone();
7561-
full_submodule_name.extend(&submodule_name);
7562-
if imported_submodules.contains(&full_submodule_name) {
7563-
if let Some(submodule) = resolve_module(db, &full_submodule_name) {
7564-
return Place::bound(Type::module_literal(db, importing_file, &submodule))
7565-
.into();
7566-
}
7567-
}
7574+
if self.available_submodule_attributes(db).contains(name) {
7575+
if let Some(submodule) = self.resolve_submodule(db, name) {
7576+
return Place::bound(submodule).into();
75687577
}
75697578
}
75707579

crates/ty_python_semantic/src/types/ide_support.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use std::cmp::Ordering;
22

3-
use crate::module_resolver::resolve_module;
43
use crate::place::{Place, imported_symbol, place_from_bindings, place_from_declarations};
54
use crate::semantic_index::definition::DefinitionKind;
65
use crate::semantic_index::place::ScopeId;
76
use crate::semantic_index::{
8-
attribute_scopes, global_scope, imported_modules, place_table, semantic_index, use_def_map,
7+
attribute_scopes, global_scope, place_table, semantic_index, use_def_map,
98
};
109
use crate::types::{ClassBase, ClassLiteral, KnownClass, KnownInstanceType, Type};
1110
use crate::{Db, NameKind};
@@ -197,23 +196,12 @@ impl<'db> AllMembers<'db> {
197196
});
198197
}
199198

200-
let module_name = module.name();
201199
self.members.extend(
202200
literal
203-
.importing_file(db)
204-
.into_iter()
205-
.flat_map(|file| imported_modules(db, file))
201+
.available_submodule_attributes(db)
206202
.filter_map(|submodule_name| {
207-
let module = resolve_module(db, submodule_name)?;
208-
let ty = Type::module_literal(db, file, &module);
209-
Some((submodule_name, ty))
210-
})
211-
.filter_map(|(submodule_name, ty)| {
212-
let relative = submodule_name.relative_to(module_name)?;
213-
Some((relative, ty))
214-
})
215-
.filter_map(|(relative_submodule_name, ty)| {
216-
let name = Name::from(relative_submodule_name.components().next()?);
203+
let ty = literal.resolve_submodule(db, &submodule_name)?;
204+
let name = submodule_name.clone();
217205
Some(Member { name, ty })
218206
}),
219207
);

0 commit comments

Comments
 (0)