diff --git a/crates/ty_python_semantic/resources/mdtest/import/conventions.md b/crates/ty_python_semantic/resources/mdtest/import/conventions.md index 48d93515a8..32ea37d708 100644 --- a/crates/ty_python_semantic/resources/mdtest/import/conventions.md +++ b/crates/ty_python_semantic/resources/mdtest/import/conventions.md @@ -265,12 +265,10 @@ Similarly, for an `__init__.pyi` (stub) file, importing a non-exported name shou but the inference would be `Unknown`. ```py -# error: 15 "Module `a` has no member `Foo`" -# error: 20 "Module `a` has no member `c`" from a import Foo, c, foo -reveal_type(Foo) # revealed: Unknown -reveal_type(c) # revealed: Unknown +reveal_type(Foo) # revealed: +reveal_type(c) # revealed: reveal_type(foo) # revealed: ``` diff --git a/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md b/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md index ce5c995014..60a31b02ae 100644 --- a/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md +++ b/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md @@ -25,7 +25,7 @@ This file currently covers the following details: wild. Equivalent imports like `from whatever.thispackage import a` also introduce a re-export (this has essentially zero ecosystem impact, we just felt it was more consistent). The only way to opt out of this is to rename the import to something else (`from . import a as b`). - `from .a import b` and equivalent does *not* introduce a re-export. + `from .a import b` and equivalent also introduces a re-export, yes this is chaos. Note: almost all tests in here have a stub and non-stub version, because we're interested in both defining symbols *at all* and re-exporting them. @@ -247,10 +247,8 @@ reveal_type(mypackage.submodule) # revealed: Unknown reveal_type(mypackage.submodule.nested) # revealed: Unknown # error: "has no member `submodule`" reveal_type(mypackage.submodule.nested.X) # revealed: Unknown -# error: "has no member `nested`" -reveal_type(mypackage.nested) # revealed: Unknown -# error: "has no member `nested`" -reveal_type(mypackage.nested.X) # revealed: Unknown +reveal_type(mypackage.nested) # revealed: +reveal_type(mypackage.nested.X) # revealed: int ``` ### In Non-Stub @@ -325,10 +323,8 @@ reveal_type(mypackage.submodule) # revealed: Unknown reveal_type(mypackage.submodule.nested) # revealed: Unknown # error: "has no member `submodule`" reveal_type(mypackage.submodule.nested.X) # revealed: Unknown -# error: "has no member `nested`" -reveal_type(mypackage.nested) # revealed: Unknown -# error: "has no member `nested`" -reveal_type(mypackage.nested.X) # revealed: Unknown +reveal_type(mypackage.nested) # revealed: +reveal_type(mypackage.nested.X) # revealed: int ``` ### In Non-Stub diff --git a/crates/ty_python_semantic/src/semantic_index/builder.rs b/crates/ty_python_semantic/src/semantic_index/builder.rs index dc3acb1434..8ced012a20 100644 --- a/crates/ty_python_semantic/src/semantic_index/builder.rs +++ b/crates/ty_python_semantic/src/semantic_index/builder.rs @@ -1484,6 +1484,9 @@ impl<'ast> Visitor<'ast> for SemanticIndexBuilder<'_, 'ast> { && !self.seen_submodule_imports.contains(direct_submodule) && self.current_scope().is_global() { + // Record that this is equivalent to `from .a import ...` + is_self_import = true; + self.seen_submodule_imports .insert(direct_submodule.to_owned());