Skip to content

Commit a3bc82c

Browse files
committed
stubgen: Allow aliases below the top level
1 parent 2413578 commit a3bc82c

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
@@ -995,8 +995,7 @@ def visit_assignment_stmt(self, o: AssignmentStmt) -> None:
995995
self.process_namedtuple(lvalue, o.rvalue)
996996
continue
997997
if (
998-
self.is_top_level()
999-
and isinstance(lvalue, NameExpr)
998+
isinstance(lvalue, NameExpr)
1000999
and not self.is_private_name(lvalue.name)
10011000
and
10021001
# it is never an alias with explicit annotation
@@ -1114,7 +1113,7 @@ def is_alias_expression(self, expr: Expression, top_level: bool = True) -> bool:
11141113

11151114
def process_typealias(self, lvalue: NameExpr, rvalue: Expression) -> None:
11161115
p = AliasPrinter(self)
1117-
self.add(f"{lvalue.name} = {rvalue.accept(p)}\n")
1116+
self.add(f"{self._indent}{lvalue.name} = {rvalue.accept(p)}\n")
11181117
self.record_name(lvalue.name)
11191118
self._vars[-1].append(lvalue.name)
11201119

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+
pass
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)