Skip to content

Commit c72d4f1

Browse files
authored
Add some additional narrowing test cases (#20598)
Requested in #20492 (comment) Regression for the Never's in #18524 (comment)
1 parent 66f83ea commit c72d4f1

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

test-data/unit/check-narrowing.test

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,7 @@ def foo(x: dict[str, Any]) -> bool:
27422742

27432743

27442744
[case testNarrowingTypeObjects]
2745+
# flags: --warn-unreachable
27452746
from __future__ import annotations
27462747
from typing import Callable, Any, TypeVar, Generic, Protocol
27472748
_T_co = TypeVar('_T_co', covariant=True)
@@ -2768,7 +2769,10 @@ def main(key: str):
27682769
existing_value_type = get_type(key)
27692770
if existing_value_type is TupleLike:
27702771
reveal_type(TupleLike) # N: Revealed type is "def [_T_co] (__main__.Boxxy[_T_co`1]) -> __main__.TupleLike[_T_co`1]"
2771-
TupleLike(Box2("str"))
2772+
reveal_type(TupleLike(Box2("str"))) # N: Revealed type is "__main__.TupleLike[builtins.str]"
2773+
2774+
reveal_type(existing_value_type) # N: Revealed type is "(def [_T_co] (__main__.Boxxy[_T_co`1]) -> __main__.TupleLike[_T_co`1]) | type[Any]"
2775+
reveal_type(existing_value_type(Box2("str"))) # N: Revealed type is "__main__.TupleLike[builtins.str] | Any"
27722776
[builtins fixtures/tuple.pyi]
27732777

27742778
[case testNarrowingCollections]

test-data/unit/check-python310.test

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2939,10 +2939,13 @@ def switch(choice: type[T_Choice]) -> None:
29392939
match choice:
29402940
case b.One:
29412941
reveal_type(choice) # N: Revealed type is "def () -> b.One"
2942+
reveal_type(choice()) # N: Revealed type is "b.One"
29422943
case b.Two:
29432944
reveal_type(choice) # N: Revealed type is "def () -> b.Two"
2945+
reveal_type(choice()) # N: Revealed type is "b.Two"
29442946
case _:
29452947
reveal_type(choice) # N: Revealed type is "type[T_Choice`-1]"
2948+
reveal_type(choice()) # N: Revealed type is "b.One | b.Two"
29462949

29472950
[file b.py]
29482951
class One: ...
@@ -3235,3 +3238,76 @@ match config:
32353238
case {"a": 1, **rest}: # E: Incompatible types in capture pattern (pattern captures type "dict[str, object]", variable has type "list[int]")
32363239
...
32373240
[builtins fixtures/dict.pyi]
3241+
3242+
[case testMatchTypeNarrowing]
3243+
# flags: --warn-unreachable
3244+
import builtins
3245+
import typing
3246+
import types
3247+
3248+
def type_bare(field_type: type) -> str:
3249+
match field_type:
3250+
case builtins.int:
3251+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.int"
3252+
ret = "foo"
3253+
case builtins.str:
3254+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.str"
3255+
ret = "foo"
3256+
case builtins.bytes:
3257+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes"
3258+
ret = "foo"
3259+
case builtins.bool:
3260+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool"
3261+
ret = "foo"
3262+
case types.NoneType:
3263+
reveal_type(field_type) # N: Revealed type is "type[None]"
3264+
ret = "foo"
3265+
case _:
3266+
reveal_type(field_type) # N: Revealed type is "builtins.type"
3267+
return "bar"
3268+
return ret
3269+
3270+
def type_any(field_type: type[typing.Any]) -> str:
3271+
match field_type:
3272+
case builtins.int:
3273+
reveal_type(field_type) # N: Revealed type is "type[Any]"
3274+
ret = "foo"
3275+
case builtins.str:
3276+
reveal_type(field_type) # N: Revealed type is "type[Any]"
3277+
ret = "foo"
3278+
case builtins.bytes:
3279+
reveal_type(field_type) # N: Revealed type is "type[Any]"
3280+
ret = "foo"
3281+
case builtins.bool:
3282+
reveal_type(field_type) # N: Revealed type is "type[Any]"
3283+
ret = "foo"
3284+
case types.NoneType:
3285+
reveal_type(field_type) # N: Revealed type is "type[None]"
3286+
ret = "foo"
3287+
case _:
3288+
reveal_type(field_type) # N: Revealed type is "type[Any]"
3289+
return "bar"
3290+
return ret
3291+
3292+
def type_object(field_type: type[object]) -> str:
3293+
match field_type:
3294+
case builtins.int:
3295+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.int"
3296+
ret = "foo"
3297+
case builtins.str:
3298+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.str"
3299+
ret = "foo"
3300+
case builtins.bytes:
3301+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes"
3302+
ret = "foo"
3303+
case builtins.bool:
3304+
reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool"
3305+
ret = "foo"
3306+
case types.NoneType:
3307+
reveal_type(field_type) # N: Revealed type is "type[None]"
3308+
ret = "foo"
3309+
case _:
3310+
reveal_type(field_type) # N: Revealed type is "type[builtins.object]"
3311+
return "bar"
3312+
return ret
3313+
[builtins fixtures/dict.pyi]

0 commit comments

Comments
 (0)