Skip to content

Commit 7c14eba

Browse files
authored
stubgen: Allow aliases below the top level (#14388)
1 parent 1d247ea commit 7c14eba

File tree

2 files changed

+52
-13
lines changed

2 files changed

+52
-13
lines changed

mypy/stubgen.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -999,8 +999,7 @@ def visit_assignment_stmt(self, o: AssignmentStmt) -> None:
999999
self.process_namedtuple(lvalue, o.rvalue)
10001000
continue
10011001
if (
1002-
self.is_top_level()
1003-
and isinstance(lvalue, NameExpr)
1002+
isinstance(lvalue, NameExpr)
10041003
and not self.is_private_name(lvalue.name)
10051004
and
10061005
# it is never an alias with explicit annotation
@@ -1118,7 +1117,7 @@ def is_alias_expression(self, expr: Expression, top_level: bool = True) -> bool:
11181117

11191118
def process_typealias(self, lvalue: NameExpr, rvalue: Expression) -> None:
11201119
p = AliasPrinter(self)
1121-
self.add(f"{lvalue.name} = {rvalue.accept(p)}\n")
1120+
self.add(f"{self._indent}{lvalue.name} = {rvalue.accept(p)}\n")
11221121
self.record_name(lvalue.name)
11231122
self._vars[-1].append(lvalue.name)
11241123

test-data/unit/stubgen.test

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -947,16 +947,6 @@ from typing import Any
947947

948948
alias = Container[Any]
949949

950-
[case testAliasOnlyToplevel]
951-
class Foo:
952-
alias = str
953-
954-
[out]
955-
from _typeshed import Incomplete
956-
957-
class Foo:
958-
alias: Incomplete
959-
960950
[case testAliasExceptions]
961951
noalias1 = None
962952
noalias2 = ...
@@ -969,6 +959,56 @@ noalias1: Incomplete
969959
noalias2: Incomplete
970960
noalias3: bool
971961

962+
[case testComplexAlias]
963+
# modules: main a
964+
965+
from a import valid
966+
967+
def func() -> int:
968+
return 2
969+
970+
aliased_func = func
971+
int_value = 1
972+
973+
class A:
974+
cls_var = valid
975+
976+
def __init__(self, arg: str) -> None:
977+
self.self_var = arg
978+
979+
def meth(self) -> None:
980+
func_value = int_value
981+
982+
alias_meth = meth
983+
alias_func = func
984+
alias_alias_func = aliased_func
985+
int_value = int_value
986+
987+
[file a.py]
988+
valid : list[int] = [1, 2, 3]
989+
990+
991+
[out]
992+
# main.pyi
993+
from _typeshed import Incomplete
994+
from a import valid
995+
996+
def func() -> int: ...
997+
aliased_func = func
998+
int_value: int
999+
1000+
class A:
1001+
cls_var = valid
1002+
self_var: Incomplete
1003+
def __init__(self, arg: str) -> None: ...
1004+
def meth(self) -> None: ...
1005+
alias_meth = meth
1006+
alias_func = func
1007+
alias_alias_func = aliased_func
1008+
int_value = int_value
1009+
# a.pyi
1010+
valid: list[int]
1011+
9721012
-- More features/fixes:
9731013
-- do not export deleted names
9741014

0 commit comments

Comments
 (0)