mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-28 21:05:08 +00:00
Align formatting of patterns in match-cases with expression formatting in clause headers (#13510)
This commit is contained in:
parent
d7ffe46054
commit
8012707348
12 changed files with 1608 additions and 40 deletions
|
@ -4,7 +4,9 @@ use ruff_python_ast::MatchCase;
|
|||
|
||||
use crate::builders::parenthesize_if_expands;
|
||||
use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses, Parentheses};
|
||||
use crate::pattern::maybe_parenthesize_pattern;
|
||||
use crate::prelude::*;
|
||||
use crate::preview::is_match_case_parentheses_enabled;
|
||||
use crate::statement::clause::{clause_body, clause_header, ClauseHeader};
|
||||
use crate::statement::suite::SuiteKind;
|
||||
|
||||
|
@ -34,6 +36,32 @@ impl FormatNodeRule<MatchCase> for FormatMatchCase {
|
|||
let comments = f.context().comments().clone();
|
||||
let dangling_item_comments = comments.dangling(item);
|
||||
|
||||
let format_pattern = format_with(|f| {
|
||||
if is_match_case_parentheses_enabled(f.context()) {
|
||||
maybe_parenthesize_pattern(pattern, item).fmt(f)
|
||||
} else {
|
||||
let has_comments =
|
||||
comments.has_leading(pattern) || comments.has_trailing_own_line(pattern);
|
||||
|
||||
if has_comments {
|
||||
pattern.format().with_options(Parentheses::Always).fmt(f)
|
||||
} else {
|
||||
match pattern.needs_parentheses(item.as_any_node_ref(), f.context()) {
|
||||
OptionalParentheses::Multiline => parenthesize_if_expands(
|
||||
&pattern.format().with_options(Parentheses::Never),
|
||||
)
|
||||
.fmt(f),
|
||||
OptionalParentheses::Always => {
|
||||
pattern.format().with_options(Parentheses::Always).fmt(f)
|
||||
}
|
||||
OptionalParentheses::Never | OptionalParentheses::BestFit => {
|
||||
pattern.format().with_options(Parentheses::Never).fmt(f)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
write!(
|
||||
f,
|
||||
[
|
||||
|
@ -41,32 +69,7 @@ impl FormatNodeRule<MatchCase> for FormatMatchCase {
|
|||
ClauseHeader::MatchCase(item),
|
||||
dangling_item_comments,
|
||||
&format_with(|f| {
|
||||
write!(f, [token("case"), space()])?;
|
||||
|
||||
let has_comments = comments.has_leading(pattern)
|
||||
|| comments.has_trailing_own_line(pattern);
|
||||
|
||||
if has_comments {
|
||||
pattern.format().with_options(Parentheses::Always).fmt(f)?;
|
||||
} else {
|
||||
match pattern.needs_parentheses(item.as_any_node_ref(), f.context()) {
|
||||
OptionalParentheses::Multiline => {
|
||||
parenthesize_if_expands(
|
||||
&pattern.format().with_options(Parentheses::Never),
|
||||
)
|
||||
.fmt(f)?;
|
||||
}
|
||||
OptionalParentheses::Always => {
|
||||
pattern.format().with_options(Parentheses::Always).fmt(f)?;
|
||||
}
|
||||
OptionalParentheses::Never => {
|
||||
pattern.format().with_options(Parentheses::Never).fmt(f)?;
|
||||
}
|
||||
OptionalParentheses::BestFit => {
|
||||
pattern.format().with_options(Parentheses::Never).fmt(f)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
write!(f, [token("case"), space(), format_pattern])?;
|
||||
|
||||
if let Some(guard) = guard {
|
||||
write!(f, [space(), token("if"), space(), guard.format()])?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue