apply Micha's patch, fixing everything?

Co-authored-by: Micha Reiser <micha@reiser.io>
This commit is contained in:
Brent Westbrook 2025-12-03 09:14:52 -05:00
parent 97850661fd
commit efa372b379
No known key found for this signature in database
4 changed files with 64 additions and 71 deletions

View File

@ -1,14 +1,11 @@
use ruff_formatter::{FormatRuleWithOptions, RemoveSoftLinesBuffer, write};
use ruff_formatter::{FormatRuleWithOptions, RemoveSoftLinesBuffer, format_args, write};
use ruff_python_ast::{AnyNodeRef, Expr, ExprLambda};
use ruff_text_size::Ranged;
use crate::builders::parenthesize_if_expands;
use crate::comments::dangling_comments;
use crate::expression::has_own_parentheses;
use crate::expression::maybe_parenthesize_expression;
use crate::expression::parentheses::{
NeedsParentheses, OptionalParentheses, Parenthesize, is_expression_parenthesized,
};
use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses, Parentheses};
use crate::other::parameters::ParametersParentheses;
use crate::prelude::*;
use crate::preview::is_force_single_line_lambda_parameters_enabled;
@ -83,28 +80,32 @@ impl FormatNodeRule<ExprLambda> for FormatExprLambda {
}
}
// Avoid parenthesizing lists, dictionaries, etc. that have their own parentheses, but still
// wrap calls and subscripts, which can have long expressions before the parentheses:
// ```py
// lambda arg1, arg2, arg3, *args, **kwargs: a_loooooooooooong_call_expression.with_an_attr(inner, args)
// ```
let needs_parentheses = has_own_parentheses(body, f.context()).is_none()
|| matches!(&**body, Expr::Call(_) | Expr::Subscript(_));
if is_parenthesize_lambda_bodies_enabled(f.context()) {
let fmt_body = format_with(|f| {
if matches!(&**body, Expr::Call(_) | Expr::Subscript(_)) {
let body = body.format().with_options(Parentheses::Never).memoized();
if is_parenthesize_lambda_bodies_enabled(f.context())
&& needs_parentheses
&& !is_expression_parenthesized(body.into(), comments.ranges(), f.context().source())
{
match self.layout {
ExprLambdaLayout::Default => maybe_parenthesize_expression(
body,
item,
Parenthesize::IfBreaksParenthesizedNested,
)
.fmt(f),
ExprLambdaLayout::Assignment => {
fits_expanded(&parenthesize_if_expands(&body.format())).fmt(f)
best_fitting![
// body all flat
body,
// body expanded
body,
// parenthesized
format_args![token("("), block_indent(&body), token(")")]
]
.fmt(f)
} else if has_own_parentheses(body, f.context()).is_some() {
// We probably need to be more careful here and preserve parentheses if there are comments?
body.format().fmt(f)
} else {
parenthesize_if_expands(&body.format().with_options(Parentheses::Never)).fmt(f)
}
});
match self.layout {
// Can we move the `fits_expanded` into the assignment formatting?
ExprLambdaLayout::Assignment => fits_expanded(&fmt_body).fmt(f),
ExprLambdaLayout::Default => fmt_body.fmt(f),
}
} else {
body.format().fmt(f)

View File

@ -375,7 +375,7 @@ a = b if """
# Another use case
data = yaml.load("""\
a: 1
@@ -77,19 +106,23 @@
@@ -77,10 +106,12 @@
b: 2
""",
)
@ -390,19 +390,7 @@ a = b if """
MULTILINE = """
foo
""".replace("\n", "")
-generated_readme = lambda project_name: """
+generated_readme = lambda project_name: (
+ """
{}
<Add content here!>
""".strip().format(project_name)
+)
parser.usage += """
Custom extra help summary.
@@ -156,16 +189,24 @@
@@ -156,16 +187,24 @@
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
""" % (_C.__init__.__code__.co_firstlineno + 1,)
@ -433,7 +421,7 @@ a = b if """
[
"""cow
moos""",
@@ -206,7 +247,9 @@
@@ -206,7 +245,9 @@
"c"
)
@ -444,7 +432,7 @@ a = b if """
assert some_var == expected_result, """
test
@@ -224,10 +267,8 @@
@@ -224,10 +265,8 @@
"""Sxxxxxxx xxxxxxxx, xxxxxxx xx xxxxxxxxx
xxxxxxxxxxxxx xxxxxxx xxxxxxxxx xxx-xxxxxxxxxx xxxxxx xx xxx-xxxxxx"""
),
@ -457,7 +445,7 @@ a = b if """
},
}
@@ -246,14 +287,12 @@
@@ -246,14 +285,12 @@
a
a"""
),
@ -597,13 +585,11 @@ data = yaml.load(
MULTILINE = """
foo
""".replace("\n", "")
generated_readme = lambda project_name: (
"""
generated_readme = lambda project_name: """
{}
<Add content here!>
""".strip().format(project_name)
)
parser.usage += """
Custom extra help summary.

View File

@ -913,7 +913,27 @@ if 1:
):
pass
@@ -218,71 +200,79 @@
@@ -156,7 +138,8 @@
*x: x
)
-lambda: ( # comment
+lambda: (
+ # comment
x
)
@@ -184,7 +167,8 @@
(
lambda: # comment
- ( # comment
+ (
+ # comment
x
)
)
@@ -218,71 +202,79 @@
# Leading
lambda x: (
@ -1052,7 +1072,7 @@ if 1:
# Regression tests for https://github.com/astral-sh/ruff/issues/8179
@@ -291,9 +281,9 @@
@@ -291,9 +283,9 @@
c,
d,
e,
@ -1065,7 +1085,7 @@ if 1:
)
@@ -302,15 +292,9 @@
@@ -302,15 +294,9 @@
c,
d,
e,
@ -1084,7 +1104,7 @@ if 1:
g=10,
)
@@ -320,9 +304,9 @@
@@ -320,9 +306,9 @@
c,
d,
e,
@ -1097,7 +1117,7 @@ if 1:
)
@@ -338,9 +322,9 @@
@@ -338,9 +324,9 @@
class C:
function_dict: Dict[Text, Callable[[CRFToken], Any]] = {
@ -1110,7 +1130,7 @@ if 1:
}
@@ -352,42 +336,40 @@
@@ -352,42 +338,40 @@
def foo():
if True:
if True:
@ -1169,7 +1189,7 @@ if 1:
CREATE TABLE {table} AS
SELECT ROW_NUMBER() OVER () AS id, {var}
FROM (
@@ -408,12 +390,12 @@
@@ -408,12 +392,12 @@
# 6
)
@ -1186,7 +1206,7 @@ if 1:
)
very_long_variable_name_x, very_long_variable_name_y = (
@@ -421,8 +403,8 @@
@@ -421,8 +405,8 @@
lambda b: b * another_very_long_expression_here,
)
@ -1197,19 +1217,4 @@ if 1:
x, more_args, additional_parameters
)
)
@@ -433,9 +415,11 @@
if 3:
if self.location in EVM_EVMLIKE_LOCATIONS and database is not None:
exported_dict["notes"] = EVM_ADDRESS_REGEX.sub(
- repl=lambda matched_address: self._maybe_add_label_with_address(
- database=database,
- matched_address=matched_address,
+ repl=lambda matched_address: (
+ self._maybe_add_label_with_address(
+ database=database,
+ matched_address=matched_address,
+ )
),
string=exported_dict["notes"],
)
```

View File

@ -111,15 +111,16 @@ generated_readme = (
```diff
--- Stable
+++ Preview
@@ -44,8 +44,8 @@
@@ -44,10 +44,8 @@
# this by changing `Lambda::needs_parentheses` to return `BestFit` but it causes
# issues when the lambda has comments.
# Let's keep this as a known deviation for now.
-generated_readme = (
- lambda project_name: """
+generated_readme = lambda project_name: (
+ """
+generated_readme = lambda project_name: """
{}
<Add content here!>
""".strip().format(project_name)
-)
```