mirror of https://github.com/astral-sh/ruff
Fix syntax error false positive on alternative `match` patterns (#21362)
Summary -- Fixes #21360 by using the union of names instead of overwriting them, as Micha suggested originally on #21104. This avoids overwriting the `n` name in the `Subscript` by the empty set of names visited in the nested OR pattern before visiting the other arm of the outer OR pattern. Test Plan -- A new inline test case taken from the issue
This commit is contained in:
parent
8d1efe964a
commit
835e31b3ff
|
|
@ -5,3 +5,5 @@ match 42:
|
||||||
case [[x] | [x]] | x: ...
|
case [[x] | [x]] | x: ...
|
||||||
match 42:
|
match 42:
|
||||||
case [[x | x] | [x]] | x: ...
|
case [[x | x] | [x]] | x: ...
|
||||||
|
match 42:
|
||||||
|
case ast.Subscript(n, ast.Constant() | ast.Slice()) | ast.Attribute(n): ...
|
||||||
|
|
|
||||||
|
|
@ -1868,6 +1868,8 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
|
||||||
// case [[x] | [x]] | x: ...
|
// case [[x] | [x]] | x: ...
|
||||||
// match 42:
|
// match 42:
|
||||||
// case [[x | x] | [x]] | x: ...
|
// case [[x | x] | [x]] | x: ...
|
||||||
|
// match 42:
|
||||||
|
// case ast.Subscript(n, ast.Constant() | ast.Slice()) | ast.Attribute(n): ...
|
||||||
SemanticSyntaxChecker::add_error(
|
SemanticSyntaxChecker::add_error(
|
||||||
self.ctx,
|
self.ctx,
|
||||||
SemanticSyntaxErrorKind::DifferentMatchPatternBindings,
|
SemanticSyntaxErrorKind::DifferentMatchPatternBindings,
|
||||||
|
|
@ -1875,7 +1877,7 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
self.names = visitor.names;
|
self.names.extend(visitor.names);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ input_file: crates/ruff_python_parser/resources/inline/ok/nested_alternative_pat
|
||||||
Module(
|
Module(
|
||||||
ModModule {
|
ModModule {
|
||||||
node_index: NodeIndex(None),
|
node_index: NodeIndex(None),
|
||||||
range: 0..181,
|
range: 0..271,
|
||||||
body: [
|
body: [
|
||||||
Match(
|
Match(
|
||||||
StmtMatch {
|
StmtMatch {
|
||||||
|
|
@ -489,6 +489,216 @@ Module(
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
Match(
|
||||||
|
StmtMatch {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 181..270,
|
||||||
|
subject: NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 187..189,
|
||||||
|
value: Int(
|
||||||
|
42,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
cases: [
|
||||||
|
MatchCase {
|
||||||
|
range: 195..270,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
pattern: MatchOr(
|
||||||
|
PatternMatchOr {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 200..265,
|
||||||
|
patterns: [
|
||||||
|
MatchClass(
|
||||||
|
PatternMatchClass {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 200..246,
|
||||||
|
cls: Attribute(
|
||||||
|
ExprAttribute {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 200..213,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 200..203,
|
||||||
|
id: Name("ast"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
attr: Identifier {
|
||||||
|
id: Name("Subscript"),
|
||||||
|
range: 204..213,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
arguments: PatternArguments {
|
||||||
|
range: 213..246,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
patterns: [
|
||||||
|
MatchAs(
|
||||||
|
PatternMatchAs {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 214..215,
|
||||||
|
pattern: None,
|
||||||
|
name: Some(
|
||||||
|
Identifier {
|
||||||
|
id: Name("n"),
|
||||||
|
range: 214..215,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
MatchOr(
|
||||||
|
PatternMatchOr {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 217..245,
|
||||||
|
patterns: [
|
||||||
|
MatchClass(
|
||||||
|
PatternMatchClass {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 217..231,
|
||||||
|
cls: Attribute(
|
||||||
|
ExprAttribute {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 217..229,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 217..220,
|
||||||
|
id: Name("ast"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
attr: Identifier {
|
||||||
|
id: Name("Constant"),
|
||||||
|
range: 221..229,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
arguments: PatternArguments {
|
||||||
|
range: 229..231,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
patterns: [],
|
||||||
|
keywords: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
MatchClass(
|
||||||
|
PatternMatchClass {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 234..245,
|
||||||
|
cls: Attribute(
|
||||||
|
ExprAttribute {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 234..243,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 234..237,
|
||||||
|
id: Name("ast"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
attr: Identifier {
|
||||||
|
id: Name("Slice"),
|
||||||
|
range: 238..243,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
arguments: PatternArguments {
|
||||||
|
range: 243..245,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
patterns: [],
|
||||||
|
keywords: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
keywords: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
MatchClass(
|
||||||
|
PatternMatchClass {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 249..265,
|
||||||
|
cls: Attribute(
|
||||||
|
ExprAttribute {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 249..262,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 249..252,
|
||||||
|
id: Name("ast"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
attr: Identifier {
|
||||||
|
id: Name("Attribute"),
|
||||||
|
range: 253..262,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
arguments: PatternArguments {
|
||||||
|
range: 262..265,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
patterns: [
|
||||||
|
MatchAs(
|
||||||
|
PatternMatchAs {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 263..264,
|
||||||
|
pattern: None,
|
||||||
|
name: Some(
|
||||||
|
Identifier {
|
||||||
|
id: Name("n"),
|
||||||
|
range: 263..264,
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
keywords: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
guard: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 267..270,
|
||||||
|
value: EllipsisLiteral(
|
||||||
|
ExprEllipsisLiteral {
|
||||||
|
node_index: NodeIndex(None),
|
||||||
|
range: 267..270,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue