Fix syntax error false positive on nested alternative patterns (#21104)

## Summary

Fixes #21101 by storing the child visitor's names in the parent visitor.
This makes sure that `visitor.names` on line 1818 isn't empty after we
visit a nested OR pattern.

## Test Plan

New inline test cases derived from the issue,
[playground](https://play.ruff.rs/7b6439ac-ee8f-4593-9a3e-c2aa34a595d0)
This commit is contained in:
Brent Westbrook 2025-10-30 13:40:03 -04:00 committed by GitHub
parent 10bda3df00
commit f0fe6d62fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 512 additions and 0 deletions

View file

@ -1841,6 +1841,15 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
// case (x, (y | y)): ...
// case [a, _] | [a, _]: ...
// case [a] | [C(a)]: ...
// test_ok nested_alternative_patterns
// match ruff:
// case {"lint": {"select": x} | {"extend-select": x}} | {"select": x}:
// ...
// match 42:
// case [[x] | [x]] | x: ...
// match 42:
// case [[x | x] | [x]] | x: ...
SemanticSyntaxChecker::add_error(
self.ctx,
SemanticSyntaxErrorKind::DifferentMatchPatternBindings,
@ -1848,6 +1857,7 @@ impl<'a, Ctx: SemanticSyntaxContext> MatchPatternVisitor<'a, Ctx> {
);
break;
}
self.names = visitor.names;
}
}
}