mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-10 21:58:30 +00:00
Update mutable-argument-default
(B006
) to use extend-immutable-calls
when determining if annotations are immutable (#6781)
Part of https://github.com/astral-sh/ruff/issues/3762
This commit is contained in:
parent
34b2ae73b4
commit
417a1d0717
8 changed files with 101 additions and 15 deletions
|
@ -186,12 +186,19 @@ pub fn to_pep604_operator(
|
|||
|
||||
/// Return `true` if `Expr` represents a reference to a type annotation that resolves to an
|
||||
/// immutable type.
|
||||
pub fn is_immutable_annotation(expr: &Expr, semantic: &SemanticModel) -> bool {
|
||||
pub fn is_immutable_annotation(
|
||||
expr: &Expr,
|
||||
semantic: &SemanticModel,
|
||||
extend_immutable_calls: &[CallPath],
|
||||
) -> bool {
|
||||
match expr {
|
||||
Expr::Name(_) | Expr::Attribute(_) => {
|
||||
semantic.resolve_call_path(expr).is_some_and(|call_path| {
|
||||
is_immutable_non_generic_type(call_path.as_slice())
|
||||
|| is_immutable_generic_type(call_path.as_slice())
|
||||
|| extend_immutable_calls
|
||||
.iter()
|
||||
.any(|target| call_path == *target)
|
||||
})
|
||||
}
|
||||
Expr::Subscript(ast::ExprSubscript { value, slice, .. }) => {
|
||||
|
@ -200,17 +207,19 @@ pub fn is_immutable_annotation(expr: &Expr, semantic: &SemanticModel) -> bool {
|
|||
true
|
||||
} else if matches!(call_path.as_slice(), ["typing", "Union"]) {
|
||||
if let Expr::Tuple(ast::ExprTuple { elts, .. }) = slice.as_ref() {
|
||||
elts.iter()
|
||||
.all(|elt| is_immutable_annotation(elt, semantic))
|
||||
elts.iter().all(|elt| {
|
||||
is_immutable_annotation(elt, semantic, extend_immutable_calls)
|
||||
})
|
||||
} else {
|
||||
false
|
||||
}
|
||||
} else if matches!(call_path.as_slice(), ["typing", "Optional"]) {
|
||||
is_immutable_annotation(slice, semantic)
|
||||
is_immutable_annotation(slice, semantic, extend_immutable_calls)
|
||||
} else if is_pep_593_generic_type(call_path.as_slice()) {
|
||||
if let Expr::Tuple(ast::ExprTuple { elts, .. }) = slice.as_ref() {
|
||||
elts.first()
|
||||
.is_some_and(|elt| is_immutable_annotation(elt, semantic))
|
||||
elts.first().is_some_and(|elt| {
|
||||
is_immutable_annotation(elt, semantic, extend_immutable_calls)
|
||||
})
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
@ -224,7 +233,10 @@ pub fn is_immutable_annotation(expr: &Expr, semantic: &SemanticModel) -> bool {
|
|||
op: Operator::BitOr,
|
||||
right,
|
||||
range: _,
|
||||
}) => is_immutable_annotation(left, semantic) && is_immutable_annotation(right, semantic),
|
||||
}) => {
|
||||
is_immutable_annotation(left, semantic, extend_immutable_calls)
|
||||
&& is_immutable_annotation(right, semantic, extend_immutable_calls)
|
||||
}
|
||||
Expr::Constant(ast::ExprConstant {
|
||||
value: Constant::None,
|
||||
..
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue