[ty] support absolute from imports introducing local submodules in __init__.py files (#21372)

By resolving `.` and the LHS of the from import during semantic
indexing, we can check if the LHS is a submodule of `.`, and handle
`from whatever.thispackage.x.y import z` exactly like we do `from .x.y
import z`.

Fixes https://github.com/astral-sh/ty/issues/1484
This commit is contained in:
Aria Desires
2025-11-11 13:04:42 -05:00
committed by GitHub
parent 44b0c9ebac
commit bd8812127d
5 changed files with 79 additions and 68 deletions

View File

@@ -333,7 +333,7 @@ reveal_type(mypackage.nested.X) # revealed: Unknown
### In Non-Stub
`from mypackage.submodule import nested` in an `__init__.py` only creates `nested`.
`from mypackage.submodule import nested` in an `__init__.py` creates both `submodule` and `nested`.
`mypackage/__init__.py`:
@@ -357,12 +357,11 @@ X: int = 42
```py
import mypackage
reveal_type(mypackage.submodule) # revealed: <module 'mypackage.submodule'>
# TODO: this would be nice to support
# error: "has no member `submodule`"
reveal_type(mypackage.submodule) # revealed: Unknown
# error: "has no member `submodule`"
# error: "has no member `nested`"
reveal_type(mypackage.submodule.nested) # revealed: Unknown
# error: "has no member `submodule`"
# error: "has no member `nested`"
reveal_type(mypackage.submodule.nested.X) # revealed: Unknown
reveal_type(mypackage.nested) # revealed: <module 'mypackage.submodule.nested'>
reveal_type(mypackage.nested.X) # revealed: int