mirror of https://github.com/astral-sh/ruff
Avoid flagging starred expressions in UP007 (#7505)
## Summary These can't be fixed, because fixing them would lead to invalid syntax. So flagging them also feels misleading. Closes https://github.com/astral-sh/ruff/issues/7452.
This commit is contained in:
parent
4123d074bd
commit
28b48ab902
|
|
@ -108,3 +108,9 @@ class ServiceRefOrValue:
|
||||||
# Regression test for: https://github.com/astral-sh/ruff/issues/7201
|
# Regression test for: https://github.com/astral-sh/ruff/issues/7201
|
||||||
class ServiceRefOrValue:
|
class ServiceRefOrValue:
|
||||||
service_specification: Optional[str]is not True = None
|
service_specification: Optional[str]is not True = None
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for: https://github.com/astral-sh/ruff/issues/7452
|
||||||
|
class Collection(Protocol[*_B0]):
|
||||||
|
def __iter__(self) -> Iterator[Union[*_B0]]:
|
||||||
|
...
|
||||||
|
|
|
||||||
|
|
@ -410,5 +410,8 @@ UP007.py:110:28: UP007 [*] Use `X | Y` for type annotations
|
||||||
109 109 | class ServiceRefOrValue:
|
109 109 | class ServiceRefOrValue:
|
||||||
110 |- service_specification: Optional[str]is not True = None
|
110 |- service_specification: Optional[str]is not True = None
|
||||||
110 |+ service_specification: str | None is not True = None
|
110 |+ service_specification: str | None is not True = None
|
||||||
|
111 111 |
|
||||||
|
112 112 |
|
||||||
|
113 113 | # Regression test for: https://github.com/astral-sh/ruff/issues/7452
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ pub fn to_pep604_operator(
|
||||||
slice: &Expr,
|
slice: &Expr,
|
||||||
semantic: &SemanticModel,
|
semantic: &SemanticModel,
|
||||||
) -> Option<Pep604Operator> {
|
) -> Option<Pep604Operator> {
|
||||||
/// Returns `true` if any argument in the slice is a quoted annotation).
|
/// Returns `true` if any argument in the slice is a quoted annotation.
|
||||||
fn quoted_annotation(slice: &Expr) -> bool {
|
fn quoted_annotation(slice: &Expr) -> bool {
|
||||||
match slice {
|
match slice {
|
||||||
Expr::Constant(ast::ExprConstant {
|
Expr::Constant(ast::ExprConstant {
|
||||||
|
|
@ -155,6 +155,15 @@ pub fn to_pep604_operator(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if any argument in the slice is a starred expression.
|
||||||
|
fn starred_annotation(slice: &Expr) -> bool {
|
||||||
|
match slice {
|
||||||
|
Expr::Starred(_) => true,
|
||||||
|
Expr::Tuple(ast::ExprTuple { elts, .. }) => elts.iter().any(starred_annotation),
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the slice is a forward reference (e.g., `Optional["Foo"]`), it can only be rewritten
|
// If the slice is a forward reference (e.g., `Optional["Foo"]`), it can only be rewritten
|
||||||
// if we're in a typing-only context.
|
// if we're in a typing-only context.
|
||||||
//
|
//
|
||||||
|
|
@ -175,6 +184,14 @@ pub fn to_pep604_operator(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If any of the elements are starred expressions, we can't rewrite the subscript:
|
||||||
|
// ```python
|
||||||
|
// def f(x: Union[*int, str]): ...
|
||||||
|
// ```
|
||||||
|
if starred_annotation(slice) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
semantic
|
semantic
|
||||||
.resolve_call_path(value)
|
.resolve_call_path(value)
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue