mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 05:44:56 +00:00
Create bindings for MatchAs
patterns (#3098)
This commit is contained in:
parent
06e426f509
commit
d93c5811ea
7 changed files with 92 additions and 2 deletions
26
crates/ruff/resources/test/fixtures/pyflakes/F821_9.py
vendored
Normal file
26
crates/ruff/resources/test/fixtures/pyflakes/F821_9.py
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
"""Test: match statements."""
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Car:
|
||||||
|
make: str
|
||||||
|
model: str
|
||||||
|
|
||||||
|
|
||||||
|
def f():
|
||||||
|
match Car("Toyota", "Corolla"):
|
||||||
|
case Car("Toyota", model):
|
||||||
|
print(model)
|
||||||
|
case Car(make, "Corolla"):
|
||||||
|
print(make)
|
||||||
|
|
||||||
|
|
||||||
|
def f(provided: int) -> int:
|
||||||
|
match provided:
|
||||||
|
case True:
|
||||||
|
return captured # F821
|
||||||
|
case [captured, *_]:
|
||||||
|
return captured
|
||||||
|
case captured:
|
||||||
|
return captured
|
|
@ -119,3 +119,5 @@ def f(x: int):
|
||||||
print("A")
|
print("A")
|
||||||
case [Bar.A, *_]:
|
case [Bar.A, *_]:
|
||||||
print("A")
|
print("A")
|
||||||
|
case y:
|
||||||
|
pass
|
||||||
|
|
|
@ -10,7 +10,8 @@ use rustc_hash::{FxHashMap, FxHashSet};
|
||||||
use rustpython_common::cformat::{CFormatError, CFormatErrorType};
|
use rustpython_common::cformat::{CFormatError, CFormatErrorType};
|
||||||
use rustpython_parser::ast::{
|
use rustpython_parser::ast::{
|
||||||
Arg, Arguments, Comprehension, Constant, Excepthandler, ExcepthandlerKind, Expr, ExprContext,
|
Arg, Arguments, Comprehension, Constant, Excepthandler, ExcepthandlerKind, Expr, ExprContext,
|
||||||
ExprKind, KeywordData, Located, Location, Operator, Stmt, StmtKind, Suite,
|
ExprKind, KeywordData, Located, Location, Operator, Pattern, PatternKind, Stmt, StmtKind,
|
||||||
|
Suite,
|
||||||
};
|
};
|
||||||
use rustpython_parser::parser;
|
use rustpython_parser::parser;
|
||||||
use smallvec::smallvec;
|
use smallvec::smallvec;
|
||||||
|
@ -28,7 +29,7 @@ use crate::ast::types::{
|
||||||
RefEquality, Scope, ScopeKind,
|
RefEquality, Scope, ScopeKind,
|
||||||
};
|
};
|
||||||
use crate::ast::typing::{match_annotated_subscript, Callable, SubscriptKind};
|
use crate::ast::typing::{match_annotated_subscript, Callable, SubscriptKind};
|
||||||
use crate::ast::visitor::{walk_excepthandler, Visitor};
|
use crate::ast::visitor::{walk_excepthandler, walk_pattern, Visitor};
|
||||||
use crate::ast::{branch_detection, cast, helpers, operations, typing, visitor};
|
use crate::ast::{branch_detection, cast, helpers, operations, typing, visitor};
|
||||||
use crate::docstrings::definition::{Definition, DefinitionKind, Docstring, Documentable};
|
use crate::docstrings::definition::{Definition, DefinitionKind, Docstring, Documentable};
|
||||||
use crate::registry::{Diagnostic, Rule};
|
use crate::registry::{Diagnostic, Rule};
|
||||||
|
@ -3840,6 +3841,28 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_pattern(&mut self, pattern: &'b Pattern) {
|
||||||
|
if let PatternKind::MatchAs {
|
||||||
|
name: Some(name), ..
|
||||||
|
} = &pattern.node
|
||||||
|
{
|
||||||
|
self.add_binding(
|
||||||
|
name,
|
||||||
|
Binding {
|
||||||
|
kind: BindingKind::Assignment,
|
||||||
|
runtime_usage: None,
|
||||||
|
synthetic_usage: None,
|
||||||
|
typing_usage: None,
|
||||||
|
range: Range::from_located(pattern),
|
||||||
|
source: Some(self.current_stmt().clone()),
|
||||||
|
context: self.execution_context(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
walk_pattern(self, pattern);
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_format_spec(&mut self, format_spec: &'b Expr) {
|
fn visit_format_spec(&mut self, format_spec: &'b Expr) {
|
||||||
match &format_spec.node {
|
match &format_spec.node {
|
||||||
ExprKind::JoinedStr { values } => {
|
ExprKind::JoinedStr { values } => {
|
||||||
|
|
|
@ -101,6 +101,7 @@ mod tests {
|
||||||
#[test_case(Rule::UndefinedName, Path::new("F821_6.py"); "F821_6")]
|
#[test_case(Rule::UndefinedName, Path::new("F821_6.py"); "F821_6")]
|
||||||
#[test_case(Rule::UndefinedName, Path::new("F821_7.py"); "F821_7")]
|
#[test_case(Rule::UndefinedName, Path::new("F821_7.py"); "F821_7")]
|
||||||
#[test_case(Rule::UndefinedName, Path::new("F821_8.pyi"); "F821_8")]
|
#[test_case(Rule::UndefinedName, Path::new("F821_8.pyi"); "F821_8")]
|
||||||
|
#[test_case(Rule::UndefinedName, Path::new("F821_9.py"); "F821_9")]
|
||||||
#[test_case(Rule::UndefinedExport, Path::new("F822_0.py"); "F822_0")]
|
#[test_case(Rule::UndefinedExport, Path::new("F822_0.py"); "F822_0")]
|
||||||
#[test_case(Rule::UndefinedExport, Path::new("F822_1.py"); "F822_1")]
|
#[test_case(Rule::UndefinedExport, Path::new("F822_1.py"); "F822_1")]
|
||||||
#[test_case(Rule::UndefinedExport, Path::new("F822_2.py"); "F822_2")]
|
#[test_case(Rule::UndefinedExport, Path::new("F822_2.py"); "F822_2")]
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff/src/rules/pyflakes/mod.rs
|
||||||
|
expression: diagnostics
|
||||||
|
---
|
||||||
|
- kind:
|
||||||
|
UndefinedName:
|
||||||
|
name: captured
|
||||||
|
location:
|
||||||
|
row: 22
|
||||||
|
column: 19
|
||||||
|
end_location:
|
||||||
|
row: 22
|
||||||
|
column: 27
|
||||||
|
fix: ~
|
||||||
|
parent: ~
|
||||||
|
|
|
@ -186,4 +186,15 @@ expression: diagnostics
|
||||||
row: 115
|
row: 115
|
||||||
column: 10
|
column: 10
|
||||||
parent: ~
|
parent: ~
|
||||||
|
- kind:
|
||||||
|
UnusedVariable:
|
||||||
|
name: y
|
||||||
|
location:
|
||||||
|
row: 122
|
||||||
|
column: 13
|
||||||
|
end_location:
|
||||||
|
row: 122
|
||||||
|
column: 14
|
||||||
|
fix: ~
|
||||||
|
parent: ~
|
||||||
|
|
||||||
|
|
|
@ -222,4 +222,15 @@ expression: diagnostics
|
||||||
row: 115
|
row: 115
|
||||||
column: 10
|
column: 10
|
||||||
parent: ~
|
parent: ~
|
||||||
|
- kind:
|
||||||
|
UnusedVariable:
|
||||||
|
name: y
|
||||||
|
location:
|
||||||
|
row: 122
|
||||||
|
column: 13
|
||||||
|
end_location:
|
||||||
|
row: 122
|
||||||
|
column: 14
|
||||||
|
fix: ~
|
||||||
|
parent: ~
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue