[ty] Change range of revealed-type diagnostic to be the range of the argument passed in, not the whole call (#17980)

This commit is contained in:
Alex Waygood 2025-05-09 14:15:39 +01:00 committed by GitHub
parent 642eac452d
commit 03a4d56624
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 175 additions and 173 deletions

View file

@ -197,12 +197,12 @@ fn config_override_python_platform() -> anyhow::Result<()> {
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> test.py:5:1 --> test.py:5:13
| |
3 | from typing_extensions import reveal_type 3 | from typing_extensions import reveal_type
4 | 4 |
5 | reveal_type(sys.platform) 5 | reveal_type(sys.platform)
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `Literal["linux"]` | ^^^^^^^^^^^^ `Literal["linux"]`
| |
Found 1 diagnostic Found 1 diagnostic
@ -215,12 +215,12 @@ fn config_override_python_platform() -> anyhow::Result<()> {
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> test.py:5:1 --> test.py:5:13
| |
3 | from typing_extensions import reveal_type 3 | from typing_extensions import reveal_type
4 | 4 |
5 | reveal_type(sys.platform) 5 | reveal_type(sys.platform)
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `LiteralString` | ^^^^^^^^^^^^ `LiteralString`
| |
Found 1 diagnostic Found 1 diagnostic
@ -711,11 +711,11 @@ fn exit_code_only_info() -> anyhow::Result<()> {
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> test.py:3:1 --> test.py:3:13
| |
2 | from typing_extensions import reveal_type 2 | from typing_extensions import reveal_type
3 | reveal_type(1) 3 | reveal_type(1)
| ^^^^^^^^^^^^^^ `Literal[1]` | ^ `Literal[1]`
| |
Found 1 diagnostic Found 1 diagnostic
@ -741,11 +741,11 @@ fn exit_code_only_info_and_error_on_warning_is_true() -> anyhow::Result<()> {
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> test.py:3:1 --> test.py:3:13
| |
2 | from typing_extensions import reveal_type 2 | from typing_extensions import reveal_type
3 | reveal_type(1) 3 | reveal_type(1)
| ^^^^^^^^^^^^^^ `Literal[1]` | ^ `Literal[1]`
| |
Found 1 diagnostic Found 1 diagnostic
@ -1219,7 +1219,7 @@ fn concise_revealed_type() -> anyhow::Result<()> {
success: true success: true
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info[revealed-type] test.py:5:1: Revealed type: `Literal["hello"]` info[revealed-type] test.py:5:13: Revealed type: `Literal["hello"]`
Found 1 diagnostic Found 1 diagnostic
----- stderr ----- ----- stderr -----
@ -1248,12 +1248,12 @@ fn can_handle_large_binop_expressions() -> anyhow::Result<()> {
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> test.py:4:1 --> test.py:4:13
| |
2 | from typing_extensions import reveal_type 2 | from typing_extensions import reveal_type
3 | total = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1... 3 | total = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1...
4 | reveal_type(total) 4 | reveal_type(total)
| ^^^^^^^^^^^^^^^^^^ `Literal[2000]` | ^^^^^ `Literal[2000]`
| |
Found 1 diagnostic Found 1 diagnostic

View file

@ -11,30 +11,28 @@ reveal_type(len(r"conca\t" "ena\tion")) # revealed: Literal[14]
reveal_type(len(b"ytes lite" rb"al")) # revealed: Literal[11] reveal_type(len(b"ytes lite" rb"al")) # revealed: Literal[11]
reveal_type(len("𝒰𝕹🄸©🕲𝕕ℇ")) # revealed: Literal[7] reveal_type(len("𝒰𝕹🄸©🕲𝕕ℇ")) # revealed: Literal[7]
reveal_type( # revealed: Literal[7] # fmt: off
len(
reveal_type(len( # revealed: Literal[7]
"""foo """foo
bar""" bar"""
) ))
)
reveal_type( # revealed: Literal[9] reveal_type(len( # revealed: Literal[9]
len(
r"""foo\r r"""foo\r
bar""" bar"""
) ))
)
reveal_type( # revealed: Literal[7] reveal_type(len( # revealed: Literal[7]
len(
b"""foo b"""foo
bar""" bar"""
) ))
) reveal_type(len( # revealed: Literal[9]
reveal_type( # revealed: Literal[9]
len(
rb"""foo\r rb"""foo\r
bar""" bar"""
) ))
)
# fmt: on
``` ```
### Tuples ### Tuples
@ -50,15 +48,17 @@ reveal_type(len(tuple())) # revealed: int
# TODO: Handle star unpacks; Should be: Literal[0] # TODO: Handle star unpacks; Should be: Literal[0]
reveal_type(len((*[],))) # revealed: Literal[1] reveal_type(len((*[],))) # revealed: Literal[1]
# fmt: off
# TODO: Handle star unpacks; Should be: Literal[1] # TODO: Handle star unpacks; Should be: Literal[1]
reveal_type( # revealed: Literal[2] reveal_type(len( # revealed: Literal[2]
len( (
( *[],
*[], 1,
1,
)
) )
) ))
# fmt: on
# TODO: Handle star unpacks; Should be: Literal[2] # TODO: Handle star unpacks; Should be: Literal[2]
reveal_type(len((*[], 1, 2))) # revealed: Literal[3] reveal_type(len((*[], 1, 2))) # revealed: Literal[3]

View file

@ -44,12 +44,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:11:5 --> src/mdtest_snippet.py:11:17
| |
9 | # error: [not-iterable] 9 | # error: [not-iterable]
10 | for x in Iterable(): 10 | for x in Iterable():
11 | reveal_type(x) # revealed: int 11 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
| |
``` ```

View file

@ -40,12 +40,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:8:5 --> src/mdtest_snippet.py:8:17
| |
6 | # error: [not-iterable] 6 | # error: [not-iterable]
7 | for x in Bad(): 7 | for x in Bad():
8 | reveal_type(x) # revealed: Unknown 8 | reveal_type(x) # revealed: Unknown
| ^^^^^^^^^^^^^^ `Unknown` | ^ `Unknown`
| |
``` ```

View file

@ -63,12 +63,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:24:9 --> src/mdtest_snippet.py:24:21
| |
22 | for x in Iterable1(): 22 | for x in Iterable1():
23 | # TODO... `int` might be ideal here? 23 | # TODO... `int` might be ideal here?
24 | reveal_type(x) # revealed: int | Unknown 24 | reveal_type(x) # revealed: int | Unknown
| ^^^^^^^^^^^^^^ `int | Unknown` | ^ `int | Unknown`
25 | 25 |
26 | # error: [not-iterable] 26 | # error: [not-iterable]
| |
@ -93,12 +93,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:29:9 --> src/mdtest_snippet.py:29:21
| |
27 | for y in Iterable2(): 27 | for y in Iterable2():
28 | # TODO... `int` might be ideal here? 28 | # TODO... `int` might be ideal here?
29 | reveal_type(y) # revealed: int | Unknown 29 | reveal_type(y) # revealed: int | Unknown
| ^^^^^^^^^^^^^^ `int | Unknown` | ^ `int | Unknown`
| |
``` ```

View file

@ -60,12 +60,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:22:9 --> src/mdtest_snippet.py:22:21
| |
20 | for x in Iterable1(): 20 | for x in Iterable1():
21 | # TODO: `str` might be better 21 | # TODO: `str` might be better
22 | reveal_type(x) # revealed: str | Unknown 22 | reveal_type(x) # revealed: str | Unknown
| ^^^^^^^^^^^^^^ `str | Unknown` | ^ `str | Unknown`
23 | 23 |
24 | # error: [not-iterable] 24 | # error: [not-iterable]
| |
@ -89,12 +89,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:26:9 --> src/mdtest_snippet.py:26:21
| |
24 | # error: [not-iterable] 24 | # error: [not-iterable]
25 | for y in Iterable2(): 25 | for y in Iterable2():
26 | reveal_type(y) # revealed: str | int 26 | reveal_type(y) # revealed: str | int
| ^^^^^^^^^^^^^^ `str | int` | ^ `str | int`
| |
``` ```

View file

@ -64,12 +64,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:18:9 --> src/mdtest_snippet.py:18:21
| |
16 | # error: [not-iterable] 16 | # error: [not-iterable]
17 | for x in Iterable1(): 17 | for x in Iterable1():
18 | reveal_type(x) # revealed: int 18 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
19 | 19 |
20 | class Iterable2: 20 | class Iterable2:
| |
@ -93,12 +93,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:30:9 --> src/mdtest_snippet.py:30:21
| |
28 | for x in Iterable2(): 28 | for x in Iterable2():
29 | # TODO: `int` would probably be better here: 29 | # TODO: `int` would probably be better here:
30 | reveal_type(x) # revealed: int | Unknown 30 | reveal_type(x) # revealed: int | Unknown
| ^^^^^^^^^^^^^^ `int | Unknown` | ^ `int | Unknown`
| |
``` ```

View file

@ -67,12 +67,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:29:9 --> src/mdtest_snippet.py:29:21
| |
27 | # error: [not-iterable] 27 | # error: [not-iterable]
28 | for x in Iterable1(): 28 | for x in Iterable1():
29 | reveal_type(x) # revealed: int | str 29 | reveal_type(x) # revealed: int | str
| ^^^^^^^^^^^^^^ `int | str` | ^ `int | str`
30 | 30 |
31 | # error: [not-iterable] 31 | # error: [not-iterable]
| |
@ -96,12 +96,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:34:9 --> src/mdtest_snippet.py:34:21
| |
32 | for y in Iterable2(): 32 | for y in Iterable2():
33 | # TODO: `int` would probably be better here: 33 | # TODO: `int` would probably be better here:
34 | reveal_type(y) # revealed: int | Unknown 34 | reveal_type(y) # revealed: int | Unknown
| ^^^^^^^^^^^^^^ `int | Unknown` | ^ `int | Unknown`
| |
``` ```

View file

@ -52,12 +52,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:19:9 --> src/mdtest_snippet.py:19:21
| |
17 | # error: [not-iterable] 17 | # error: [not-iterable]
18 | for x in Iterable(): 18 | for x in Iterable():
19 | reveal_type(x) # revealed: int | bytes 19 | reveal_type(x) # revealed: int | bytes
| ^^^^^^^^^^^^^^ `int | bytes` | ^ `int | bytes`
| |
``` ```

View file

@ -70,12 +70,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:33:9 --> src/mdtest_snippet.py:33:21
| |
31 | for x in Iterable1(): 31 | for x in Iterable1():
32 | # TODO: `bytes | str` might be better 32 | # TODO: `bytes | str` might be better
33 | reveal_type(x) # revealed: bytes | str | Unknown 33 | reveal_type(x) # revealed: bytes | str | Unknown
| ^^^^^^^^^^^^^^ `bytes | str | Unknown` | ^ `bytes | str | Unknown`
34 | 34 |
35 | # error: [not-iterable] 35 | # error: [not-iterable]
| |
@ -99,12 +99,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:37:9 --> src/mdtest_snippet.py:37:21
| |
35 | # error: [not-iterable] 35 | # error: [not-iterable]
36 | for y in Iterable2(): 36 | for y in Iterable2():
37 | reveal_type(y) # revealed: bytes | str | int 37 | reveal_type(y) # revealed: bytes | str | int
| ^^^^^^^^^^^^^^ `bytes | str | int` | ^ `bytes | str | int`
| |
``` ```

View file

@ -50,12 +50,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:18:9 --> src/mdtest_snippet.py:18:21
| |
16 | # error: [not-iterable] 16 | # error: [not-iterable]
17 | for x in Iterable(): 17 | for x in Iterable():
18 | reveal_type(x) # revealed: int | bytes 18 | reveal_type(x) # revealed: int | bytes
| ^^^^^^^^^^^^^^ `int | bytes` | ^ `int | bytes`
| |
``` ```

View file

@ -52,12 +52,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:19:9 --> src/mdtest_snippet.py:19:21
| |
17 | # error: [not-iterable] 17 | # error: [not-iterable]
18 | for x in Test() if flag else Test2(): 18 | for x in Test() if flag else Test2():
19 | reveal_type(x) # revealed: int 19 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
| |
``` ```

View file

@ -47,12 +47,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:14:9 --> src/mdtest_snippet.py:14:21
| |
12 | # error: [not-iterable] 12 | # error: [not-iterable]
13 | for x in Test() if flag else 42: 13 | for x in Test() if flag else 42:
14 | reveal_type(x) # revealed: int 14 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
| |
``` ```

View file

@ -46,18 +46,6 @@ info: `lint:not-iterable` is enabled by default
``` ```
```
info: revealed-type: Revealed type
--> src/mdtest_snippet.py:16:5
|
14 | # revealed: Unknown
15 | # error: [possibly-unresolved-reference]
16 | reveal_type(x)
| ^^^^^^^^^^^^^^ `Unknown`
|
```
``` ```
info: lint:possibly-unresolved-reference: Name `x` used when possibly not defined info: lint:possibly-unresolved-reference: Name `x` used when possibly not defined
--> src/mdtest_snippet.py:16:17 --> src/mdtest_snippet.py:16:17
@ -70,3 +58,15 @@ info: lint:possibly-unresolved-reference: Name `x` used when possibly not define
info: `lint:possibly-unresolved-reference` is enabled by default info: `lint:possibly-unresolved-reference` is enabled by default
``` ```
```
info: revealed-type: Revealed type
--> src/mdtest_snippet.py:16:17
|
14 | # revealed: Unknown
15 | # error: [possibly-unresolved-reference]
16 | reveal_type(x)
| ^ `Unknown`
|
```

View file

@ -41,12 +41,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:9:5 --> src/mdtest_snippet.py:9:17
| |
7 | # error: [not-iterable] 7 | # error: [not-iterable]
8 | for x in Bad(): 8 | for x in Bad():
9 | reveal_type(x) # revealed: Unknown 9 | reveal_type(x) # revealed: Unknown
| ^^^^^^^^^^^^^^ `Unknown` | ^ `Unknown`
| |
``` ```

View file

@ -46,12 +46,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:13:5 --> src/mdtest_snippet.py:13:17
| |
11 | # error: [not-iterable] 11 | # error: [not-iterable]
12 | for x in Iterable(): 12 | for x in Iterable():
13 | reveal_type(x) # revealed: int 13 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
| |
``` ```

View file

@ -57,12 +57,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:20:5 --> src/mdtest_snippet.py:20:17
| |
18 | # error: [not-iterable] 18 | # error: [not-iterable]
19 | for x in Iterable1(): 19 | for x in Iterable1():
20 | reveal_type(x) # revealed: int 20 | reveal_type(x) # revealed: int
| ^^^^^^^^^^^^^^ `int` | ^ `int`
21 | 21 |
22 | # error: [not-iterable] 22 | # error: [not-iterable]
| |
@ -85,12 +85,12 @@ info: `lint:not-iterable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:24:5 --> src/mdtest_snippet.py:24:17
| |
22 | # error: [not-iterable] 22 | # error: [not-iterable]
23 | for y in Iterable2(): 23 | for y in Iterable2():
24 | reveal_type(y) # revealed: Unknown 24 | reveal_type(y) # revealed: Unknown
| ^^^^^^^^^^^^^^ `Unknown` | ^ `Unknown`
| |
``` ```

View file

@ -30,12 +30,12 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/generics/legacy/function
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:9:1 --> src/mdtest_snippet.py:9:13
| |
7 | return x 7 | return x
8 | 8 |
9 | reveal_type(f(1)) # revealed: Literal[1] 9 | reveal_type(f(1)) # revealed: Literal[1]
| ^^^^^^^^^^^^^^^^^ `Literal[1]` | ^^^^ `Literal[1]`
10 | reveal_type(f(True)) # revealed: Literal[True] 10 | reveal_type(f(True)) # revealed: Literal[True]
11 | # error: [invalid-argument-type] 11 | # error: [invalid-argument-type]
| |
@ -44,11 +44,11 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:10:1 --> src/mdtest_snippet.py:10:13
| |
9 | reveal_type(f(1)) # revealed: Literal[1] 9 | reveal_type(f(1)) # revealed: Literal[1]
10 | reveal_type(f(True)) # revealed: Literal[True] 10 | reveal_type(f(True)) # revealed: Literal[True]
| ^^^^^^^^^^^^^^^^^^^^ `Literal[True]` | ^^^^^^^ `Literal[True]`
11 | # error: [invalid-argument-type] 11 | # error: [invalid-argument-type]
12 | reveal_type(f("string")) # revealed: Unknown 12 | reveal_type(f("string")) # revealed: Unknown
| |
@ -57,12 +57,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:12:1 --> src/mdtest_snippet.py:12:13
| |
10 | reveal_type(f(True)) # revealed: Literal[True] 10 | reveal_type(f(True)) # revealed: Literal[True]
11 | # error: [invalid-argument-type] 11 | # error: [invalid-argument-type]
12 | reveal_type(f("string")) # revealed: Unknown 12 | reveal_type(f("string")) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^^ `Unknown` | ^^^^^^^^^^^ `Unknown`
| |
``` ```

View file

@ -31,12 +31,12 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/generics/legacy/function
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:9:1 --> src/mdtest_snippet.py:9:13
| |
7 | return x 7 | return x
8 | 8 |
9 | reveal_type(f(1)) # revealed: int 9 | reveal_type(f(1)) # revealed: int
| ^^^^^^^^^^^^^^^^^ `int` | ^^^^ `int`
10 | reveal_type(f(True)) # revealed: int 10 | reveal_type(f(True)) # revealed: int
11 | reveal_type(f(None)) # revealed: None 11 | reveal_type(f(None)) # revealed: None
| |
@ -45,11 +45,11 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:10:1 --> src/mdtest_snippet.py:10:13
| |
9 | reveal_type(f(1)) # revealed: int 9 | reveal_type(f(1)) # revealed: int
10 | reveal_type(f(True)) # revealed: int 10 | reveal_type(f(True)) # revealed: int
| ^^^^^^^^^^^^^^^^^^^^ `int` | ^^^^^^^ `int`
11 | reveal_type(f(None)) # revealed: None 11 | reveal_type(f(None)) # revealed: None
12 | # error: [invalid-argument-type] 12 | # error: [invalid-argument-type]
| |
@ -58,12 +58,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:11:1 --> src/mdtest_snippet.py:11:13
| |
9 | reveal_type(f(1)) # revealed: int 9 | reveal_type(f(1)) # revealed: int
10 | reveal_type(f(True)) # revealed: int 10 | reveal_type(f(True)) # revealed: int
11 | reveal_type(f(None)) # revealed: None 11 | reveal_type(f(None)) # revealed: None
| ^^^^^^^^^^^^^^^^^^^^ `None` | ^^^^^^^ `None`
12 | # error: [invalid-argument-type] 12 | # error: [invalid-argument-type]
13 | reveal_type(f("string")) # revealed: Unknown 13 | reveal_type(f("string")) # revealed: Unknown
| |
@ -72,12 +72,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:13:1 --> src/mdtest_snippet.py:13:13
| |
11 | reveal_type(f(None)) # revealed: None 11 | reveal_type(f(None)) # revealed: None
12 | # error: [invalid-argument-type] 12 | # error: [invalid-argument-type]
13 | reveal_type(f("string")) # revealed: Unknown 13 | reveal_type(f("string")) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^^ `Unknown` | ^^^^^^^^^^^ `Unknown`
| |
``` ```

View file

@ -27,12 +27,12 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/generics/pep695/function
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:6:1 --> src/mdtest_snippet.py:6:13
| |
4 | return x 4 | return x
5 | 5 |
6 | reveal_type(f(1)) # revealed: Literal[1] 6 | reveal_type(f(1)) # revealed: Literal[1]
| ^^^^^^^^^^^^^^^^^ `Literal[1]` | ^^^^ `Literal[1]`
7 | reveal_type(f(True)) # revealed: Literal[True] 7 | reveal_type(f(True)) # revealed: Literal[True]
8 | # error: [invalid-argument-type] 8 | # error: [invalid-argument-type]
| |
@ -41,11 +41,11 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:7:1 --> src/mdtest_snippet.py:7:13
| |
6 | reveal_type(f(1)) # revealed: Literal[1] 6 | reveal_type(f(1)) # revealed: Literal[1]
7 | reveal_type(f(True)) # revealed: Literal[True] 7 | reveal_type(f(True)) # revealed: Literal[True]
| ^^^^^^^^^^^^^^^^^^^^ `Literal[True]` | ^^^^^^^ `Literal[True]`
8 | # error: [invalid-argument-type] 8 | # error: [invalid-argument-type]
9 | reveal_type(f("string")) # revealed: Unknown 9 | reveal_type(f("string")) # revealed: Unknown
| |
@ -54,12 +54,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:9:1 --> src/mdtest_snippet.py:9:13
| |
7 | reveal_type(f(True)) # revealed: Literal[True] 7 | reveal_type(f(True)) # revealed: Literal[True]
8 | # error: [invalid-argument-type] 8 | # error: [invalid-argument-type]
9 | reveal_type(f("string")) # revealed: Unknown 9 | reveal_type(f("string")) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^^ `Unknown` | ^^^^^^^^^^^ `Unknown`
| |
``` ```

View file

@ -28,12 +28,12 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/generics/pep695/function
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:6:1 --> src/mdtest_snippet.py:6:13
| |
4 | return x 4 | return x
5 | 5 |
6 | reveal_type(f(1)) # revealed: int 6 | reveal_type(f(1)) # revealed: int
| ^^^^^^^^^^^^^^^^^ `int` | ^^^^ `int`
7 | reveal_type(f(True)) # revealed: int 7 | reveal_type(f(True)) # revealed: int
8 | reveal_type(f(None)) # revealed: None 8 | reveal_type(f(None)) # revealed: None
| |
@ -42,11 +42,11 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:7:1 --> src/mdtest_snippet.py:7:13
| |
6 | reveal_type(f(1)) # revealed: int 6 | reveal_type(f(1)) # revealed: int
7 | reveal_type(f(True)) # revealed: int 7 | reveal_type(f(True)) # revealed: int
| ^^^^^^^^^^^^^^^^^^^^ `int` | ^^^^^^^ `int`
8 | reveal_type(f(None)) # revealed: None 8 | reveal_type(f(None)) # revealed: None
9 | # error: [invalid-argument-type] 9 | # error: [invalid-argument-type]
| |
@ -55,12 +55,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:8:1 --> src/mdtest_snippet.py:8:13
| |
6 | reveal_type(f(1)) # revealed: int 6 | reveal_type(f(1)) # revealed: int
7 | reveal_type(f(True)) # revealed: int 7 | reveal_type(f(True)) # revealed: int
8 | reveal_type(f(None)) # revealed: None 8 | reveal_type(f(None)) # revealed: None
| ^^^^^^^^^^^^^^^^^^^^ `None` | ^^^^^^^ `None`
9 | # error: [invalid-argument-type] 9 | # error: [invalid-argument-type]
10 | reveal_type(f("string")) # revealed: Unknown 10 | reveal_type(f("string")) # revealed: Unknown
| |
@ -69,12 +69,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:10:1 --> src/mdtest_snippet.py:10:13
| |
8 | reveal_type(f(None)) # revealed: None 8 | reveal_type(f(None)) # revealed: None
9 | # error: [invalid-argument-type] 9 | # error: [invalid-argument-type]
10 | reveal_type(f("string")) # revealed: Unknown 10 | reveal_type(f("string")) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^^ `Unknown` | ^^^^^^^^^^^ `Unknown`
| |
``` ```

View file

@ -128,12 +128,12 @@ info: `lint:duplicate-base` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:5:1 --> src/mdtest_snippet.py:5:13
| |
3 | class Foo(str, str): ... # error: [duplicate-base] "Duplicate base class `str`" 3 | class Foo(str, str): ... # error: [duplicate-base] "Duplicate base class `str`"
4 | 4 |
5 | reveal_type(Foo.__mro__) # revealed: tuple[<class 'Foo'>, Unknown, <class 'object'>] 5 | reveal_type(Foo.__mro__) # revealed: tuple[<class 'Foo'>, Unknown, <class 'object'>]
| ^^^^^^^^^^^^^^^^^^^^^^^^ `tuple[<class 'Foo'>, Unknown, <class 'object'>]` | ^^^^^^^^^^^ `tuple[<class 'Foo'>, Unknown, <class 'object'>]`
6 | 6 |
7 | class Spam: ... 7 | class Spam: ...
| |
@ -217,12 +217,12 @@ info: `lint:duplicate-base` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:27:1 --> src/mdtest_snippet.py:27:13
| |
25 | # fmt: on 25 | # fmt: on
26 | 26 |
27 | reveal_type(Ham.__mro__) # revealed: tuple[<class 'Ham'>, Unknown, <class 'object'>] 27 | reveal_type(Ham.__mro__) # revealed: tuple[<class 'Ham'>, Unknown, <class 'object'>]
| ^^^^^^^^^^^^^^^^^^^^^^^^ `tuple[<class 'Ham'>, Unknown, <class 'object'>]` | ^^^^^^^^^^^ `tuple[<class 'Ham'>, Unknown, <class 'object'>]`
28 | 28 |
29 | class Mushrooms: ... 29 | class Mushrooms: ...
| |
@ -256,12 +256,12 @@ info: `lint:duplicate-base` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:32:1 --> src/mdtest_snippet.py:32:13
| |
30 | class Omelette(Spam, Eggs, Mushrooms, Mushrooms): ... # error: [duplicate-base] 30 | class Omelette(Spam, Eggs, Mushrooms, Mushrooms): ... # error: [duplicate-base]
31 | 31 |
32 | reveal_type(Omelette.__mro__) # revealed: tuple[<class 'Omelette'>, Unknown, <class 'object'>] 32 | reveal_type(Omelette.__mro__) # revealed: tuple[<class 'Omelette'>, Unknown, <class 'object'>]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `tuple[<class 'Omelette'>, Unknown, <class 'object'>]` | ^^^^^^^^^^^^^^^^ `tuple[<class 'Omelette'>, Unknown, <class 'object'>]`
33 | 33 |
34 | # fmt: off 34 | # fmt: off
| |

View file

@ -41,19 +41,6 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/protocols.md
# Diagnostics # Diagnostics
```
info: revealed-type: Revealed type
--> src/mdtest_snippet.py:4:1
|
3 | # error: [call-non-callable]
4 | reveal_type(Protocol()) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^ `Unknown`
5 |
6 | class MyProtocol(Protocol):
|
```
``` ```
error: lint:call-non-callable: Object of type `typing.Protocol` is not callable error: lint:call-non-callable: Object of type `typing.Protocol` is not callable
--> src/mdtest_snippet.py:4:13 --> src/mdtest_snippet.py:4:13
@ -70,14 +57,14 @@ info: `lint:call-non-callable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:10:1 --> src/mdtest_snippet.py:4:13
| |
9 | # error: [call-non-callable] "Cannot instantiate class `MyProtocol`" 3 | # error: [call-non-callable]
10 | reveal_type(MyProtocol()) # revealed: MyProtocol 4 | reveal_type(Protocol()) # revealed: Unknown
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `MyProtocol` | ^^^^^^^^^^ `Unknown`
11 | 5 |
12 | class GenericProtocol[T](Protocol): 6 | class MyProtocol(Protocol):
| |
``` ```
@ -106,12 +93,13 @@ info: `lint:call-non-callable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:16:1 --> src/mdtest_snippet.py:10:13
| |
15 | # error: [call-non-callable] "Cannot instantiate class `GenericProtocol`" 9 | # error: [call-non-callable] "Cannot instantiate class `MyProtocol`"
16 | reveal_type(GenericProtocol[int]()) # revealed: GenericProtocol[int] 10 | reveal_type(MyProtocol()) # revealed: MyProtocol
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `GenericProtocol[int]` | ^^^^^^^^^^^^ `MyProtocol`
17 | class SubclassOfMyProtocol(MyProtocol): ... 11 |
12 | class GenericProtocol[T](Protocol):
| |
``` ```
@ -140,12 +128,24 @@ info: `lint:call-non-callable` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:19:1 --> src/mdtest_snippet.py:16:13
|
15 | # error: [call-non-callable] "Cannot instantiate class `GenericProtocol`"
16 | reveal_type(GenericProtocol[int]()) # revealed: GenericProtocol[int]
| ^^^^^^^^^^^^^^^^^^^^^^ `GenericProtocol[int]`
17 | class SubclassOfMyProtocol(MyProtocol): ...
|
```
```
info: revealed-type: Revealed type
--> src/mdtest_snippet.py:19:13
| |
17 | class SubclassOfMyProtocol(MyProtocol): ... 17 | class SubclassOfMyProtocol(MyProtocol): ...
18 | 18 |
19 | reveal_type(SubclassOfMyProtocol()) # revealed: SubclassOfMyProtocol 19 | reveal_type(SubclassOfMyProtocol()) # revealed: SubclassOfMyProtocol
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SubclassOfMyProtocol` | ^^^^^^^^^^^^^^^^^^^^^^ `SubclassOfMyProtocol`
20 | 20 |
21 | class SubclassOfGenericProtocol[T](GenericProtocol[T]): ... 21 | class SubclassOfGenericProtocol[T](GenericProtocol[T]): ...
| |
@ -154,12 +154,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:23:1 --> src/mdtest_snippet.py:23:13
| |
21 | class SubclassOfGenericProtocol[T](GenericProtocol[T]): ... 21 | class SubclassOfGenericProtocol[T](GenericProtocol[T]): ...
22 | 22 |
23 | reveal_type(SubclassOfGenericProtocol[int]()) # revealed: SubclassOfGenericProtocol[int] 23 | reveal_type(SubclassOfGenericProtocol[int]()) # revealed: SubclassOfGenericProtocol[int]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SubclassOfGenericProtocol[int]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SubclassOfGenericProtocol[int]`
24 | def f(x: type[MyProtocol]): 24 | def f(x: type[MyProtocol]):
25 | reveal_type(x()) # revealed: MyProtocol 25 | reveal_type(x()) # revealed: MyProtocol
| |
@ -168,12 +168,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:25:5 --> src/mdtest_snippet.py:25:17
| |
23 | reveal_type(SubclassOfGenericProtocol[int]()) # revealed: SubclassOfGenericProtocol[int] 23 | reveal_type(SubclassOfGenericProtocol[int]()) # revealed: SubclassOfGenericProtocol[int]
24 | def f(x: type[MyProtocol]): 24 | def f(x: type[MyProtocol]):
25 | reveal_type(x()) # revealed: MyProtocol 25 | reveal_type(x()) # revealed: MyProtocol
| ^^^^^^^^^^^^^^^^ `MyProtocol` | ^^^ `MyProtocol`
| |
``` ```

View file

@ -83,12 +83,12 @@ info: `lint:invalid-argument-type` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:8:9 --> src/mdtest_snippet.py:8:21
| |
6 | def f(arg: object, arg2: type): 6 | def f(arg: object, arg2: type):
7 | if isinstance(arg, HasX): # error: [invalid-argument-type] 7 | if isinstance(arg, HasX): # error: [invalid-argument-type]
8 | reveal_type(arg) # revealed: HasX 8 | reveal_type(arg) # revealed: HasX
| ^^^^^^^^^^^^^^^^ `HasX` | ^^^ `HasX`
9 | else: 9 | else:
10 | reveal_type(arg) # revealed: ~HasX 10 | reveal_type(arg) # revealed: ~HasX
| |
@ -97,12 +97,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:10:9 --> src/mdtest_snippet.py:10:21
| |
8 | reveal_type(arg) # revealed: HasX 8 | reveal_type(arg) # revealed: HasX
9 | else: 9 | else:
10 | reveal_type(arg) # revealed: ~HasX 10 | reveal_type(arg) # revealed: ~HasX
| ^^^^^^^^^^^^^^^^ `~HasX` | ^^^ `~HasX`
11 | 11 |
12 | if issubclass(arg2, HasX): # error: [invalid-argument-type] 12 | if issubclass(arg2, HasX): # error: [invalid-argument-type]
| |
@ -137,11 +137,11 @@ info: `lint:invalid-argument-type` is enabled by default
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:13:9 --> src/mdtest_snippet.py:13:21
| |
12 | if issubclass(arg2, HasX): # error: [invalid-argument-type] 12 | if issubclass(arg2, HasX): # error: [invalid-argument-type]
13 | reveal_type(arg2) # revealed: type[HasX] 13 | reveal_type(arg2) # revealed: type[HasX]
| ^^^^^^^^^^^^^^^^^ `type[HasX]` | ^^^^ `type[HasX]`
14 | else: 14 | else:
15 | reveal_type(arg2) # revealed: type & ~type[HasX] 15 | reveal_type(arg2) # revealed: type & ~type[HasX]
| |
@ -150,12 +150,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:15:9 --> src/mdtest_snippet.py:15:21
| |
13 | reveal_type(arg2) # revealed: type[HasX] 13 | reveal_type(arg2) # revealed: type[HasX]
14 | else: 14 | else:
15 | reveal_type(arg2) # revealed: type & ~type[HasX] 15 | reveal_type(arg2) # revealed: type & ~type[HasX]
| ^^^^^^^^^^^^^^^^^ `type & ~type[HasX]` | ^^^^ `type & ~type[HasX]`
16 | from typing import runtime_checkable 16 | from typing import runtime_checkable
| |
@ -163,12 +163,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:24:9 --> src/mdtest_snippet.py:24:21
| |
22 | def f(arg: object): 22 | def f(arg: object):
23 | if isinstance(arg, RuntimeCheckableHasX): # no error! 23 | if isinstance(arg, RuntimeCheckableHasX): # no error!
24 | reveal_type(arg) # revealed: RuntimeCheckableHasX 24 | reveal_type(arg) # revealed: RuntimeCheckableHasX
| ^^^^^^^^^^^^^^^^ `RuntimeCheckableHasX` | ^^^ `RuntimeCheckableHasX`
25 | else: 25 | else:
26 | reveal_type(arg) # revealed: ~RuntimeCheckableHasX 26 | reveal_type(arg) # revealed: ~RuntimeCheckableHasX
| |
@ -177,12 +177,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:26:9 --> src/mdtest_snippet.py:26:21
| |
24 | reveal_type(arg) # revealed: RuntimeCheckableHasX 24 | reveal_type(arg) # revealed: RuntimeCheckableHasX
25 | else: 25 | else:
26 | reveal_type(arg) # revealed: ~RuntimeCheckableHasX 26 | reveal_type(arg) # revealed: ~RuntimeCheckableHasX
| ^^^^^^^^^^^^^^^^ `~RuntimeCheckableHasX` | ^^^ `~RuntimeCheckableHasX`
27 | @runtime_checkable 27 | @runtime_checkable
28 | class OnlyMethodMembers(Protocol): 28 | class OnlyMethodMembers(Protocol):
| |
@ -191,12 +191,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:33:9 --> src/mdtest_snippet.py:33:21
| |
31 | def f(arg1: type, arg2: type): 31 | def f(arg1: type, arg2: type):
32 | if issubclass(arg1, RuntimeCheckableHasX): # TODO: should emit an error here (has non-method members) 32 | if issubclass(arg1, RuntimeCheckableHasX): # TODO: should emit an error here (has non-method members)
33 | reveal_type(arg1) # revealed: type[RuntimeCheckableHasX] 33 | reveal_type(arg1) # revealed: type[RuntimeCheckableHasX]
| ^^^^^^^^^^^^^^^^^ `type[RuntimeCheckableHasX]` | ^^^^ `type[RuntimeCheckableHasX]`
34 | else: 34 | else:
35 | reveal_type(arg1) # revealed: type & ~type[RuntimeCheckableHasX] 35 | reveal_type(arg1) # revealed: type & ~type[RuntimeCheckableHasX]
| |
@ -205,12 +205,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:35:9 --> src/mdtest_snippet.py:35:21
| |
33 | reveal_type(arg1) # revealed: type[RuntimeCheckableHasX] 33 | reveal_type(arg1) # revealed: type[RuntimeCheckableHasX]
34 | else: 34 | else:
35 | reveal_type(arg1) # revealed: type & ~type[RuntimeCheckableHasX] 35 | reveal_type(arg1) # revealed: type & ~type[RuntimeCheckableHasX]
| ^^^^^^^^^^^^^^^^^ `type & ~type[RuntimeCheckableHasX]` | ^^^^ `type & ~type[RuntimeCheckableHasX]`
36 | 36 |
37 | if issubclass(arg2, OnlyMethodMembers): # no error! 37 | if issubclass(arg2, OnlyMethodMembers): # no error!
| |
@ -219,11 +219,11 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:38:9 --> src/mdtest_snippet.py:38:21
| |
37 | if issubclass(arg2, OnlyMethodMembers): # no error! 37 | if issubclass(arg2, OnlyMethodMembers): # no error!
38 | reveal_type(arg2) # revealed: type[OnlyMethodMembers] 38 | reveal_type(arg2) # revealed: type[OnlyMethodMembers]
| ^^^^^^^^^^^^^^^^^ `type[OnlyMethodMembers]` | ^^^^ `type[OnlyMethodMembers]`
39 | else: 39 | else:
40 | reveal_type(arg2) # revealed: type & ~type[OnlyMethodMembers] 40 | reveal_type(arg2) # revealed: type & ~type[OnlyMethodMembers]
| |
@ -232,12 +232,12 @@ info: revealed-type: Revealed type
``` ```
info: revealed-type: Revealed type info: revealed-type: Revealed type
--> src/mdtest_snippet.py:40:9 --> src/mdtest_snippet.py:40:21
| |
38 | reveal_type(arg2) # revealed: type[OnlyMethodMembers] 38 | reveal_type(arg2) # revealed: type[OnlyMethodMembers]
39 | else: 39 | else:
40 | reveal_type(arg2) # revealed: type & ~type[OnlyMethodMembers] 40 | reveal_type(arg2) # revealed: type & ~type[OnlyMethodMembers]
| ^^^^^^^^^^^^^^^^^ `type & ~type[OnlyMethodMembers]` | ^^^^ `type & ~type[OnlyMethodMembers]`
| |
``` ```

View file

@ -4781,7 +4781,9 @@ impl<'db> TypeInferenceBuilder<'db> {
) { ) {
let mut diag = let mut diag =
builder.into_diagnostic("Revealed type"); builder.into_diagnostic("Revealed type");
let span = self.context.span(call_expression); let span = self
.context
.span(&call_expression.arguments.args[0]);
diag.annotate(Annotation::primary(span).message( diag.annotate(Annotation::primary(span).message(
format_args!( format_args!(
"`{}`", "`{}`",