diff --git a/mypy/semanal.py b/mypy/semanal.py index 718da41937af..14cb7fe02f85 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -3621,7 +3621,6 @@ def visit_member_expr(self, expr: MemberExpr) -> None: type_info = self.type elif isinstance(base.node, TypeAlias) and base.node.no_args: assert isinstance(base.node.target, ProperType) - # TODO: support chained aliases. if isinstance(base.node.target, Instance): type_info = base.node.target.type @@ -3969,6 +3968,10 @@ def lookup_qualified(self, name: str, ctx: Context, namespace = node.fullname elif isinstance(node, PlaceholderNode): return sym + elif isinstance(node, TypeAlias) and node.no_args: + assert isinstance(node.target, ProperType) + if isinstance(node.target, Instance): + nextsym = node.target.type.get(part) else: if isinstance(node, Var): typ = get_proper_type(node.type) diff --git a/test-data/unit/check-literal.test b/test-data/unit/check-literal.test index da6f5dfd25db..222619c0891d 100644 --- a/test-data/unit/check-literal.test +++ b/test-data/unit/check-literal.test @@ -3149,3 +3149,17 @@ err_code = -TWO if bool(): err_code = -THREE [builtins fixtures/float.pyi] + +[case testAliasForEnumTypeAsLiteral] +from typing_extensions import Literal +from enum import Enum + +class Foo(Enum): + A = 1 + +F = Foo + +x: Literal[Foo.A] +y: Literal[F.A] +reveal_type(x) # N: Revealed type is 'Literal[__main__.Foo.A]' +reveal_type(y) # N: Revealed type is 'Literal[__main__.Foo.A]' diff --git a/test-data/unit/check-type-aliases.test b/test-data/unit/check-type-aliases.test index 4371200bc3d8..1c0803511be5 100644 --- a/test-data/unit/check-type-aliases.test +++ b/test-data/unit/check-type-aliases.test @@ -632,3 +632,24 @@ except E as e: reveal_type(e) # N: Revealed type is '__main__.E' [builtins fixtures/exception.pyi] [out] + +[case testNestedClassOnAliasAsType] +class Out: + class In: + class Inner: + pass + +O = Out +I = Out.In +OI = O.In +A = Out +B = A + +w: O.In +x: I.Inner +y: OI.Inner +z: B.In +reveal_type(w) # N: Revealed type is '__main__.Out.In' +reveal_type(x) # N: Revealed type is '__main__.Out.In.Inner' +reveal_type(y) # N: Revealed type is '__main__.Out.In.Inner' +reveal_type(z) # N: Revealed type is '__main__.Out.In'