| -- Test cases for warning generation. |
| |
| -- Redundant casts |
| -- --------------- |
| |
| [case testRedundantCast] |
| # flags: --warn-redundant-casts |
| from typing import cast |
| a = 1 |
| b = cast(str, a) |
| c = cast(int, a) |
| [out] |
| main:5: note: Redundant cast to "int" |
| |
| [case testRedundantCastWithIsinstance] |
| # flags: --warn-redundant-casts |
| from typing import cast, Union |
| x = 1 # type: Union[int, str] |
| if isinstance(x, str): |
| cast(str, x) |
| [builtins fixtures/isinstance.pyi] |
| [out] |
| main:5: note: Redundant cast to "str" |
| |
| [case testCastToSuperclassNotRedundant] |
| # flags: --warn-redundant-casts |
| from typing import cast, TypeVar, List |
| T = TypeVar('T') |
| def add(xs: List[T], ys: List[T]) -> List[T]: pass |
| class A: pass |
| class B(A): pass |
| a = A() |
| b = B() |
| # Without the cast, the following line would fail to type check. |
| c = add([cast(A, b)], [a]) |
| [builtins fixtures/list.pyi] |
| |
| |
| -- Unused 'type: ignore' comments |
| -- ------------------------------ |
| |
| [case testUnusedTypeIgnore] |
| # flags: --warn-unused-ignores |
| a = 1 |
| a = 'a' # type: ignore |
| a = 2 # type: ignore # N: unused 'type: ignore' comment |
| a = 'b' # E: Incompatible types in assignment (expression has type "str", variable has type "int") |
| |
| [case testUnusedTypeIgnoreImport] |
| # flags: --warn-unused-ignores |
| import banana # type: ignore |
| import m # type: ignore |
| from m import * # type: ignore |
| [file m.py] |
| pass |
| [out] |
| main:3: note: unused 'type: ignore' comment |
| main:4: note: unused 'type: ignore' comment |
| |
| |
| -- No return |
| -- --------- |
| |
| [case testNoReturn] |
| # flags: --warn-no-return |
| def f() -> int: |
| pass |
| |
| def g() -> int: |
| if bool(): |
| return 1 |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: note: Missing return statement |
| |
| [case testNoReturnWhile] |
| # flags: --warn-no-return |
| def h() -> int: |
| while True: |
| if bool(): |
| return 1 |
| |
| def i() -> int: |
| while 1: |
| if bool(): |
| return 1 |
| if bool(): |
| break |
| |
| def j() -> int: |
| while 1: |
| if bool(): |
| return 1 |
| if bool(): |
| continue |
| [builtins fixtures/list.pyi] |
| [out] |
| main:7: note: Missing return statement |
| |
| [case testNoReturnExcept] |
| # flags: --warn-no-return |
| def f() -> int: |
| try: |
| return 1 |
| except: |
| pass |
| def g() -> int: |
| try: |
| pass |
| except: |
| return 1 |
| else: |
| return 1 |
| def h() -> int: |
| try: |
| pass |
| except: |
| pass |
| else: |
| pass |
| finally: |
| return 1 |
| [builtins fixtures/exception.pyi] |
| [out] |
| main:2: note: Missing return statement |
| |
| [case testNoReturnEmptyBodyWithDocstring] |
| def f() -> int: |
| """Return the number of peppers.""" |
| # This might be an @abstractmethod, for example |
| pass |
| [out] |