diff --git a/test-data/unit/check-narrowing.test b/test-data/unit/check-narrowing.test index 237271558ac6..d0543c6965e0 100644 --- a/test-data/unit/check-narrowing.test +++ b/test-data/unit/check-narrowing.test @@ -2742,6 +2742,7 @@ def foo(x: dict[str, Any]) -> bool: [case testNarrowingTypeObjects] +# flags: --warn-unreachable from __future__ import annotations from typing import Callable, Any, TypeVar, Generic, Protocol _T_co = TypeVar('_T_co', covariant=True) @@ -2768,7 +2769,10 @@ def main(key: str): existing_value_type = get_type(key) if existing_value_type is TupleLike: reveal_type(TupleLike) # N: Revealed type is "def [_T_co] (__main__.Boxxy[_T_co`1]) -> __main__.TupleLike[_T_co`1]" - TupleLike(Box2("str")) + reveal_type(TupleLike(Box2("str"))) # N: Revealed type is "__main__.TupleLike[builtins.str]" + + reveal_type(existing_value_type) # N: Revealed type is "(def [_T_co] (__main__.Boxxy[_T_co`1]) -> __main__.TupleLike[_T_co`1]) | type[Any]" + reveal_type(existing_value_type(Box2("str"))) # N: Revealed type is "__main__.TupleLike[builtins.str] | Any" [builtins fixtures/tuple.pyi] [case testNarrowingCollections] diff --git a/test-data/unit/check-python310.test b/test-data/unit/check-python310.test index 78af1dc0a709..307ac6c9b5dc 100644 --- a/test-data/unit/check-python310.test +++ b/test-data/unit/check-python310.test @@ -2939,10 +2939,13 @@ def switch(choice: type[T_Choice]) -> None: match choice: case b.One: reveal_type(choice) # N: Revealed type is "def () -> b.One" + reveal_type(choice()) # N: Revealed type is "b.One" case b.Two: reveal_type(choice) # N: Revealed type is "def () -> b.Two" + reveal_type(choice()) # N: Revealed type is "b.Two" case _: reveal_type(choice) # N: Revealed type is "type[T_Choice`-1]" + reveal_type(choice()) # N: Revealed type is "b.One | b.Two" [file b.py] class One: ... @@ -3235,3 +3238,76 @@ match config: case {"a": 1, **rest}: # E: Incompatible types in capture pattern (pattern captures type "dict[str, object]", variable has type "list[int]") ... [builtins fixtures/dict.pyi] + +[case testMatchTypeNarrowing] +# flags: --warn-unreachable +import builtins +import typing +import types + +def type_bare(field_type: type) -> str: + match field_type: + case builtins.int: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.int" + ret = "foo" + case builtins.str: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.str" + ret = "foo" + case builtins.bytes: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes" + ret = "foo" + case builtins.bool: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool" + ret = "foo" + case types.NoneType: + reveal_type(field_type) # N: Revealed type is "type[None]" + ret = "foo" + case _: + reveal_type(field_type) # N: Revealed type is "builtins.type" + return "bar" + return ret + +def type_any(field_type: type[typing.Any]) -> str: + match field_type: + case builtins.int: + reveal_type(field_type) # N: Revealed type is "type[Any]" + ret = "foo" + case builtins.str: + reveal_type(field_type) # N: Revealed type is "type[Any]" + ret = "foo" + case builtins.bytes: + reveal_type(field_type) # N: Revealed type is "type[Any]" + ret = "foo" + case builtins.bool: + reveal_type(field_type) # N: Revealed type is "type[Any]" + ret = "foo" + case types.NoneType: + reveal_type(field_type) # N: Revealed type is "type[None]" + ret = "foo" + case _: + reveal_type(field_type) # N: Revealed type is "type[Any]" + return "bar" + return ret + +def type_object(field_type: type[object]) -> str: + match field_type: + case builtins.int: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.int" + ret = "foo" + case builtins.str: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.str" + ret = "foo" + case builtins.bytes: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes" + ret = "foo" + case builtins.bool: + reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool" + ret = "foo" + case types.NoneType: + reveal_type(field_type) # N: Revealed type is "type[None]" + ret = "foo" + case _: + reveal_type(field_type) # N: Revealed type is "type[builtins.object]" + return "bar" + return ret +[builtins fixtures/dict.pyi]