Skip to content

Add basic support for PEP 702 (@deprecated). #17476

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 40 commits into from
Oct 6, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f04f4e3
Add basic support for PEP 702 (@deprecated).
tyralla Jul 3, 2024
973bf2d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 3, 2024
a88f4b4
use `type: ignore[deprecated]` when importing `abstractproperty`
tyralla Jul 3, 2024
91612c9
Merge remote-tracking branch 'mypypy/feature/support_deprecated' into…
tyralla Jul 3, 2024
faa4911
accept deprecated.args >= 1
tyralla Jul 4, 2024
101e9b8
": " instead of " - "
tyralla Jul 4, 2024
e3dfacb
only consider `warnings.deprecated` and `typing_extensions.deprecated…
tyralla Jul 4, 2024
cbf7574
note instead of error
tyralla Jul 4, 2024
9a947a5
remove walrusses
tyralla Jul 4, 2024
6d92318
document the new option
tyralla Jul 4, 2024
afa0336
motivate the semantic analyzer
tyralla Jul 4, 2024
7bfb534
`report-deprecated-as-error` instead of `warn-deprecated` and three n…
tyralla Jul 4, 2024
1042c65
fix a typo in error_code_list2.rst
tyralla Jul 4, 2024
978b1a2
additional note when PEP 702 is unsatisfied with the order of `@depre…
tyralla Jul 4, 2024
b0ced07
mention the affected overload
tyralla Jul 4, 2024
a07fc64
Merge remote-tracking branch 'mypypy/feature/support_deprecated' into…
tyralla Jul 4, 2024
b527250
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 4, 2024
f636024
add an annotation required by mypyc
tyralla Jul 4, 2024
63a725e
Merge remote-tracking branch 'mypypy/feature/support_deprecated' into…
tyralla Jul 4, 2024
966ac8b
refactor: create the whole deprecation warning in one place
tyralla Jul 5, 2024
6a7dfe0
refactor: get rid of the `memberaccess` parameter
tyralla Jul 5, 2024
1a40953
refactor: merge `check_deprecated_function` and `check_deprecated_cla…
tyralla Jul 5, 2024
1372e66
refactor: convert `get_deprecation_warning` to `create_deprecation_wa…
tyralla Jul 5, 2024
286371f
prefix the warnings with `class ...`, `function ...`, or `overload ..…
tyralla Jul 5, 2024
6f54dab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 5, 2024
8c0260e
Consider `CallableType.deprecated` in `__hash__`, `__eq__`, `serializ…
tyralla Aug 27, 2024
cf2dcaf
Add a few fine-grained tests (of which `testAddFunctionDeprecationInd…
tyralla Aug 27, 2024
6a93d6a
Merge branch 'feature/support_deprecated' of https://github.com/tyral…
tyralla Aug 27, 2024
a6d0e59
Move the complete creation process of warning notes from `checker.py`…
tyralla Sep 22, 2024
6163787
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 22, 2024
49ee7a8
Move the `deprecation` attribute from the nodes `CallableType` and `O…
tyralla Sep 28, 2024
250e171
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 28, 2024
09a53d5
Modify function`snapshot_symbol_table` by removing the "CrossRef" sp…
tyralla Sep 29, 2024
31c4296
`typ: SymbolNode` -> `node: SymbolNode`
tyralla Sep 29, 2024
90fb06d
`type_` -> typ
tyralla Sep 29, 2024
beed6a5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 29, 2024
8eb2e77
Revert commit 09a53d5b (regarding `astdiff.py` but not `fine-grained.…
tyralla Oct 6, 2024
988bf5f
Merge branch 'master' into feature/support_deprecated
tyralla Oct 6, 2024
80ddc68
Add `testDeprecateFunctionAlreadyDecorated`.
tyralla Oct 6, 2024
d104f26
Add `deprecated` to the `Func` snapshot and adjust test `testDeprecat…
tyralla Oct 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
": " instead of " - "
  • Loading branch information
tyralla committed Jul 4, 2024
commit 101e9b8f85c6c6cb9c690508915e4675bcbc145a
2 changes: 1 addition & 1 deletion mypy/checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -7603,7 +7603,7 @@ def warn_deprecated(
name = func.fullname
else:
name = type_.fullname
self.msg.fail(f"{name} is deprecated - {deprecated}", context, code=codes.DEPRECATED)
self.msg.fail(f"{name} is deprecated: {deprecated}", context, code=codes.DEPRECATED)


class CollectArgTypeVarTypes(TypeTraverserVisitor):
Expand Down
130 changes: 65 additions & 65 deletions test-data/unit/check-deprecated.test
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ from typing_extensions import deprecated
@deprecated("use f2 instead")
def f() -> None: ...

f # E: __main__.f is deprecated - use f2 instead
f(1) # E: __main__.f is deprecated - use f2 instead \
f # E: __main__.f is deprecated: use f2 instead # type: ignore[deprecated]
f(1) # E: __main__.f is deprecated: use f2 instead \
# E: Too many arguments for "f"
f[1] # E: __main__.f is deprecated - use f2 instead \
f[1] # E: __main__.f is deprecated: use f2 instead \
# E: Value of type "Callable[[], None]" is not indexable
g = f # E: __main__.f is deprecated - use f2 instead
g() # E: __main__.f is deprecated - use f2 instead
t = (f, f, g) # E: __main__.f is deprecated - use f2 instead
g = f # E: __main__.f is deprecated: use f2 instead
g() # E: __main__.f is deprecated: use f2 instead
t = (f, f, g) # E: __main__.f is deprecated: use f2 instead

[builtins fixtures/tuple.pyi]

Expand All @@ -25,17 +25,17 @@ import m
import p.s
import m as n
import p.s as ps
from m import f # E: m.f is deprecated - use f2 instead
from p.s import g # E: p.s.g is deprecated - use g2 instead
from m import f # E: m.f is deprecated: use f2 instead
from p.s import g # E: p.s.g is deprecated: use g2 instead
from k import *

m.f() # E: m.f is deprecated - use f2 instead
p.s.g() # E: p.s.g is deprecated - use g2 instead
n.f() # E: m.f is deprecated - use f2 instead
ps.g() # E: p.s.g is deprecated - use g2 instead
m.f() # E: m.f is deprecated: use f2 instead
p.s.g() # E: p.s.g is deprecated: use g2 instead
n.f() # E: m.f is deprecated: use f2 instead
ps.g() # E: p.s.g is deprecated: use g2 instead
f()
g()
h() # E: k.h is deprecated - use h2 instead
h() # E: k.h is deprecated: use h2 instead

[file m.py]
from typing_extensions import deprecated
Expand Down Expand Up @@ -65,16 +65,16 @@ from typing_extensions import deprecated
@deprecated("use C2 instead")
class C: ...

c: C # E: __main__.C is deprecated - use C2 instead
C() # E: __main__.C is deprecated - use C2 instead
C.missing() # E: __main__.C is deprecated - use C2 instead \
c: C # E: __main__.C is deprecated: use C2 instead
C() # E: __main__.C is deprecated: use C2 instead
C.missing() # E: __main__.C is deprecated: use C2 instead \
# E: "Type[C]" has no attribute "missing"
C.__init__(c) # E: __main__.C is deprecated - use C2 instead
C(1) # E: __main__.C is deprecated - use C2 instead \
C.__init__(c) # E: __main__.C is deprecated: use C2 instead
C(1) # E: __main__.C is deprecated: use C2 instead \
# E: Too many arguments for "C"
D = C # E: __main__.C is deprecated - use C2 instead
D = C # E: __main__.C is deprecated: use C2 instead
D()
t = (C, C, D) # E: __main__.C is deprecated - use C2 instead
t = (C, C, D) # E: __main__.C is deprecated: use C2 instead

[builtins fixtures/tuple.pyi]

Expand All @@ -85,17 +85,17 @@ import m
import p.s
import m as n
import p.s as ps
from m import C # E: m.C is deprecated - use C2 instead
from p.s import D # E: p.s.D is deprecated - use D2 instead
from m import C # E: m.C is deprecated: use C2 instead
from p.s import D # E: p.s.D is deprecated: use D2 instead
from k import *

m.C() # E: m.C is deprecated - use C2 instead
p.s.D() # E: p.s.D is deprecated - use D2 instead
n.C() # E: m.C is deprecated - use C2 instead
ps.D() # E: p.s.D is deprecated - use D2 instead
m.C() # E: m.C is deprecated: use C2 instead
p.s.D() # E: p.s.D is deprecated: use D2 instead
n.C() # E: m.C is deprecated: use C2 instead
ps.D() # E: p.s.D is deprecated: use D2 instead
C()
D()
E() # E: k.E is deprecated - use E2 instead
E() # E: k.E is deprecated: use E2 instead

[file m.py]
from typing_extensions import deprecated
Expand Down Expand Up @@ -126,9 +126,9 @@ from typing_extensions import deprecated
class C:
def __init__(self) -> None: ...

c: C # E: __main__.C is deprecated - use C2 instead
C() # E: __main__.C is deprecated - use C2 instead
C.__init__(c) # E: __main__.C is deprecated - use C2 instead
c: C # E: __main__.C is deprecated: use C2 instead
C() # E: __main__.C is deprecated: use C2 instead
C.__init__(c) # E: __main__.C is deprecated: use C2 instead

[builtins fixtures/tuple.pyi]

Expand Down Expand Up @@ -166,14 +166,14 @@ class B:

a = A()
b = B()
a + 1 # E: __main__.A.__add__ is deprecated - no A + int
1 + a # E: __main__.A.__radd__ is deprecated - no int + A
a += 1 # E: __main__.A.__iadd__ is deprecated - no A = A + int
for i in a: # E: __main__.A.__iter__ is deprecated - no iteration
a + 1 # E: __main__.A.__add__ is deprecated: no A + int
1 + a # E: __main__.A.__radd__ is deprecated: no int + A
a += 1 # E: __main__.A.__iadd__ is deprecated: no A = A + int
for i in a: # E: __main__.A.__iter__ is deprecated: no iteration
reveal_type(i) # N: Revealed type is "builtins.int"
1 in a # E: __main__.A.__iter__ is deprecated - no iteration
1 in b # E: __main__.B.__contains__ is deprecated - no in
~a # E: __main__.A.__invert__ is deprecated - no inversion
1 in a # E: __main__.A.__iter__ is deprecated: no iteration
1 in b # E: __main__.B.__contains__ is deprecated: no in
~a # E: __main__.A.__invert__ is deprecated: no inversion

[builtins fixtures/tuple.pyi]

Expand Down Expand Up @@ -206,12 +206,12 @@ class A:
def __iadd__(self, v: Union[int, str]) -> A: ...

a = A()
a + 1 # E: __main__.A.__add__ is deprecated - no A + int
a + 1 # E: __main__.A.__add__ is deprecated: no A + int
a + "x"
1 + a
"x" + a # E: __main__.A.__radd__ is deprecated - no str + A
a += 1 # E: __main__.A.__iadd__ is deprecated - no A += Any
a += "x" # E: __main__.A.__iadd__ is deprecated - no A += Any
"x" + a # E: __main__.A.__radd__ is deprecated: no str + A
a += 1 # E: __main__.A.__iadd__ is deprecated: no A += Any
a += "x" # E: __main__.A.__iadd__ is deprecated: no A += Any

[builtins fixtures/tuple.pyi]

Expand All @@ -234,18 +234,18 @@ class C:
@staticmethod
def k() -> None: ...

C.f # E: __main__.C.f is deprecated - use g instead
C().f # E: __main__.C.f is deprecated - use g instead
C().f() # E: __main__.C.f is deprecated - use g instead
C().f(1) # E: __main__.C.f is deprecated - use g instead \
C.f # E: __main__.C.f is deprecated: use g instead
C().f # E: __main__.C.f is deprecated: use g instead
C().f() # E: __main__.C.f is deprecated: use g instead
C().f(1) # E: __main__.C.f is deprecated: use g instead \
# E: Too many arguments for "f" of "C"
f = C().f # E: __main__.C.f is deprecated - use g instead
f() # E: __main__.C.f is deprecated - use g instead
t = (C.f, C.f, C.g) # E: __main__.C.f is deprecated - use g instead
f = C().f # E: __main__.C.f is deprecated: use g instead
f() # E: __main__.C.f is deprecated: use g instead
t = (C.f, C.f, C.g) # E: __main__.C.f is deprecated: use g instead

C().g()
C().h() # E: __main__.C.h is deprecated - use g instead
C().k() # E: __main__.C.k is deprecated - use g instead
C().h() # E: __main__.C.h is deprecated: use g instead
C().k() # E: __main__.C.k is deprecated: use g instead

[builtins fixtures/callable.pyi]

Expand All @@ -260,9 +260,9 @@ class C:
def f(self) -> None: ...
def g(self) -> None: ...

C().f() # E: __main__.C is deprecated - use D instead \
# E: __main__.C.f is deprecated - use g instead
C().g() # E: __main__.C is deprecated - use D instead
C().f() # E: __main__.C is deprecated: use D instead \
# E: __main__.C.f is deprecated: use g instead
C().g() # E: __main__.C is deprecated: use D instead

[builtins fixtures/callable.pyi]

Expand All @@ -283,17 +283,17 @@ class C:
def g(self, v: int) -> None: ...


C.f # E: __main__.C.f is deprecated - use f2 instead
C().f # E: __main__.C.f is deprecated - use f2 instead
C().f() # E: __main__.C.f is deprecated - use f2 instead \
C.f # E: __main__.C.f is deprecated: use f2 instead
C().f # E: __main__.C.f is deprecated: use f2 instead
C().f() # E: __main__.C.f is deprecated: use f2 instead \
# E: "int" not callable
C().f = 1 # E: Property "f" defined in "C" is read-only \
# E: __main__.C.f is deprecated - use f2 instead
# E: __main__.C.f is deprecated: use f2 instead

C.g
C().g
C().g = 1 # E: __main__.C.g is deprecated - use g2 instead
C().g = "x" # E: __main__.C.g is deprecated - use g2 instead \
C().g = 1 # E: __main__.C.g is deprecated: use g2 instead
C().g = "x" # E: __main__.C.g is deprecated: use g2 instead \
# E: Incompatible types in assignment (expression has type "str", variable has type "int")

[builtins fixtures/property.pyi]
Expand All @@ -311,10 +311,10 @@ def f(x: str) -> str: ...
@deprecated("use f2 instead")
def f(x: Union[int, str]) -> Union[int, str]: ...

f # E: __main__.f is deprecated - use f2 instead
f(1) # E: __main__.f is deprecated - use f2 instead
f("x") # E: __main__.f is deprecated - use f2 instead
f(1.0) # E: __main__.f is deprecated - use f2 instead \
f # E: __main__.f is deprecated: use f2 instead
f(1) # E: __main__.f is deprecated: use f2 instead
f("x") # E: __main__.f is deprecated: use f2 instead
f(1.0) # E: __main__.f is deprecated: use f2 instead \
# E: No overload variant of "f" matches argument type "float" \
# N: Possible overload variants: \
# N: def f(x: int) -> int \
Expand All @@ -328,7 +328,7 @@ def g(x: str) -> str: ...
def g(x: Union[int, str]) -> Union[int, str]: ...

g
g(1) # E: __main__.g is deprecated - work with str instead
g(1) # E: __main__.g is deprecated: work with str instead
g("x")
g(1.0) # E: No overload variant of "g" matches argument type "float" \
# N: Possible overload variants: \
Expand All @@ -344,7 +344,7 @@ def h(x: Union[int, str]) -> Union[int, str]: ...

h
h(1)
h("x") # E: __main__.h is deprecated - work with int instead
h("x") # E: __main__.h is deprecated: work with int instead
h(1.0) # E: No overload variant of "h" matches argument type "float" \
# N: Possible overload variants: \
# N: def h(x: int) -> int \
Expand Down