Skip to content

Commit 95e7a77

Browse files
committed
refactor: change error messgae & add documentation
Signed-off-by: 11happy <soni5happy@gmail.com>
1 parent b55c758 commit 95e7a77

File tree

5 files changed

+36
-29
lines changed

5 files changed

+36
-29
lines changed

crates/ruff_linter/src/checkers/ast/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ impl SemanticSyntaxContext for Checker<'_> {
723723
| SemanticSyntaxErrorKind::IrrefutableCasePattern(_)
724724
| SemanticSyntaxErrorKind::SingleStarredAssignment
725725
| SemanticSyntaxErrorKind::WriteToDebug(_)
726-
| SemanticSyntaxErrorKind::AlternateBindedPattern(_)
726+
| SemanticSyntaxErrorKind::AlternateBindedPattern
727727
| SemanticSyntaxErrorKind::InvalidExpression(..)
728728
| SemanticSyntaxErrorKind::DuplicateMatchKey(_)
729729
| SemanticSyntaxErrorKind::DuplicateMatchClassAttribute(_)

crates/ruff_python_parser/src/semantic_errors.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,8 +1137,8 @@ impl Display for SemanticSyntaxError {
11371137
}
11381138
SemanticSyntaxErrorKind::BreakOutsideLoop => f.write_str("`break` outside loop"),
11391139
SemanticSyntaxErrorKind::ContinueOutsideLoop => f.write_str("`continue` outside loop"),
1140-
SemanticSyntaxErrorKind::AlternateBindedPattern(name) => {
1141-
write!(f, "variable `{name}` is not bound in all patterns")
1140+
SemanticSyntaxErrorKind::AlternateBindedPattern => {
1141+
write!(f, "alternative patterns bind different names")
11421142
}
11431143
}
11441144
}
@@ -1368,10 +1368,7 @@ pub enum SemanticSyntaxErrorKind {
13681368
/// to be very rare and not worth the additional complexity to detect.
13691369
///
13701370
/// [#111123]: https://github.com/python/cpython/issues/111123
1371-
LoadBeforeGlobalDeclaration {
1372-
name: String,
1373-
start: TextSize,
1374-
},
1371+
LoadBeforeGlobalDeclaration { name: String, start: TextSize },
13751372

13761373
/// Represents the use of a `nonlocal` variable before its `nonlocal` declaration.
13771374
///
@@ -1389,10 +1386,7 @@ pub enum SemanticSyntaxErrorKind {
13891386
/// ## Known Issues
13901387
///
13911388
/// See [`LoadBeforeGlobalDeclaration`][Self::LoadBeforeGlobalDeclaration].
1392-
LoadBeforeNonlocalDeclaration {
1393-
name: String,
1394-
start: TextSize,
1395-
},
1389+
LoadBeforeNonlocalDeclaration { name: String, start: TextSize },
13961390

13971391
/// Represents the use of a starred expression in an invalid location, such as a `return` or
13981392
/// `yield` statement.
@@ -1525,7 +1519,20 @@ pub enum SemanticSyntaxErrorKind {
15251519

15261520
/// Represents the use of a `continue` statement outside of a loop.
15271521
ContinueOutsideLoop,
1528-
AlternateBindedPattern(String),
1522+
1523+
/// Represents the use of alternative patterns in a `match` statement that bind different names.
1524+
///
1525+
/// Python requires all alternatives in an OR pattern (`|`) to bind the same set of names.
1526+
/// Using different names results in a `SyntaxError`.
1527+
///
1528+
/// ## Example:
1529+
///
1530+
/// ```python
1531+
/// match 5:
1532+
/// case [x] | [y]: # error
1533+
/// ...
1534+
/// ```
1535+
AlternateBindedPattern,
15291536
}
15301537

15311538
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, get_size2::GetSize)]
@@ -1788,7 +1795,7 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
17881795
previous_names = Some(visitor.names);
17891796
continue;
17901797
};
1791-
if let Some(name) = prev.symmetric_difference(&visitor.names).next() {
1798+
if prev.symmetric_difference(&visitor.names).next().is_some() {
17921799
// test_err alternate_binded_pattern
17931800
// match x:
17941801
// case [a] | [b]: ...
@@ -1813,7 +1820,7 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
18131820
// case [a] | [C(a)]: ...
18141821
SemanticSyntaxChecker::add_error(
18151822
self.ctx,
1816-
SemanticSyntaxErrorKind::AlternateBindedPattern(name.to_string()),
1823+
SemanticSyntaxErrorKind::AlternateBindedPattern,
18171824
pattern.range(),
18181825
);
18191826
break;

crates/ruff_python_parser/tests/snapshots/invalid_syntax@alternate_binded_pattern.py.snap

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,7 +1120,7 @@ Module(
11201120
|
11211121
1 | match x:
11221122
2 | case [a] | [b]: ...
1123-
| ^^^ Syntax Error: variable `a` is not bound in all patterns
1123+
| ^^^ Syntax Error: alternative patterns bind different names
11241124
3 | case [a] | []: ...
11251125
4 | case (x, y) | (x,): ...
11261126
|
@@ -1130,7 +1130,7 @@ Module(
11301130
1 | match x:
11311131
2 | case [a] | [b]: ...
11321132
3 | case [a] | []: ...
1133-
| ^^ Syntax Error: variable `a` is not bound in all patterns
1133+
| ^^ Syntax Error: alternative patterns bind different names
11341134
4 | case (x, y) | (x,): ...
11351135
5 | case [a, _] | [a, b]: ...
11361136
|
@@ -1140,7 +1140,7 @@ Module(
11401140
2 | case [a] | [b]: ...
11411141
3 | case [a] | []: ...
11421142
4 | case (x, y) | (x,): ...
1143-
| ^^^^ Syntax Error: variable `y` is not bound in all patterns
1143+
| ^^^^ Syntax Error: alternative patterns bind different names
11441144
5 | case [a, _] | [a, b]: ...
11451145
6 | case (x, (y | z)): ...
11461146
|
@@ -1150,7 +1150,7 @@ Module(
11501150
3 | case [a] | []: ...
11511151
4 | case (x, y) | (x,): ...
11521152
5 | case [a, _] | [a, b]: ...
1153-
| ^^^^^^ Syntax Error: variable `b` is not bound in all patterns
1153+
| ^^^^^^ Syntax Error: alternative patterns bind different names
11541154
6 | case (x, (y | z)): ...
11551155
7 | case [a] | [b] | [c]: ...
11561156
|
@@ -1160,7 +1160,7 @@ Module(
11601160
4 | case (x, y) | (x,): ...
11611161
5 | case [a, _] | [a, b]: ...
11621162
6 | case (x, (y | z)): ...
1163-
| ^ Syntax Error: variable `y` is not bound in all patterns
1163+
| ^ Syntax Error: alternative patterns bind different names
11641164
7 | case [a] | [b] | [c]: ...
11651165
8 | case [] | [a]: ...
11661166
|
@@ -1170,7 +1170,7 @@ Module(
11701170
5 | case [a, _] | [a, b]: ...
11711171
6 | case (x, (y | z)): ...
11721172
7 | case [a] | [b] | [c]: ...
1173-
| ^^^ Syntax Error: variable `a` is not bound in all patterns
1173+
| ^^^ Syntax Error: alternative patterns bind different names
11741174
8 | case [] | [a]: ...
11751175
9 | case [a] | [C(x)]: ...
11761176
|
@@ -1180,7 +1180,7 @@ Module(
11801180
6 | case (x, (y | z)): ...
11811181
7 | case [a] | [b] | [c]: ...
11821182
8 | case [] | [a]: ...
1183-
| ^^^ Syntax Error: variable `a` is not bound in all patterns
1183+
| ^^^ Syntax Error: alternative patterns bind different names
11841184
9 | case [a] | [C(x)]: ...
11851185
10 | case [[a] | [b]]: ...
11861186
|
@@ -1190,7 +1190,7 @@ Module(
11901190
7 | case [a] | [b] | [c]: ...
11911191
8 | case [] | [a]: ...
11921192
9 | case [a] | [C(x)]: ...
1193-
| ^^^^^^ Syntax Error: variable `a` is not bound in all patterns
1193+
| ^^^^^^ Syntax Error: alternative patterns bind different names
11941194
10 | case [[a] | [b]]: ...
11951195
11 | case [C(a)] | [C(b)]: ...
11961196
|
@@ -1200,7 +1200,7 @@ Module(
12001200
8 | case [] | [a]: ...
12011201
9 | case [a] | [C(x)]: ...
12021202
10 | case [[a] | [b]]: ...
1203-
| ^^^ Syntax Error: variable `a` is not bound in all patterns
1203+
| ^^^ Syntax Error: alternative patterns bind different names
12041204
11 | case [C(a)] | [C(b)]: ...
12051205
12 | case [C(D(a))] | [C(D(b))]: ...
12061206
|
@@ -1210,7 +1210,7 @@ Module(
12101210
9 | case [a] | [C(x)]: ...
12111211
10 | case [[a] | [b]]: ...
12121212
11 | case [C(a)] | [C(b)]: ...
1213-
| ^^^^^^ Syntax Error: variable `a` is not bound in all patterns
1213+
| ^^^^^^ Syntax Error: alternative patterns bind different names
12141214
12 | case [C(D(a))] | [C(D(b))]: ...
12151215
13 | case [(a, b)] | [(c, d)]: ...
12161216
|
@@ -1220,7 +1220,7 @@ Module(
12201220
10 | case [[a] | [b]]: ...
12211221
11 | case [C(a)] | [C(b)]: ...
12221222
12 | case [C(D(a))] | [C(D(b))]: ...
1223-
| ^^^^^^^^^ Syntax Error: variable `a` is not bound in all patterns
1223+
| ^^^^^^^^^ Syntax Error: alternative patterns bind different names
12241224
13 | case [(a, b)] | [(c, d)]: ...
12251225
|
12261226

@@ -1229,5 +1229,5 @@ Module(
12291229
11 | case [C(a)] | [C(b)]: ...
12301230
12 | case [C(D(a))] | [C(D(b))]: ...
12311231
13 | case [(a, b)] | [(c, d)]: ...
1232-
| ^^^^^^^^ Syntax Error: variable `a` is not bound in all patterns
1232+
| ^^^^^^^^ Syntax Error: alternative patterns bind different names
12331233
|

crates/ruff_python_parser/tests/snapshots/invalid_syntax@irrefutable_case_pattern.py.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,6 @@ Module(
433433
9 | case 2: ...
434434
10 | match x:
435435
11 | case enum.variant | var: ... # or pattern with irrefutable part
436-
| ^^^ Syntax Error: variable `var` is not bound in all patterns
436+
| ^^^ Syntax Error: alternative patterns bind different names
437437
12 | case 2: ...
438438
|

crates/ruff_python_parser/tests/snapshots/invalid_syntax@statements__match__star_pattern_usage.py.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ Module(
621621
7 | case *foo:
622622
8 | pass
623623
9 | case *foo | 1:
624-
| ^ Syntax Error: variable `foo` is not bound in all patterns
624+
| ^ Syntax Error: alternative patterns bind different names
625625
10 | pass
626626
11 | case 1 | *foo:
627627
|
@@ -631,7 +631,7 @@ Module(
631631
9 | case *foo | 1:
632632
10 | pass
633633
11 | case 1 | *foo:
634-
| ^^^^ Syntax Error: variable `foo` is not bound in all patterns
634+
| ^^^^ Syntax Error: alternative patterns bind different names
635635
12 | pass
636636
13 | case Foo(*_):
637637
|

0 commit comments

Comments
 (0)