Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions crates/ruff_linter/src/linter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1063,6 +1063,53 @@ mod tests {
PythonVersion::PY310,
"MultipleCaseAssignment"
)]
#[test_case(
"duplicate_match_key",
"
match x:
case {'key': 1, 'key': 2}:
pass
",
PythonVersion::PY310,
"DuplicateMatchKey"
)]
#[test_case(
"duplicate_match_class_attribute",
"
match x:
case Point(x=1, x=2):
pass
",
PythonVersion::PY310,
"DuplicateMatchClassAttribute"
)]
#[test_case(
"invalid_star_expression",
"
def func():
return *x
",
PythonVersion::PY310,
"InvalidStarExpression"
)]
#[test_case(
"invalid_star_expression_for",
"
for *x in range(10):
pass
",
PythonVersion::PY310,
"InvalidStarExpression"
)]
#[test_case(
"invalid_star_expression_yield",
"
def func():
yield *x
",
PythonVersion::PY310,
"InvalidStarExpression"
)]
fn test_semantic_errors(
name: &str,
contents: &str,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
source: crates/ruff_linter/src/linter.rs
---
<filename>:3:21: SyntaxError: attribute name `x` repeated in class pattern
|
2 | match x:
3 | case Point(x=1, x=2):
| ^
4 | pass
|
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
source: crates/ruff_linter/src/linter.rs
---
<filename>:3:21: SyntaxError: mapping pattern checks duplicate key `'key'`
|
2 | match x:
3 | case {'key': 1, 'key': 2}:
| ^^^^^
4 | pass
|
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
source: crates/ruff_linter/src/linter.rs
---
<filename>:3:12: SyntaxError: Starred expression cannot be used here
|
2 | def func():
3 | return *x
| ^^
|
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
source: crates/ruff_linter/src/linter.rs
---
<filename>:2:5: SyntaxError: Starred expression cannot be used here
|
2 | for *x in range(10):
| ^^
3 | pass
|
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
source: crates/ruff_linter/src/linter.rs
---
<filename>:3:11: SyntaxError: Starred expression cannot be used here
|
2 | def func():
3 | yield *x
| ^^
|
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,26 @@ match 2:
...
```

## Duplicate `match` class attribute

Attribute names in class patterns must be unique:

```toml
[environment]
python-version = "3.10"
```

```py
class Point:
pass

obj = Point()
match obj:
# error: [invalid-syntax] "attribute name `x` repeated in class pattern"
case Point(x=1, x=2):
pass
```

## `return`, `yield`, `yield from`, and `await` outside function

```py
Expand Down Expand Up @@ -186,6 +206,28 @@ def f[X, Y, X]():
pass
```

## Invalid star expression

Star expressions can't be used in certain contexts:

```py
def func():
# error: [invalid-syntax] "Starred expression cannot be used here"
return *[1, 2, 3]

def gen():
# error: [invalid-syntax] "Starred expression cannot be used here"
yield * [1, 2, 3]

# error: [invalid-syntax] "Starred expression cannot be used here"
for *x in range(10):
pass

# error: [invalid-syntax] "Starred expression cannot be used here"
for x in *range(10):
pass
```

## `await` outside async function

This error includes `await`, `async for`, `async with`, and `async` comprehensions.
Expand Down
Loading