File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1004,6 +1004,10 @@ def is_singleton_identity_type(typ: ProperType) -> bool:
10041004 )
10051005 if isinstance (typ , LiteralType ):
10061006 return typ .is_enum_literal () or isinstance (typ .value , bool )
1007+ if isinstance (typ , TypeType ) and isinstance (typ .item , Instance ) and typ .item .type .is_final :
1008+ return True
1009+ if isinstance (typ , CallableType ) and typ .is_type_obj () and typ .type_object ().is_final :
1010+ return True
10071011 return False
10081012
10091013
Original file line number Diff line number Diff line change @@ -3314,3 +3314,44 @@ def type_object(field_type: type[object]) -> str:
33143314 return "bar"
33153315 return ret
33163316[builtins fixtures/dict.pyi]
3317+
3318+
3319+ [case testMatchFinalClass]
3320+ from typing import final, NoReturn
3321+
3322+ def assert_never(x: NoReturn) -> NoReturn: ...
3323+
3324+ class Types:
3325+
3326+ @final
3327+ class A:
3328+ pass
3329+
3330+ @final
3331+ class B:
3332+ pass
3333+
3334+ def foo(cls: type[Types.A | Types.B]) -> None:
3335+ match cls:
3336+ case Types.A:
3337+ reveal_type(cls) # N: Revealed type is "type[__main__.Types.A]"
3338+ case Types.B:
3339+ reveal_type(cls) # N: Revealed type is "type[__main__.Types.B]"
3340+ case _:
3341+ assert_never(cls)
3342+
3343+
3344+ class TypeTypes:
3345+ A: type[Types.A] = Types.A
3346+ B: type[Types.B] = Types.B
3347+
3348+
3349+ def bar(cls: type[Types.A | Types.B]) -> None:
3350+ match cls:
3351+ case TypeTypes.A:
3352+ reveal_type(cls) # N: Revealed type is "type[__main__.Types.A]"
3353+ case TypeTypes.B:
3354+ reveal_type(cls) # N: Revealed type is "type[__main__.Types.B]"
3355+ case _:
3356+ assert_never(cls)
3357+ [builtins fixtures/tuple.pyi]
You can’t perform that action at this time.
0 commit comments