Add a note to diagnostics why the rule is enabled (#17854)

This commit is contained in:
Micha Reiser 2025-05-06 20:29:03 +02:00 committed by GitHub
parent 9085f18353
commit b2de749c32
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
86 changed files with 184 additions and 3 deletions

View file

@ -150,6 +150,7 @@ fn config_override_python_version() -> anyhow::Result<()> {
5 | print(sys.last_exc) 5 | print(sys.last_exc)
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
| |
info: `lint:unresolved-attribute` is enabled by default
Found 1 diagnostic Found 1 diagnostic
@ -284,6 +285,7 @@ fn cli_arguments_are_relative_to_the_current_directory() -> anyhow::Result<()> {
3 | 3 |
4 | stat = add(10, 15) 4 | stat = add(10, 15)
| |
info: `lint:unresolved-import` is enabled by default
Found 1 diagnostic Found 1 diagnostic
@ -384,6 +386,7 @@ fn configuration_rule_severity() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` is enabled by default
warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> test.py:7:7 --> test.py:7:7
@ -393,6 +396,7 @@ fn configuration_rule_severity() -> anyhow::Result<()> {
7 | print(x) # possibly-unresolved-reference 7 | print(x) # possibly-unresolved-reference
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -420,6 +424,7 @@ fn configuration_rule_severity() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` was selected in the configuration file
Found 1 diagnostic Found 1 diagnostic
@ -460,6 +465,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
3 | 3 |
4 | y = 4 / 0 4 | y = 4 / 0
| |
info: `lint:unresolved-import` is enabled by default
error: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero error: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero
--> test.py:4:5 --> test.py:4:5
@ -471,6 +477,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
5 | 5 |
6 | for a in range(0, int(y)): 6 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` is enabled by default
warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> test.py:9:7 --> test.py:9:7
@ -480,6 +487,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
9 | print(x) # possibly-unresolved-reference 9 | print(x) # possibly-unresolved-reference
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` is enabled by default
Found 3 diagnostics Found 3 diagnostics
@ -507,6 +515,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
3 | 3 |
4 | y = 4 / 0 4 | y = 4 / 0
| |
info: `lint:unresolved-import` was selected on the command line
warning: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero warning: lint:division-by-zero: Cannot divide object of type `Literal[4]` by zero
--> test.py:4:5 --> test.py:4:5
@ -518,6 +527,7 @@ fn cli_rule_severity() -> anyhow::Result<()> {
5 | 5 |
6 | for a in range(0, int(y)): 6 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` was selected on the command line
Found 2 diagnostics Found 2 diagnostics
@ -558,6 +568,7 @@ fn cli_rule_severity_precedence() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` is enabled by default
warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> test.py:7:7 --> test.py:7:7
@ -567,6 +578,7 @@ fn cli_rule_severity_precedence() -> anyhow::Result<()> {
7 | print(x) # possibly-unresolved-reference 7 | print(x) # possibly-unresolved-reference
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -595,6 +607,7 @@ fn cli_rule_severity_precedence() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` was selected on the command line
Found 1 diagnostic Found 1 diagnostic
@ -672,6 +685,7 @@ fn exit_code_only_warnings() -> anyhow::Result<()> {
1 | print(x) # [unresolved-reference] 1 | print(x) # [unresolved-reference]
| ^ | ^
| |
info: `lint:unresolved-reference` is enabled by default
Found 1 diagnostic Found 1 diagnostic
@ -755,6 +769,7 @@ fn exit_code_no_errors_but_error_on_warning_is_true() -> anyhow::Result<()> {
1 | print(x) # [unresolved-reference] 1 | print(x) # [unresolved-reference]
| ^ | ^
| |
info: `lint:unresolved-reference` is enabled by default
Found 1 diagnostic Found 1 diagnostic
@ -787,6 +802,7 @@ fn exit_code_no_errors_but_error_on_warning_is_enabled_in_configuration() -> any
1 | print(x) # [unresolved-reference] 1 | print(x) # [unresolved-reference]
| ^ | ^
| |
info: `lint:unresolved-reference` is enabled by default
Found 1 diagnostic Found 1 diagnostic
@ -817,6 +833,7 @@ fn exit_code_both_warnings_and_errors() -> anyhow::Result<()> {
| ^ | ^
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| |
info: `lint:unresolved-reference` is enabled by default
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7 --> test.py:3:7
@ -825,6 +842,7 @@ fn exit_code_both_warnings_and_errors() -> anyhow::Result<()> {
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| ^ | ^
| |
info: `lint:non-subscriptable` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -855,6 +873,7 @@ fn exit_code_both_warnings_and_errors_and_error_on_warning_is_true() -> anyhow::
| ^ | ^
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| |
info: `lint:unresolved-reference` is enabled by default
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7 --> test.py:3:7
@ -863,6 +882,7 @@ fn exit_code_both_warnings_and_errors_and_error_on_warning_is_true() -> anyhow::
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| ^ | ^
| |
info: `lint:non-subscriptable` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -893,6 +913,7 @@ fn exit_code_exit_zero_is_true() -> anyhow::Result<()> {
| ^ | ^
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| |
info: `lint:unresolved-reference` is enabled by default
error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method error: lint:non-subscriptable: Cannot subscript object of type `Literal[4]` with no `__getitem__` method
--> test.py:3:7 --> test.py:3:7
@ -901,6 +922,7 @@ fn exit_code_exit_zero_is_true() -> anyhow::Result<()> {
3 | print(4[1]) # [non-subscriptable] 3 | print(4[1]) # [non-subscriptable]
| ^ | ^
| |
info: `lint:non-subscriptable` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -954,6 +976,7 @@ fn user_configuration() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` was selected in the configuration file
warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined warning: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> main.py:7:7 --> main.py:7:7
@ -963,6 +986,7 @@ fn user_configuration() -> anyhow::Result<()> {
7 | print(x) 7 | print(x)
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` is enabled by default
Found 2 diagnostics Found 2 diagnostics
@ -996,6 +1020,7 @@ fn user_configuration() -> anyhow::Result<()> {
3 | 3 |
4 | for a in range(0, int(y)): 4 | for a in range(0, int(y)):
| |
info: `lint:division-by-zero` was selected in the configuration file
error: lint:possibly-unresolved-reference: Name `x` used when possibly not defined error: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> main.py:7:7 --> main.py:7:7
@ -1005,6 +1030,7 @@ fn user_configuration() -> anyhow::Result<()> {
7 | print(x) 7 | print(x)
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` was selected in the configuration file
Found 2 diagnostics Found 2 diagnostics
@ -1052,6 +1078,7 @@ fn check_specific_paths() -> anyhow::Result<()> {
2 | y = 4 / 0 # error: division-by-zero 2 | y = 4 / 0 # error: division-by-zero
| ^^^^^ | ^^^^^
| |
info: `lint:division-by-zero` is enabled by default
error: lint:unresolved-import: Cannot resolve imported module `main2` error: lint:unresolved-import: Cannot resolve imported module `main2`
--> project/other.py:2:6 --> project/other.py:2:6
@ -1061,6 +1088,7 @@ fn check_specific_paths() -> anyhow::Result<()> {
3 | 3 |
4 | print(z) 4 | print(z)
| |
info: `lint:unresolved-import` is enabled by default
error: lint:unresolved-import: Cannot resolve imported module `does_not_exist` error: lint:unresolved-import: Cannot resolve imported module `does_not_exist`
--> project/tests/test_main.py:2:8 --> project/tests/test_main.py:2:8
@ -1068,6 +1096,7 @@ fn check_specific_paths() -> anyhow::Result<()> {
2 | import does_not_exist # error: unresolved-import 2 | import does_not_exist # error: unresolved-import
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
| |
info: `lint:unresolved-import` is enabled by default
Found 3 diagnostics Found 3 diagnostics
@ -1091,6 +1120,7 @@ fn check_specific_paths() -> anyhow::Result<()> {
3 | 3 |
4 | print(z) 4 | print(z)
| |
info: `lint:unresolved-import` is enabled by default
error: lint:unresolved-import: Cannot resolve imported module `does_not_exist` error: lint:unresolved-import: Cannot resolve imported module `does_not_exist`
--> project/tests/test_main.py:2:8 --> project/tests/test_main.py:2:8
@ -1098,6 +1128,7 @@ fn check_specific_paths() -> anyhow::Result<()> {
2 | import does_not_exist # error: unresolved-import 2 | import does_not_exist # error: unresolved-import
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
| |
info: `lint:unresolved-import` is enabled by default
Found 2 diagnostics Found 2 diagnostics

View file

@ -35,5 +35,6 @@ error: lint:invalid-assignment: Invalid assignment to data descriptor attribute
11 | instance.attr = 1 # error: [invalid-assignment] 11 | instance.attr = 1 # error: [invalid-assignment]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ error: lint:invalid-assignment: Invalid assignment to data descriptor attribute
12 | instance.attr = "wrong" # error: [invalid-assignment] 12 | instance.attr = "wrong" # error: [invalid-assignment]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -36,6 +36,7 @@ error: lint:invalid-assignment: Object of type `Literal["wrong"]` is not assigna
7 | 7 |
8 | C.attr = 1 # fine 8 | C.attr = 1 # fine
| |
info: `lint:invalid-assignment` is enabled by default
``` ```
@ -47,5 +48,6 @@ error: lint:invalid-assignment: Object of type `Literal["wrong"]` is not assigna
9 | C.attr = "wrong" # error: [invalid-assignment] 9 | C.attr = "wrong" # error: [invalid-assignment]
| ^^^^^^ | ^^^^^^
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -36,6 +36,7 @@ warning: lint:possibly-unbound-attribute: Attribute `attr` on type `Literal[C]`
7 | 7 |
8 | instance = C() 8 | instance = C()
| |
info: `lint:possibly-unbound-attribute` is enabled by default
``` ```
@ -47,5 +48,6 @@ warning: lint:possibly-unbound-attribute: Attribute `attr` on type `C` is possib
9 | instance.attr = 1 # error: [possibly-unbound-attribute] 9 | instance.attr = 1 # error: [possibly-unbound-attribute]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
info: `lint:possibly-unbound-attribute` is enabled by default
``` ```

View file

@ -36,6 +36,7 @@ error: lint:invalid-assignment: Object of type `Literal["wrong"]` is not assigna
8 | 8 |
9 | C.attr = 1 # error: [invalid-attribute-access] 9 | C.attr = 1 # error: [invalid-attribute-access]
| |
info: `lint:invalid-assignment` is enabled by default
``` ```
@ -48,5 +49,6 @@ error: lint:invalid-attribute-access: Cannot assign to instance attribute `attr`
9 | C.attr = 1 # error: [invalid-attribute-access] 9 | C.attr = 1 # error: [invalid-attribute-access]
| ^^^^^^ | ^^^^^^
| |
info: `lint:invalid-attribute-access` is enabled by default
``` ```

View file

@ -46,5 +46,6 @@ error: lint:invalid-assignment: Object of type `Literal[1]` is not assignable to
12 | 12 |
13 | class C2: 13 | class C2:
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -33,6 +33,7 @@ error: lint:unresolved-attribute: Unresolved attribute `non_existent` on type `L
4 | 4 |
5 | instance = C() 5 | instance = C()
| |
info: `lint:unresolved-attribute` is enabled by default
``` ```
@ -44,5 +45,6 @@ error: lint:unresolved-attribute: Unresolved attribute `non_existent` on type `C
6 | instance.non_existent = 1 # error: [unresolved-attribute] 6 | instance.non_existent = 1 # error: [unresolved-attribute]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
| |
info: `lint:unresolved-attribute` is enabled by default
``` ```

View file

@ -36,6 +36,7 @@ error: lint:invalid-assignment: Object of type `Literal["wrong"]` is not assigna
8 | 8 |
9 | instance = C() 9 | instance = C()
| |
info: `lint:invalid-assignment` is enabled by default
``` ```
@ -47,5 +48,6 @@ error: lint:invalid-attribute-access: Cannot assign to ClassVar `attr` from an i
10 | instance.attr = 1 # error: [invalid-attribute-access] 10 | instance.attr = 1 # error: [invalid-attribute-access]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
info: `lint:invalid-attribute-access` is enabled by default
``` ```

View file

@ -26,5 +26,6 @@ error: lint:unresolved-import: Cannot resolve imported module `does_not_exist`
2 | from does_not_exist import foo, bar, baz 2 | from does_not_exist import foo, bar, baz
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -24,5 +24,6 @@ error: lint:unresolved-import: Cannot resolve imported module `zqzqzqzqzqzqzq`
1 | import zqzqzqzqzqzqzq # error: [unresolved-import] "Cannot resolve imported module `zqzqzqzqzqzqzq`" 1 | import zqzqzqzqzqzqzq # error: [unresolved-import] "Cannot resolve imported module `zqzqzqzqzqzqzq`"
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -36,6 +36,7 @@ error: lint:unresolved-import: Cannot resolve imported module `a.foo`
3 | 3 |
4 | # Topmost component unresolvable: 4 | # Topmost component unresolvable:
| |
info: `lint:unresolved-import` is enabled by default
``` ```
@ -47,5 +48,6 @@ error: lint:unresolved-import: Cannot resolve imported module `b.foo`
5 | import b.foo # error: [unresolved-import] "Cannot resolve imported module `b.foo`" 5 | import b.foo # error: [unresolved-import] "Cannot resolve imported module `b.foo`"
| ^^^^^ | ^^^^^
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -38,6 +38,7 @@ error: lint:not-iterable: Object of type `Iterable` is not iterable
| |
info: It has no `__iter__` method and its `__getitem__` method has an incorrect signature for the old-style iteration protocol info: It has no `__iter__` method and its `__getitem__` method has an incorrect signature for the old-style iteration protocol
info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -29,5 +29,6 @@ error: lint:not-iterable: Object of type `Literal[123]` is not iterable
3 | pass 3 | pass
| |
info: It doesn't have an `__iter__` method or a `__getitem__` method info: It doesn't have an `__iter__` method or a `__getitem__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -34,5 +34,6 @@ error: lint:not-iterable: Object of type `NotIterable` is not iterable
7 | pass 7 | pass
| |
info: Its `__iter__` attribute has type `None`, which is not callable info: Its `__iter__` attribute has type `None`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -34,6 +34,7 @@ error: lint:not-iterable: Object of type `Bad` is not iterable
8 | reveal_type(x) # revealed: Unknown 8 | reveal_type(x) # revealed: Unknown
| |
info: It has no `__iter__` method and its `__getitem__` attribute has type `None`, which is not callable info: It has no `__iter__` method and its `__getitem__` attribute has type `None`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -57,6 +57,7 @@ error: lint:not-iterable: Object of type `Iterable1` may not be iterable
| |
info: It has no `__iter__` method and its `__getitem__` attribute is invalid info: It has no `__iter__` method and its `__getitem__` attribute is invalid
info: `__getitem__` has type `CustomCallable`, which is not callable info: `__getitem__` has type `CustomCallable`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```
@ -86,6 +87,7 @@ error: lint:not-iterable: Object of type `Iterable2` may not be iterable
| |
info: It has no `__iter__` method and its `__getitem__` attribute is invalid info: It has no `__iter__` method and its `__getitem__` attribute is invalid
info: `__getitem__` has type `(bound method Iterable2.__getitem__(key: int) -> int) | None`, which is not callable info: `__getitem__` has type `(bound method Iterable2.__getitem__(key: int) -> int) | None`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -54,6 +54,7 @@ error: lint:not-iterable: Object of type `Iterable1` may not be iterable
| |
info: It has no `__iter__` method and its `__getitem__` attribute is invalid info: It has no `__iter__` method and its `__getitem__` attribute is invalid
info: `__getitem__` has type `(bound method Iterable1.__getitem__(item: int) -> str) | None`, which is not callable info: `__getitem__` has type `(bound method Iterable1.__getitem__(item: int) -> str) | None`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```
@ -82,6 +83,7 @@ error: lint:not-iterable: Object of type `Iterable2` may not be iterable
| |
info: It has no `__iter__` method and its `__getitem__` method (with type `(bound method Iterable2.__getitem__(item: int) -> str) | (bound method Iterable2.__getitem__(item: str) -> int)`) may have an incorrect signature for the old-style iteration protocol info: It has no `__iter__` method and its `__getitem__` method (with type `(bound method Iterable2.__getitem__(item: int) -> str) | (bound method Iterable2.__getitem__(item: str) -> int)`) may have an incorrect signature for the old-style iteration protocol
info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -58,6 +58,7 @@ error: lint:not-iterable: Object of type `Iterable1` may not be iterable
info: Its `__iter__` method may have an invalid signature info: Its `__iter__` method may have an invalid signature
info: Type of `__iter__` is `(bound method Iterable1.__iter__() -> Iterator) | (bound method Iterable1.__iter__(invalid_extra_arg) -> Iterator)` info: Type of `__iter__` is `(bound method Iterable1.__iter__() -> Iterator) | (bound method Iterable1.__iter__(invalid_extra_arg) -> Iterator)`
info: Expected signature for `__iter__` is `def __iter__(self): ...` info: Expected signature for `__iter__` is `def __iter__(self): ...`
info: `lint:not-iterable` is enabled by default
``` ```
@ -86,6 +87,7 @@ error: lint:not-iterable: Object of type `Iterable2` may not be iterable
30 | reveal_type(x) # revealed: int | Unknown 30 | reveal_type(x) # revealed: int | Unknown
| |
info: Its `__iter__` attribute (with type `(bound method Iterable2.__iter__() -> Iterator) | None`) may not be callable info: Its `__iter__` attribute (with type `(bound method Iterable2.__iter__() -> Iterator) | None`) may not be callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -61,6 +61,7 @@ error: lint:not-iterable: Object of type `Iterable1` may not be iterable
| |
info: Its `__iter__` method returns an object of type `Iterator1`, which may have an invalid `__next__` method info: Its `__iter__` method returns an object of type `Iterator1`, which may have an invalid `__next__` method
info: Expected signature for `__next__` is `def __next__(self): ...`) info: Expected signature for `__next__` is `def __next__(self): ...`)
info: `lint:not-iterable` is enabled by default
``` ```
@ -89,6 +90,7 @@ error: lint:not-iterable: Object of type `Iterable2` may not be iterable
34 | reveal_type(y) # revealed: int | Unknown 34 | reveal_type(y) # revealed: int | Unknown
| |
info: Its `__iter__` method returns an object of type `Iterator2`, which has a `__next__` attribute that may not be callable info: Its `__iter__` method returns an object of type `Iterator2`, which has a `__next__` attribute that may not be callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -46,6 +46,7 @@ error: lint:not-iterable: Object of type `Iterable` may not be iterable
| |
info: It may not have an `__iter__` method and its `__getitem__` method has an incorrect signature for the old-style iteration protocol info: It may not have an `__iter__` method and its `__getitem__` method has an incorrect signature for the old-style iteration protocol
info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -64,6 +64,7 @@ error: lint:not-iterable: Object of type `Iterable1` may not be iterable
33 | reveal_type(x) # revealed: bytes | str | Unknown 33 | reveal_type(x) # revealed: bytes | str | Unknown
| |
info: It may not have an `__iter__` method and its `__getitem__` attribute (with type `(bound method Iterable1.__getitem__(item: int) -> str) | None`) may not be callable info: It may not have an `__iter__` method and its `__getitem__` attribute (with type `(bound method Iterable1.__getitem__(item: int) -> str) | None`) may not be callable
info: `lint:not-iterable` is enabled by default
``` ```
@ -92,6 +93,7 @@ error: lint:not-iterable: Object of type `Iterable2` may not be iterable
| |
info: It may not have an `__iter__` method and its `__getitem__` method (with type `(bound method Iterable2.__getitem__(item: int) -> str) | (bound method Iterable2.__getitem__(item: str) -> int)`) may have an incorrect signature for the old-style iteration protocol info: It may not have an `__iter__` method and its `__getitem__` method (with type `(bound method Iterable2.__getitem__(item: int) -> str) | (bound method Iterable2.__getitem__(item: str) -> int)`) may have an incorrect signature for the old-style iteration protocol
info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol info: `__getitem__` must be at least as permissive as `def __getitem__(self, key: int): ...` to satisfy the old-style iteration protocol
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -44,6 +44,7 @@ error: lint:not-iterable: Object of type `Iterable` may not be iterable
18 | reveal_type(x) # revealed: int | bytes 18 | reveal_type(x) # revealed: int | bytes
| |
info: It may not have an `__iter__` method or a `__getitem__` method info: It may not have an `__iter__` method or a `__getitem__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -46,6 +46,7 @@ error: lint:not-iterable: Object of type `Test | Test2` may not be iterable
19 | reveal_type(x) # revealed: int 19 | reveal_type(x) # revealed: int
| |
info: Its `__iter__` method returns an object of type `TestIter | int`, which may not have a `__next__` method info: Its `__iter__` method returns an object of type `TestIter | int`, which may not have a `__next__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -41,6 +41,7 @@ error: lint:not-iterable: Object of type `Test | Literal[42]` may not be iterabl
14 | reveal_type(x) # revealed: int 14 | reveal_type(x) # revealed: int
| |
info: It may not have an `__iter__` method and it doesn't have a `__getitem__` method info: It may not have an `__iter__` method and it doesn't have a `__getitem__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -42,6 +42,7 @@ error: lint:not-iterable: Object of type `NotIterable` is not iterable
12 | pass 12 | pass
| |
info: Its `__iter__` attribute has type `int | None`, which is not callable info: Its `__iter__` attribute has type `int | None`, which is not callable
info: `lint:not-iterable` is enabled by default
``` ```
@ -54,6 +55,7 @@ warning: lint:possibly-unresolved-reference: Name `x` used when possibly not def
16 | reveal_type(x) 16 | reveal_type(x)
| ^ | ^
| |
info: `lint:possibly-unresolved-reference` is enabled by default
``` ```

View file

@ -35,6 +35,7 @@ error: lint:not-iterable: Object of type `Bad` is not iterable
9 | reveal_type(x) # revealed: Unknown 9 | reveal_type(x) # revealed: Unknown
| |
info: Its `__iter__` method returns an object of type `int`, which has no `__next__` method info: Its `__iter__` method returns an object of type `int`, which has no `__next__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -40,6 +40,7 @@ error: lint:not-iterable: Object of type `Iterable` is not iterable
| |
info: Its `__iter__` method has an invalid signature info: Its `__iter__` method has an invalid signature
info: Expected signature `def __iter__(self): ...` info: Expected signature `def __iter__(self): ...`
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -51,6 +51,7 @@ error: lint:not-iterable: Object of type `Iterable1` is not iterable
| |
info: Its `__iter__` method returns an object of type `Iterator1`, which has an invalid `__next__` method info: Its `__iter__` method returns an object of type `Iterator1`, which has an invalid `__next__` method
info: Expected signature for `__next__` is `def __next__(self): ...` info: Expected signature for `__next__` is `def __next__(self): ...`
info: `lint:not-iterable` is enabled by default
``` ```
@ -78,6 +79,7 @@ error: lint:not-iterable: Object of type `Iterable2` is not iterable
24 | reveal_type(y) # revealed: Unknown 24 | reveal_type(y) # revealed: Unknown
| |
info: Its `__iter__` method returns an object of type `Iterator2`, which has a `__next__` attribute that is not callable info: Its `__iter__` method returns an object of type `Iterator2`, which has a `__next__` attribute that is not callable
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -74,6 +74,7 @@ info: Type variable defined here
5 | 5 |
6 | def f(x: T) -> T: 6 | def f(x: T) -> T:
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -89,6 +89,7 @@ info: Type variable defined here
5 | 5 |
6 | def f(x: T) -> T: 6 | def f(x: T) -> T:
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -70,6 +70,7 @@ info: Type variable defined here
| ^^^^^^ | ^^^^^^
4 | return x 4 | return x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -85,6 +85,7 @@ info: Type variable defined here
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
4 | return x 4 | return x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -32,5 +32,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
| ^ | ^
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * x 2 | return x * x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -38,5 +38,6 @@ info: Function defined here
| ^^^^^^ ------ Parameter declared here | ^^^^^^ ------ Parameter declared here
3 | return x * x 3 | return x * x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -42,5 +42,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * x 2 | return x * x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -40,5 +40,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
5 | return x * x 5 | return x * x
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -44,5 +44,6 @@ info: Function defined here
4 | z: int, 4 | z: int,
5 | ) -> int: 5 | ) -> int:
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -39,6 +39,7 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```
@ -58,6 +59,7 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```
@ -77,5 +79,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -40,5 +40,6 @@ info: Function defined here
41 | *, 41 | *,
42 | cls: type[JSONDecoder] | None = None, 42 | cls: type[JSONDecoder] | None = None,
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ---------- Parameter declared here | ^^^ ---------- Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ---------- Parameter declared here | ^^^ ---------- Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ---------- Parameter declared here | ^^^ ---------- Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ------ Parameter declared here | ^^^ ------ Parameter declared here
2 | return x * y * z 2 | return x * y * z
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -38,5 +38,6 @@ info: Function defined here
| ^^^^^^^^ ------ Parameter declared here | ^^^^^^^^ ------ Parameter declared here
3 | return 1 3 | return 1
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ ------------- Parameter declared here | ^^^ ------------- Parameter declared here
2 | return len(numbers) 2 | return len(numbers)
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -36,5 +36,6 @@ info: Function defined here
| ^^^ -------------- Parameter declared here | ^^^ -------------- Parameter declared here
2 | return len(numbers) 2 | return len(numbers)
| |
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -38,6 +38,7 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
11 | 10 not in WithContains() 11 | 10 not in WithContains()
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```
@ -51,5 +52,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -24,5 +24,6 @@ error: lint:no-matching-overload: No overload of class `type` matches arguments
1 | type("Foo", ()) # error: [no-matching-overload] 1 | type("Foo", ()) # error: [no-matching-overload]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
| |
info: `lint:no-matching-overload` is enabled by default
``` ```

View file

@ -30,5 +30,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
| ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -47,6 +47,7 @@ error: lint:invalid-overload: Overloaded function `func` requires at least two o
| ^^^^ | ^^^^
8 | return x 8 | return x
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -61,5 +62,6 @@ error: lint:invalid-overload: Overloaded function `func` requires at least two o
| | | |
| Only one overload defined here | Only one overload defined here
| |
info: `lint:invalid-overload` is enabled by default
``` ```

View file

@ -84,6 +84,7 @@ error: lint:invalid-overload: Overloaded function `try_from3` does not use the `
41 | if isinstance(x, int): 41 | if isinstance(x, int):
42 | return cls(x) 42 | return cls(x)
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -102,6 +103,7 @@ error: lint:invalid-overload: Overloaded function `try_from1` does not use the `
17 | if isinstance(x, int): 17 | if isinstance(x, int):
18 | return cls(x) 18 | return cls(x)
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -124,5 +126,6 @@ error: lint:invalid-overload: Overloaded function `try_from2` does not use the `
23 | @overload 23 | @overload
24 | @classmethod 24 | @classmethod
| |
info: `lint:invalid-overload` is enabled by default
``` ```

View file

@ -76,6 +76,7 @@ error: lint:invalid-overload: `@final` decorator should be applied only to the o
| Implementation defined here | Implementation defined here
28 | return x 28 | return x
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -91,6 +92,7 @@ error: lint:invalid-overload: `@final` decorator should be applied only to the o
| Implementation defined here | Implementation defined here
19 | return x 19 | return x
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -107,5 +109,6 @@ error: lint:invalid-overload: `@final` decorator should be applied only to the f
15 | def method2(self, x: str) -> str: ... 15 | def method2(self, x: str) -> str: ...
| ^^^^^^^ | ^^^^^^^
| |
info: `lint:invalid-overload` is enabled by default
``` ```

View file

@ -93,6 +93,7 @@ error: lint:invalid-overload: `@override` decorator should be applied only to th
| Implementation defined here | Implementation defined here
28 | return x 28 | return x
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -108,6 +109,7 @@ error: lint:invalid-overload: `@override` decorator should be applied only to th
| Implementation defined here | Implementation defined here
38 | return x 38 | return x
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -125,5 +127,6 @@ error: lint:invalid-overload: `@override` decorator should be applied only to th
22 | def method(self, x: str) -> str: ... 22 | def method(self, x: str) -> str: ...
| ^^^^^^ | ^^^^^^
| |
info: `lint:invalid-overload` is enabled by default
``` ```

View file

@ -41,6 +41,7 @@ error: lint:invalid-overload: Overloaded non-stub function `func` must have an i
8 | 8 |
9 | class Foo: 9 | class Foo:
| |
info: `lint:invalid-overload` is enabled by default
``` ```
@ -53,5 +54,6 @@ error: lint:invalid-overload: Overloaded non-stub function `method` must have an
14 | def method(self, x: str) -> str: ... 14 | def method(self, x: str) -> str: ...
| ^^^^^^ | ^^^^^^
| |
info: `lint:invalid-overload` is enabled by default
``` ```

View file

@ -51,6 +51,7 @@ error: lint:call-non-callable: Object of type `typing.Protocol` is not callable
5 | 5 |
6 | class MyProtocol(Protocol): 6 | class MyProtocol(Protocol):
| |
info: `lint:call-non-callable` is enabled by default
``` ```
@ -86,6 +87,7 @@ info: Protocol classes cannot be instantiated
| ^^^^^^^^^^^^^^^^^^^^ `MyProtocol` declared as a protocol here | ^^^^^^^^^^^^^^^^^^^^ `MyProtocol` declared as a protocol here
7 | x: int 7 | x: int
| |
info: `lint:call-non-callable` is enabled by default
``` ```
@ -120,6 +122,7 @@ info: Protocol classes cannot be instantiated
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `GenericProtocol` declared as a protocol here | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `GenericProtocol` declared as a protocol here
13 | x: T 13 | x: T
| |
info: `lint:call-non-callable` is enabled by default
``` ```

View file

@ -52,6 +52,7 @@ info: `NotAProtocol` is declared here, but it is not a protocol class:
| |
info: A class is only a protocol class if it directly inherits from `typing.Protocol` or `typing_extensions.Protocol` info: A class is only a protocol class if it directly inherits from `typing.Protocol` or `typing_extensions.Protocol`
info: See https://typing.python.org/en/latest/spec/protocol.html# info: See https://typing.python.org/en/latest/spec/protocol.html#
info: `lint:invalid-argument-type` is enabled by default
``` ```
@ -78,5 +79,6 @@ info: `AlsoNotAProtocol` is declared here, but it is not a protocol class:
| |
info: A class is only a protocol class if it directly inherits from `typing.Protocol` or `typing_extensions.Protocol` info: A class is only a protocol class if it directly inherits from `typing.Protocol` or `typing_extensions.Protocol`
info: See https://typing.python.org/en/latest/spec/protocol.html# info: See https://typing.python.org/en/latest/spec/protocol.html#
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -77,6 +77,7 @@ info: `HasX` is declared as a protocol class, but it is not declared as runtime-
| |
info: A protocol class can only be used in `isinstance` checks if it is decorated with `@typing.runtime_checkable` or `@typing_extensions.runtime_checkable` info: A protocol class can only be used in `isinstance` checks if it is decorated with `@typing.runtime_checkable` or `@typing_extensions.runtime_checkable`
info: See https://docs.python.org/3/library/typing.html#typing.runtime_checkable info: See https://docs.python.org/3/library/typing.html#typing.runtime_checkable
info: `lint:invalid-argument-type` is enabled by default
``` ```
@ -130,6 +131,7 @@ info: `HasX` is declared as a protocol class, but it is not declared as runtime-
| |
info: A protocol class can only be used in `issubclass` checks if it is decorated with `@typing.runtime_checkable` or `@typing_extensions.runtime_checkable` info: A protocol class can only be used in `issubclass` checks if it is decorated with `@typing.runtime_checkable` or `@typing_extensions.runtime_checkable`
info: See https://docs.python.org/3/library/typing.html#typing.runtime_checkable info: See https://docs.python.org/3/library/typing.html#typing.runtime_checkable
info: `lint:invalid-argument-type` is enabled by default
``` ```

View file

@ -63,6 +63,7 @@ error: lint:invalid-return-type: Return type does not match returned value
| |
info: Function is inferred as returning `types.GeneratorType` because it is a generator function info: Function is inferred as returning `types.GeneratorType` because it is a generator function
info: See https://docs.python.org/3/glossary.html#term-generator for more details info: See https://docs.python.org/3/glossary.html#term-generator for more details
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -78,5 +79,6 @@ error: lint:invalid-return-type: Return type does not match returned value
| |
info: Function is inferred as returning `types.AsyncGeneratorType` because it is an async generator function info: Function is inferred as returning `types.AsyncGeneratorType` because it is an async generator function
info: See https://docs.python.org/3/glossary.html#term-asynchronous-generator for more details info: See https://docs.python.org/3/glossary.html#term-asynchronous-generator for more details
info: `lint:invalid-return-type` is enabled by default
``` ```

View file

@ -45,6 +45,7 @@ error: lint:invalid-return-type: Return type does not match returned value
7 | 7 |
8 | def f(cond: bool) -> str: 8 | def f(cond: bool) -> str:
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -63,6 +64,7 @@ error: lint:invalid-return-type: Return type does not match returned value
12 | else: 12 | else:
13 | # error: [invalid-return-type] 13 | # error: [invalid-return-type]
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -84,5 +86,6 @@ error: lint:invalid-return-type: Return type does not match returned value
9 | if cond: 9 | if cond:
10 | # error: [invalid-return-type] 10 | # error: [invalid-return-type]
| |
info: `lint:invalid-return-type` is enabled by default
``` ```

View file

@ -52,6 +52,7 @@ error: lint:invalid-return-type: Return type does not match returned value
5 | 5 |
6 | # error: [invalid-return-type] 6 | # error: [invalid-return-type]
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -65,6 +66,7 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
8 | if cond: 8 | if cond:
9 | return 1 9 | return 1
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -78,6 +80,7 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
13 | if cond: 13 | if cond:
14 | raise ValueError() 14 | raise ValueError()
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -91,5 +94,6 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
18 | if cond: 18 | if cond:
19 | cond = False 19 | cond = False
| |
info: `lint:invalid-return-type` is enabled by default
``` ```

View file

@ -43,6 +43,7 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
| ^^^ | ^^^
3 | 1 3 | 1
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -60,6 +61,7 @@ error: lint:invalid-return-type: Return type does not match returned value
8 | 8 |
9 | def f() -> int: 9 | def f() -> int:
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -77,6 +79,7 @@ error: lint:invalid-return-type: Return type does not match returned value
12 | 12 |
13 | from typing import TypeVar 13 | from typing import TypeVar
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -88,5 +91,6 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
18 | def m(x: T) -> T: ... 18 | def m(x: T) -> T: ...
| ^ | ^
| |
info: `lint:invalid-return-type` is enabled by default
``` ```

View file

@ -41,6 +41,7 @@ error: lint:invalid-return-type: Return type does not match returned value
4 | 4 |
5 | # error: [invalid-return-type] 5 | # error: [invalid-return-type]
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -54,6 +55,7 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
7 | print("...") 7 | print("...")
8 | ... 8 | ...
| |
info: `lint:invalid-return-type` is enabled by default
``` ```
@ -67,5 +69,6 @@ error: lint:invalid-return-type: Function can implicitly return `None`, which is
12 | f"""{foo} is a function that ...""" 12 | f"""{foo} is a function that ..."""
13 | ... 13 | ...
| |
info: `lint:invalid-return-type` is enabled by default
``` ```

View file

@ -43,6 +43,7 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
14 | 10 < Comparable() < Comparable() 14 | 10 < Comparable() < Comparable()
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```
@ -58,5 +59,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
16 | Comparable() < Comparable() # fine 16 | Comparable() < Comparable() # fine
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -29,5 +29,6 @@ error: lint:invalid-assignment: Implicit shadowing of class `C`
| ^ | ^
| |
info: Annotate to make it explicit if this is intentional info: Annotate to make it explicit if this is intentional
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -29,5 +29,6 @@ error: lint:invalid-assignment: Implicit shadowing of function `f`
| ^ | ^
| |
info: Annotate to make it explicit if this is intentional info: Annotate to make it explicit if this is intentional
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -44,5 +44,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
17 | a < b # fine 17 | a < b # fine
| |
info: `__bool__` on `NotBoolable | Literal[False]` must be callable info: `__bool__` on `NotBoolable | Literal[False]` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -34,5 +34,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -26,5 +26,6 @@ error: lint:invalid-assignment: Not enough values to unpack
| | | |
| Expected 2 | Expected 2
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -26,5 +26,6 @@ error: lint:invalid-assignment: Too many values to unpack
| | | |
| Expected 2 | Expected 2
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -25,5 +25,6 @@ error: lint:not-iterable: Object of type `Literal[1]` is not iterable
| ^ | ^
| |
info: It doesn't have an `__iter__` method or a `__getitem__` method info: It doesn't have an `__iter__` method or a `__getitem__` method
info: `lint:not-iterable` is enabled by default
``` ```

View file

@ -26,5 +26,6 @@ error: lint:invalid-assignment: Not enough values to unpack
| | | |
| Expected 3 or more | Expected 3 or more
| |
info: `lint:invalid-assignment` is enabled by default
``` ```

View file

@ -28,5 +28,6 @@ error: lint:unresolved-import: Cannot resolve imported module `does_not_exist`
2 | 2 |
3 | x = does_not_exist.foo 3 | x = does_not_exist.foo
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -31,5 +31,6 @@ error: lint:unresolved-import: Module `a` has no member `does_not_exist`
1 | from a import does_exist1, does_not_exist, does_exist2 # error: [unresolved-import] 1 | from a import does_exist1, does_not_exist, does_exist2 # error: [unresolved-import]
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -28,5 +28,6 @@ error: lint:unresolved-import: Cannot resolve imported module `.does_not_exist`
2 | 2 |
3 | stat = add(10, 15) 3 | stat = add(10, 15)
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -28,5 +28,6 @@ error: lint:unresolved-import: Cannot resolve imported module `.does_not_exist.f
2 | 2 |
3 | stat = add(10, 15) 3 | stat = add(10, 15)
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -28,5 +28,6 @@ error: lint:unresolved-import: Cannot resolve imported module `does_not_exist`
2 | 2 |
3 | stat = add(10, 15) 3 | stat = add(10, 15)
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -40,5 +40,6 @@ error: lint:unresolved-import: Cannot resolve imported module `....foo`
2 | 2 |
3 | stat = add(10, 15) 3 | stat = add(10, 15)
| |
info: `lint:unresolved-import` is enabled by default
``` ```

View file

@ -32,5 +32,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for t
| ^ | ^
| |
info: `__bool__` on `NotBoolable` must be callable info: `__bool__` on `NotBoolable` must be callable
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -42,5 +42,6 @@ info: `str` is not assignable to `bool`
| Method defined here | Method defined here
3 | return "wat" 3 | return "wat"
| |
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -42,5 +42,6 @@ info: `__bool__` methods must only have a `self` parameter
| Method defined here | Method defined here
3 | return False 3 | return False
| |
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -39,5 +39,6 @@ error: lint:unsupported-bool-conversion: Boolean conversion is unsupported for u
15 | 10 and get() and True 15 | 10 and get() and True
| ^^^^^ | ^^^^^
| |
info: `lint:unsupported-bool-conversion` is enabled by default
``` ```

View file

@ -505,6 +505,10 @@ impl RuleSelection {
self.lints.get(&lint).map(|(severity, _)| *severity) self.lints.get(&lint).map(|(severity, _)| *severity)
} }
pub fn get(&self, lint: LintId) -> Option<(Severity, LintSource)> {
self.lints.get(&lint).copied()
}
/// Returns `true` if the `lint` is enabled. /// Returns `true` if the `lint` is enabled.
pub fn is_enabled(&self, lint: LintId) -> bool { pub fn is_enabled(&self, lint: LintId) -> bool {
self.severity(lint).is_some() self.severity(lint).is_some()

View file

@ -1,7 +1,7 @@
use std::fmt; use std::fmt;
use drop_bomb::DebugDropBomb; use drop_bomb::DebugDropBomb;
use ruff_db::diagnostic::DiagnosticTag; use ruff_db::diagnostic::{DiagnosticTag, SubDiagnostic};
use ruff_db::{ use ruff_db::{
diagnostic::{Annotation, Diagnostic, DiagnosticId, IntoDiagnosticMessage, Severity, Span}, diagnostic::{Annotation, Diagnostic, DiagnosticId, IntoDiagnosticMessage, Severity, Span},
files::File, files::File,
@ -10,6 +10,7 @@ use ruff_text_size::{Ranged, TextRange};
use super::{binding_type, Type, TypeCheckDiagnostics}; use super::{binding_type, Type, TypeCheckDiagnostics};
use crate::lint::LintSource;
use crate::semantic_index::symbol::ScopeId; use crate::semantic_index::symbol::ScopeId;
use crate::{ use crate::{
lint::{LintId, LintMetadata}, lint::{LintId, LintMetadata},
@ -222,6 +223,8 @@ pub(super) struct LintDiagnosticGuard<'db, 'ctx> {
/// ///
/// This is always `Some` until the `Drop` impl. /// This is always `Some` until the `Drop` impl.
diag: Option<Diagnostic>, diag: Option<Diagnostic>,
source: LintSource,
} }
impl LintDiagnosticGuard<'_, '_> { impl LintDiagnosticGuard<'_, '_> {
@ -310,7 +313,19 @@ impl Drop for LintDiagnosticGuard<'_, '_> {
// OK because the only way `self.diag` is `None` // OK because the only way `self.diag` is `None`
// is via this impl, which can only run at most // is via this impl, which can only run at most
// once. // once.
let diag = self.diag.take().unwrap(); let mut diag = self.diag.take().unwrap();
diag.sub(SubDiagnostic::new(
Severity::Info,
match self.source {
LintSource::Default => format!("`{}` is enabled by default", diag.id()),
LintSource::Cli => format!("`{}` was selected on the command line", diag.id()),
LintSource::File => {
format!("`{}` was selected in the configuration file", diag.id())
}
},
));
self.ctx.diagnostics.borrow_mut().push(diag); self.ctx.diagnostics.borrow_mut().push(diag);
} }
} }
@ -345,6 +360,7 @@ pub(super) struct LintDiagnosticGuardBuilder<'db, 'ctx> {
ctx: &'ctx InferContext<'db>, ctx: &'ctx InferContext<'db>,
id: DiagnosticId, id: DiagnosticId,
severity: Severity, severity: Severity,
source: LintSource,
primary_span: Span, primary_span: Span,
} }
@ -371,7 +387,7 @@ impl<'db, 'ctx> LintDiagnosticGuardBuilder<'db, 'ctx> {
let lint_id = LintId::of(lint); let lint_id = LintId::of(lint);
// Skip over diagnostics if the rule // Skip over diagnostics if the rule
// is disabled. // is disabled.
let severity = ctx.db.rule_selection().severity(lint_id)?; let (severity, source) = ctx.db.rule_selection().get(lint_id)?;
// If we're not in type checking mode, // If we're not in type checking mode,
// we can bail now. // we can bail now.
if ctx.is_in_no_type_check() { if ctx.is_in_no_type_check() {
@ -390,6 +406,7 @@ impl<'db, 'ctx> LintDiagnosticGuardBuilder<'db, 'ctx> {
ctx, ctx,
id, id,
severity, severity,
source,
primary_span, primary_span,
}) })
} }
@ -417,6 +434,7 @@ impl<'db, 'ctx> LintDiagnosticGuardBuilder<'db, 'ctx> {
diag.annotate(Annotation::primary(self.primary_span.clone())); diag.annotate(Annotation::primary(self.primary_span.clone()));
LintDiagnosticGuard { LintDiagnosticGuard {
ctx: self.ctx, ctx: self.ctx,
source: self.source,
diag: Some(diag), diag: Some(diag),
} }
} }
@ -479,6 +497,11 @@ impl std::ops::DerefMut for DiagnosticGuard<'_, '_> {
/// being type checked. /// being type checked.
impl Drop for DiagnosticGuard<'_, '_> { impl Drop for DiagnosticGuard<'_, '_> {
fn drop(&mut self) { fn drop(&mut self) {
if std::thread::panicking() {
// Don't submit diagnostics when panicking because they might be incomplete.
return;
}
// OK because the only way `self.diag` is `None` // OK because the only way `self.diag` is `None`
// is via this impl, which can only run at most // is via this impl, which can only run at most
// once. // once.