diff --git a/crates/ruff_python_formatter/src/expression/expr_lambda.rs b/crates/ruff_python_formatter/src/expression/expr_lambda.rs index c5890fba24..418db4641a 100644 --- a/crates/ruff_python_formatter/src/expression/expr_lambda.rs +++ b/crates/ruff_python_formatter/src/expression/expr_lambda.rs @@ -1,4 +1,4 @@ -use ruff_formatter::write; +use ruff_formatter::{RemoveSoftLinesBuffer, write}; use ruff_python_ast::AnyNodeRef; use ruff_python_ast::ExprLambda; use ruff_text_size::Ranged; @@ -7,6 +7,7 @@ use crate::comments::dangling_comments; use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses}; use crate::other::parameters::ParametersParentheses; use crate::prelude::*; +use crate::preview::is_force_single_line_lambda_parameters_enabled; #[derive(Default)] pub struct FormatExprLambda; @@ -37,12 +38,25 @@ impl FormatNodeRule for FormatExprLambda { write!(f, [dangling_comments(dangling_before_parameters)])?; } - write!( - f, - [parameters - .format() - .with_options(ParametersParentheses::Never)] - )?; + // Try to keep the parameters on a single line, unless there are intervening comments. + if is_force_single_line_lambda_parameters_enabled(f.context()) + && !comments.contains_comments(parameters.as_ref().into()) + { + let mut buffer = RemoveSoftLinesBuffer::new(f); + write!( + buffer, + [parameters + .format() + .with_options(ParametersParentheses::Never)] + )?; + } else { + write!( + f, + [parameters + .format() + .with_options(ParametersParentheses::Never)] + )?; + } write!(f, [token(":")])?; diff --git a/crates/ruff_python_formatter/src/preview.rs b/crates/ruff_python_formatter/src/preview.rs index 9d307390d6..9e95ad210b 100644 --- a/crates/ruff_python_formatter/src/preview.rs +++ b/crates/ruff_python_formatter/src/preview.rs @@ -52,3 +52,12 @@ pub(crate) const fn is_avoid_parens_for_long_as_captures_enabled( ) -> bool { context.is_preview() } + +/// Returns `true` if the +/// [`force_single_line_lambda_parameters`](https://github.com/astral-sh/ruff/pull/21385) preview +/// style is enabled. +pub(crate) const fn is_force_single_line_lambda_parameters_enabled( + context: &PyFormatContext, +) -> bool { + context.is_preview() +} diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap index 8eefc617b3..07d9e9e135 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap @@ -676,3 +676,65 @@ class C: else storage.Bucket(mock_service, destination_bucket_name) ) ``` + + +## Preview changes +```diff +--- Stable ++++ Preview +@@ -280,9 +280,7 @@ + ] # Trailing + # Trailing + +-lambda self, araa, kkkwargs=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( +- *args, **kwargs +-), e=1, f=2, g=2: d ++lambda self, araa, kkkwargs=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(*args, **kwargs), e=1, f=2, g=2: d + + + # Regression tests for https://github.com/astral-sh/ruff/issues/8179 +@@ -291,9 +289,9 @@ + c, + d, + e, +- f=lambda self, +- *args, +- **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(*args, **kwargs), ++ f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( ++ *args, **kwargs ++ ), + ) + + +@@ -302,15 +300,7 @@ + c, + d, + e, +- f=lambda self, +- araa, +- kkkwargs, +- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, +- args, +- kwargs, +- e=1, +- f=2, +- g=2: d, ++ f=lambda self, araa, kkkwargs, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, args, kwargs, e=1, f=2, g=2: d, + g=10, + ) + +@@ -320,9 +310,10 @@ + c, + d, + e, +- f=lambda self, +- *args, +- **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(*args, **kwargs) + 1, ++ f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( ++ *args, **kwargs ++ ) ++ + 1, + ) + + +```