mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 10:48:32 +00:00
red_knot_python_semantic: update revealed type snapshots
This required a bit of surgery in the diagnostic matching and more faffing about using a "concise" message from a diagnostic instead of only printing the "primary" message.
This commit is contained in:
parent
28b64064f5
commit
ba408f4231
16 changed files with 75 additions and 77 deletions
|
@ -40,13 +40,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:11:5
|
||||
|
|
||||
9 | # error: [not-iterable]
|
||||
10 | for x in Iterable():
|
||||
11 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -37,13 +37,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:8:5
|
||||
|
|
||||
6 | # error: [not-iterable]
|
||||
7 | for x in Bad():
|
||||
8 | reveal_type(x) # revealed: Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `Unknown`
|
||||
| ^^^^^^^^^^^^^^ `Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -59,13 +59,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:24:9
|
||||
|
|
||||
22 | for x in Iterable1():
|
||||
23 | # TODO... `int` might be ideal here?
|
||||
24 | reveal_type(x) # revealed: int | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `int | Unknown`
|
||||
25 |
|
||||
26 | # error: [not-iterable]
|
||||
|
|
||||
|
@ -86,13 +86,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:29:9
|
||||
|
|
||||
27 | for y in Iterable2():
|
||||
28 | # TODO... `int` might be ideal here?
|
||||
29 | reveal_type(y) # revealed: int | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `int | Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -56,13 +56,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:22:9
|
||||
|
|
||||
20 | for x in Iterable1():
|
||||
21 | # TODO: `str` might be better
|
||||
22 | reveal_type(x) # revealed: str | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `str | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `str | Unknown`
|
||||
23 |
|
||||
24 | # error: [not-iterable]
|
||||
|
|
||||
|
@ -82,13 +82,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:26:9
|
||||
|
|
||||
24 | # error: [not-iterable]
|
||||
25 | for y in Iterable2():
|
||||
26 | reveal_type(y) # revealed: str | int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `str | int`
|
||||
| ^^^^^^^^^^^^^^ `str | int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -59,13 +59,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:18:9
|
||||
|
|
||||
16 | # error: [not-iterable]
|
||||
17 | for x in Iterable1():
|
||||
18 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
19 |
|
||||
20 | class Iterable2:
|
||||
|
|
||||
|
@ -86,13 +86,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:30:9
|
||||
|
|
||||
28 | for x in Iterable2():
|
||||
29 | # TODO: `int` would probably be better here:
|
||||
30 | reveal_type(x) # revealed: int | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `int | Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -63,13 +63,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:29:9
|
||||
|
|
||||
27 | # error: [not-iterable]
|
||||
28 | for x in Iterable1():
|
||||
29 | reveal_type(x) # revealed: int | str
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | str`
|
||||
| ^^^^^^^^^^^^^^ `int | str`
|
||||
30 |
|
||||
31 | # error: [not-iterable]
|
||||
|
|
||||
|
@ -90,13 +90,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:34:9
|
||||
|
|
||||
32 | for y in Iterable2():
|
||||
33 | # TODO: `int` would probably be better here:
|
||||
34 | reveal_type(y) # revealed: int | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `int | Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -48,13 +48,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:19:9
|
||||
|
|
||||
17 | # error: [not-iterable]
|
||||
18 | for x in Iterable():
|
||||
19 | reveal_type(x) # revealed: int | bytes
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | bytes`
|
||||
| ^^^^^^^^^^^^^^ `int | bytes`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -67,13 +67,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:33:9
|
||||
|
|
||||
31 | for x in Iterable1():
|
||||
32 | # TODO: `bytes | str` might be better
|
||||
33 | reveal_type(x) # revealed: bytes | str | Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `bytes | str | Unknown`
|
||||
| ^^^^^^^^^^^^^^ `bytes | str | Unknown`
|
||||
34 |
|
||||
35 | # error: [not-iterable]
|
||||
|
|
||||
|
@ -93,13 +93,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:37:9
|
||||
|
|
||||
35 | # error: [not-iterable]
|
||||
36 | for y in Iterable2():
|
||||
37 | reveal_type(y) # revealed: bytes | str | int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `bytes | str | int`
|
||||
| ^^^^^^^^^^^^^^ `bytes | str | int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -47,13 +47,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:18:9
|
||||
|
|
||||
16 | # error: [not-iterable]
|
||||
17 | for x in Iterable():
|
||||
18 | reveal_type(x) # revealed: int | bytes
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int | bytes`
|
||||
| ^^^^^^^^^^^^^^ `int | bytes`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -49,13 +49,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:19:9
|
||||
|
|
||||
17 | # error: [not-iterable]
|
||||
18 | for x in Test() if flag else Test2():
|
||||
19 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -44,13 +44,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:14:9
|
||||
|
|
||||
12 | # error: [not-iterable]
|
||||
13 | for x in Test() if flag else 42:
|
||||
14 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -57,13 +57,13 @@ warning: lint:possibly-unresolved-reference
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:16:5
|
||||
|
|
||||
14 | # revealed: Unknown
|
||||
15 | # error: [possibly-unresolved-reference]
|
||||
16 | reveal_type(x)
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `Unknown`
|
||||
| ^^^^^^^^^^^^^^ `Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -38,13 +38,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:9:5
|
||||
|
|
||||
7 | # error: [not-iterable]
|
||||
8 | for x in Bad():
|
||||
9 | reveal_type(x) # revealed: Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `Unknown`
|
||||
| ^^^^^^^^^^^^^^ `Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -42,13 +42,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:13:5
|
||||
|
|
||||
11 | # error: [not-iterable]
|
||||
12 | for x in Iterable():
|
||||
13 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -53,13 +53,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:20:5
|
||||
|
|
||||
18 | # error: [not-iterable]
|
||||
19 | for x in Iterable1():
|
||||
20 | reveal_type(x) # revealed: int
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `int`
|
||||
| ^^^^^^^^^^^^^^ `int`
|
||||
21 |
|
||||
22 | # error: [not-iterable]
|
||||
|
|
||||
|
@ -79,13 +79,13 @@ error: lint:not-iterable
|
|||
```
|
||||
|
||||
```
|
||||
info: revealed-type
|
||||
info: revealed-type: Revealed type
|
||||
--> /src/mdtest_snippet.py:24:5
|
||||
|
|
||||
22 | # error: [not-iterable]
|
||||
23 | for y in Iterable2():
|
||||
24 | reveal_type(y) # revealed: Unknown
|
||||
| ^^^^^^^^^^^^^^ Revealed type is `Unknown`
|
||||
| ^^^^^^^^^^^^^^ `Unknown`
|
||||
|
|
||||
|
||||
```
|
||||
|
|
|
@ -175,7 +175,7 @@ impl Unmatched for &Diagnostic {
|
|||
|
||||
maybe_add_undefined_reveal_clarification(
|
||||
self,
|
||||
format_args!(r#"[{id}] "{message}""#, message = self.primary_message()),
|
||||
format_args!(r#"[{id}] "{message}""#, message = self.concise_message()),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ impl UnmatchedWithColumn for &Diagnostic {
|
|||
self,
|
||||
format_args!(
|
||||
r#"{column} [{id}] "{message}""#,
|
||||
message = self.primary_message()
|
||||
message = self.concise_message()
|
||||
),
|
||||
)
|
||||
}
|
||||
|
@ -283,14 +283,16 @@ impl Matcher {
|
|||
match assertion {
|
||||
ParsedAssertion::Error(error) => {
|
||||
let position = unmatched.iter().position(|diagnostic| {
|
||||
!error.rule.is_some_and(|rule| {
|
||||
let lint_name_matches = !error.rule.is_some_and(|rule| {
|
||||
!(diagnostic.id().is_lint_named(rule) || diagnostic.id().matches(rule))
|
||||
}) && error
|
||||
});
|
||||
let column_matches = error
|
||||
.column
|
||||
.is_none_or(|col| col == self.column(diagnostic))
|
||||
&& error
|
||||
.message_contains
|
||||
.is_none_or(|needle| diagnostic.primary_message().contains(needle))
|
||||
.is_none_or(|col| col == self.column(diagnostic));
|
||||
let message_matches = error.message_contains.is_none_or(|needle| {
|
||||
diagnostic.concise_message().to_string().contains(needle)
|
||||
});
|
||||
lint_name_matches && column_matches && message_matches
|
||||
});
|
||||
if let Some(position) = position {
|
||||
unmatched.swap_remove(position);
|
||||
|
@ -305,11 +307,15 @@ impl Matcher {
|
|||
|
||||
let mut matched_revealed_type = None;
|
||||
let mut matched_undefined_reveal = None;
|
||||
let expected_reveal_type_message = format!("Revealed type is `{expected_type}`");
|
||||
let expected_reveal_type_message = format!("`{expected_type}`");
|
||||
for (index, diagnostic) in unmatched.iter().enumerate() {
|
||||
if matched_revealed_type.is_none()
|
||||
&& diagnostic.id() == DiagnosticId::RevealedType
|
||||
&& diagnostic.primary_message() == expected_reveal_type_message
|
||||
&& diagnostic
|
||||
.primary_annotation()
|
||||
.and_then(|a| a.get_message())
|
||||
.unwrap_or_default()
|
||||
== expected_reveal_type_message
|
||||
{
|
||||
matched_revealed_type = Some(index);
|
||||
} else if matched_undefined_reveal.is_none()
|
||||
|
@ -361,7 +367,11 @@ mod tests {
|
|||
}
|
||||
|
||||
fn into_diagnostic(self, file: File) -> Diagnostic {
|
||||
let mut diag = Diagnostic::new(self.id, Severity::Error, "");
|
||||
let mut diag = if self.id == DiagnosticId::RevealedType {
|
||||
Diagnostic::new(self.id, Severity::Error, "Revealed type")
|
||||
} else {
|
||||
Diagnostic::new(self.id, Severity::Error, "")
|
||||
};
|
||||
let span = Span::from(file).with_range(self.range);
|
||||
diag.annotate(Annotation::primary(span).message(self.message));
|
||||
diag
|
||||
|
@ -417,7 +427,7 @@ mod tests {
|
|||
"x # revealed: Foo",
|
||||
vec![ExpectedDiagnostic::new(
|
||||
DiagnosticId::RevealedType,
|
||||
"Revealed type is `Foo`",
|
||||
"`Foo`",
|
||||
0,
|
||||
)],
|
||||
);
|
||||
|
@ -431,7 +441,7 @@ mod tests {
|
|||
"x # revealed: Foo",
|
||||
vec![ExpectedDiagnostic::new(
|
||||
DiagnosticId::lint("not-revealed-type"),
|
||||
"Revealed type is `Foo`",
|
||||
"`Foo`",
|
||||
0,
|
||||
)],
|
||||
);
|
||||
|
@ -442,7 +452,7 @@ mod tests {
|
|||
0,
|
||||
&[
|
||||
"unmatched assertion: revealed: Foo",
|
||||
r#"unexpected error: 1 [not-revealed-type] "Revealed type is `Foo`""#,
|
||||
r#"unexpected error: 1 [not-revealed-type] "`Foo`""#,
|
||||
],
|
||||
)],
|
||||
);
|
||||
|
@ -465,7 +475,7 @@ mod tests {
|
|||
0,
|
||||
&[
|
||||
"unmatched assertion: revealed: Foo",
|
||||
r#"unexpected error: 1 [revealed-type] "Something else""#,
|
||||
r#"unexpected error: 1 [revealed-type] "Revealed type: Something else""#,
|
||||
],
|
||||
)],
|
||||
);
|
||||
|
@ -483,7 +493,7 @@ mod tests {
|
|||
let result = get_result(
|
||||
"x # revealed: Foo",
|
||||
vec![
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "Revealed type is `Foo`", 0),
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "`Foo`", 0),
|
||||
ExpectedDiagnostic::new(
|
||||
DiagnosticId::lint("undefined-reveal"),
|
||||
"Doesn't matter",
|
||||
|
@ -514,7 +524,7 @@ mod tests {
|
|||
let result = get_result(
|
||||
"x # revealed: Foo",
|
||||
vec![
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "Revealed type is `Bar`", 0),
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "`Bar`", 0),
|
||||
ExpectedDiagnostic::new(
|
||||
DiagnosticId::lint("undefined-reveal"),
|
||||
"Doesn't matter",
|
||||
|
@ -529,7 +539,7 @@ mod tests {
|
|||
0,
|
||||
&[
|
||||
"unmatched assertion: revealed: Foo",
|
||||
r#"unexpected error: 1 [revealed-type] "Revealed type is `Bar`""#,
|
||||
r#"unexpected error: 1 [revealed-type] "Revealed type: `Bar`""#,
|
||||
],
|
||||
)],
|
||||
);
|
||||
|
@ -545,11 +555,7 @@ mod tests {
|
|||
"undefined reveal message",
|
||||
0,
|
||||
),
|
||||
ExpectedDiagnostic::new(
|
||||
DiagnosticId::RevealedType,
|
||||
"Revealed type is `Literal[1]`",
|
||||
12,
|
||||
),
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "`Literal[1]`", 12),
|
||||
],
|
||||
);
|
||||
|
||||
|
@ -560,7 +566,7 @@ mod tests {
|
|||
&[
|
||||
"used built-in `reveal_type`: add a `# revealed` assertion on this line (\
|
||||
original diagnostic: [undefined-reveal] \"undefined reveal message\")",
|
||||
r#"unexpected error: [revealed-type] "Revealed type is `Literal[1]`""#,
|
||||
r#"unexpected error: [revealed-type] "Revealed type: `Literal[1]`""#,
|
||||
],
|
||||
)],
|
||||
);
|
||||
|
@ -576,11 +582,7 @@ mod tests {
|
|||
"undefined reveal message",
|
||||
0,
|
||||
),
|
||||
ExpectedDiagnostic::new(
|
||||
DiagnosticId::RevealedType,
|
||||
"Revealed type is `Literal[1]`",
|
||||
12,
|
||||
),
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "`Literal[1]`", 12),
|
||||
],
|
||||
);
|
||||
|
||||
|
@ -592,7 +594,7 @@ mod tests {
|
|||
"unmatched assertion: error: [something-else]",
|
||||
"used built-in `reveal_type`: add a `# revealed` assertion on this line (\
|
||||
original diagnostic: 1 [undefined-reveal] \"undefined reveal message\")",
|
||||
r#"unexpected error: 13 [revealed-type] "Revealed type is `Literal[1]`""#,
|
||||
r#"unexpected error: 13 [revealed-type] "Revealed type: `Literal[1]`""#,
|
||||
],
|
||||
)],
|
||||
);
|
||||
|
@ -1008,11 +1010,7 @@ mod tests {
|
|||
&source,
|
||||
vec![
|
||||
ExpectedDiagnostic::new(DiagnosticId::lint("undefined-reveal"), "msg", reveal),
|
||||
ExpectedDiagnostic::new(
|
||||
DiagnosticId::RevealedType,
|
||||
"Revealed type is `Literal[5]`",
|
||||
reveal,
|
||||
),
|
||||
ExpectedDiagnostic::new(DiagnosticId::RevealedType, "`Literal[5]`", reveal),
|
||||
],
|
||||
);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue