mirror of
https://github.com/astral-sh/ruff.git
synced 2025-11-19 12:16:43 +00:00
Fix syntax error false positive on alternative match patterns (#21362)
Some checks are pending
CI / mkdocs (push) Waiting to run
CI / test scripts (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (${{ github.repository == 'astral-sh/ruff' && 'depot-windows-2022-16' || 'windows-latest' }}) (push) Blocked by required conditions
CI / cargo test (macos-latest) (push) Blocked by required conditions
CI / pre-commit (push) Waiting to run
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / ty completion evaluation (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks instrumented (ruff) (push) Blocked by required conditions
CI / benchmarks instrumented (ty) (push) Blocked by required conditions
CI / benchmarks walltime (medium|multithreaded) (push) Blocked by required conditions
CI / benchmarks walltime (small|large) (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run
Some checks are pending
CI / mkdocs (push) Waiting to run
CI / test scripts (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (${{ github.repository == 'astral-sh/ruff' && 'depot-windows-2022-16' || 'windows-latest' }}) (push) Blocked by required conditions
CI / cargo test (macos-latest) (push) Blocked by required conditions
CI / pre-commit (push) Waiting to run
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / ty completion evaluation (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks instrumented (ruff) (push) Blocked by required conditions
CI / benchmarks instrumented (ty) (push) Blocked by required conditions
CI / benchmarks walltime (medium|multithreaded) (push) Blocked by required conditions
CI / benchmarks walltime (small|large) (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run
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
3 changed files with 216 additions and 2 deletions
|
|
@ -5,3 +5,5 @@ match 42:
|
|||
case [[x] | [x]] | x: ...
|
||||
match 42:
|
||||
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: ...
|
||||
// match 42:
|
||||
// case [[x | x] | [x]] | x: ...
|
||||
// match 42:
|
||||
// case ast.Subscript(n, ast.Constant() | ast.Slice()) | ast.Attribute(n): ...
|
||||
SemanticSyntaxChecker::add_error(
|
||||
self.ctx,
|
||||
SemanticSyntaxErrorKind::DifferentMatchPatternBindings,
|
||||
|
|
@ -1875,7 +1877,7 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
|
|||
);
|
||||
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(
|
||||
ModModule {
|
||||
node_index: NodeIndex(None),
|
||||
range: 0..181,
|
||||
range: 0..271,
|
||||
body: [
|
||||
Match(
|
||||
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…
Add table
Add a link
Reference in a new issue