mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-16 08:30:30 +00:00
Use optional parentheses for tuples in return statements (#6875)
This commit is contained in:
parent
19ccf1d073
commit
adb48692d6
5 changed files with 112 additions and 33 deletions
16
crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return.py
vendored
Normal file
16
crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return.py
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
return len(self.nodeseeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return len(self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
len(self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
)
|
|
@ -31,6 +31,20 @@ pub enum TupleParentheses {
|
||||||
/// ```
|
/// ```
|
||||||
Preserve,
|
Preserve,
|
||||||
|
|
||||||
|
/// The same as [`Self::Default`] except that it uses [`optional_parentheses`] rather than
|
||||||
|
/// [`parenthesize_if_expands`]. This avoids adding parentheses if breaking any containing parenthesized
|
||||||
|
/// expression makes the tuple fit.
|
||||||
|
///
|
||||||
|
/// Avoids adding parentheses around the tuple because breaking the `sum` call expression is sufficient
|
||||||
|
/// to make it fit.
|
||||||
|
///
|
||||||
|
/// ```python
|
||||||
|
/// return len(self.nodeseeeeeeeee), sum(
|
||||||
|
// len(node.parents) for node in self.node_map.values()
|
||||||
|
// )
|
||||||
|
/// ```
|
||||||
|
OptionalParentheses,
|
||||||
|
|
||||||
/// Handle the special cases where we don't include parentheses at all.
|
/// Handle the special cases where we don't include parentheses at all.
|
||||||
///
|
///
|
||||||
/// Black never formats tuple targets of for loops with parentheses if inside a comprehension.
|
/// Black never formats tuple targets of for loops with parentheses if inside a comprehension.
|
||||||
|
@ -158,7 +172,7 @@ impl FormatNodeRule<ExprTuple> for FormatExprTuple {
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
TupleParentheses::Preserve => group(&ExprSequence::new(item)).fmt(f),
|
TupleParentheses::Preserve => group(&ExprSequence::new(item)).fmt(f),
|
||||||
TupleParentheses::NeverPreserve => {
|
TupleParentheses::NeverPreserve | TupleParentheses::OptionalParentheses => {
|
||||||
optional_parentheses(&ExprSequence::new(item)).fmt(f)
|
optional_parentheses(&ExprSequence::new(item)).fmt(f)
|
||||||
}
|
}
|
||||||
TupleParentheses::Default => {
|
TupleParentheses::Default => {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use ruff_formatter::write;
|
use ruff_formatter::write;
|
||||||
use ruff_python_ast::StmtReturn;
|
use ruff_python_ast::{Expr, StmtReturn};
|
||||||
|
|
||||||
use crate::comments::{SourceComment, SuppressionKind};
|
use crate::comments::{SourceComment, SuppressionKind};
|
||||||
|
use crate::expression::expr_tuple::TupleParentheses;
|
||||||
use crate::expression::maybe_parenthesize_expression;
|
use crate::expression::maybe_parenthesize_expression;
|
||||||
use crate::expression::parentheses::Parenthesize;
|
use crate::expression::parentheses::Parenthesize;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
@ -12,17 +13,31 @@ pub struct FormatStmtReturn;
|
||||||
impl FormatNodeRule<StmtReturn> for FormatStmtReturn {
|
impl FormatNodeRule<StmtReturn> for FormatStmtReturn {
|
||||||
fn fmt_fields(&self, item: &StmtReturn, f: &mut PyFormatter) -> FormatResult<()> {
|
fn fmt_fields(&self, item: &StmtReturn, f: &mut PyFormatter) -> FormatResult<()> {
|
||||||
let StmtReturn { range: _, value } = item;
|
let StmtReturn { range: _, value } = item;
|
||||||
if let Some(value) = value {
|
|
||||||
|
text("return").fmt(f)?;
|
||||||
|
|
||||||
|
match value.as_deref() {
|
||||||
|
Some(Expr::Tuple(tuple)) if !f.context().comments().has_leading(tuple) => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
[
|
||||||
|
space(),
|
||||||
|
tuple
|
||||||
|
.format()
|
||||||
|
.with_options(TupleParentheses::OptionalParentheses)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Some(value) => {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
[
|
[
|
||||||
text("return"),
|
|
||||||
space(),
|
space(),
|
||||||
maybe_parenthesize_expression(value, item, Parenthesize::IfBreaks)
|
maybe_parenthesize_expression(value, item, Parenthesize::IfBreaks)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
} else {
|
}
|
||||||
text("return").fmt(f)
|
None => Ok(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -252,33 +252,23 @@ self.assertEqual(
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
return (
|
return (
|
||||||
(
|
|
||||||
"((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) -"
|
"((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) -"
|
||||||
" (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))"
|
" (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))"
|
||||||
) % {"lhs": lhs_sql, "rhs": rhs_sql},
|
) % {"lhs": lhs_sql, "rhs": rhs_sql}, tuple(lhs_params) * 2 + tuple(rhs_params) * 2
|
||||||
tuple(lhs_params) * 2 + tuple(rhs_params) * 2,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test2():
|
def test2():
|
||||||
return (
|
return "RETURNING %s INTO %s" % (
|
||||||
"RETURNING %s INTO %s"
|
|
||||||
% (
|
|
||||||
", ".join(field_names),
|
", ".join(field_names),
|
||||||
", ".join(["%s"] * len(params)),
|
", ".join(["%s"] * len(params)),
|
||||||
),
|
), tuple(params)
|
||||||
tuple(params),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test3():
|
def test3():
|
||||||
return (
|
return (
|
||||||
(
|
|
||||||
"(CASE WHEN JSON_TYPE(%s, %%s) IN (%s) "
|
"(CASE WHEN JSON_TYPE(%s, %%s) IN (%s) "
|
||||||
"THEN JSON_TYPE(%s, %%s) ELSE JSON_EXTRACT(%s, %%s) END)"
|
"THEN JSON_TYPE(%s, %%s) ELSE JSON_EXTRACT(%s, %%s) END)"
|
||||||
) % (lhs, datatype_values, lhs, lhs),
|
) % (lhs, datatype_values, lhs, lhs), (tuple(params) + (json_path,)) * 3
|
||||||
(tuple(params) + (json_path,)) * 3,
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_formatter/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return.py
|
||||||
|
---
|
||||||
|
## Input
|
||||||
|
```py
|
||||||
|
|
||||||
|
return len(self.nodeseeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return len(self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
len(self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output
|
||||||
|
```py
|
||||||
|
return len(self.nodeseeeeeeeee), sum(
|
||||||
|
len(node.parents) for node in self.node_map.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return len(
|
||||||
|
self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
|
||||||
|
), sum(len(node.parents) for node in self.node_map.values())
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
len(self.nodeseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee),
|
||||||
|
sum(len(node.parents) for node in self.node_map.values()),
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue