From f037ea52662d75388485c9954ce7e071877a6832 Mon Sep 17 00:00:00 2001 From: Xi Xiao Date: Tue, 11 Mar 2025 19:16:57 +0200 Subject: [PATCH] fix: #67 idempotent format issue --- src/context.rs | 12 ++++++++++-- src/utility.rs | 6 ++++++ tests/to-do/twice_format_issue3.in | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/to-do/twice_format_issue3.in diff --git a/src/context.rs b/src/context.rs index 531d8b05..b698a41d 100644 --- a/src/context.rs +++ b/src/context.rs @@ -114,6 +114,10 @@ impl Comment { self.metadata.has_empty_line_above } + pub fn has_prev_node_else_keyword(&self) -> bool { + self.metadata.has_prev_node_else_keyword + } + pub fn is_followed_by_bracket_composite_node(&self) -> bool { self.metadata.is_followed_by_bracket_composite_node } @@ -163,22 +167,25 @@ pub struct CommentMetadata { has_empty_line_above: bool, has_empty_line_below: bool, has_prev_node: bool, + has_prev_node_else_keyword: bool, is_followed_by_bracket_composite_node: bool, } impl CommentMetadata { pub fn from(node: &Node, comment_type: CommentType) -> Self { let prev = node.prev_named_sibling(); - let next = node.next_named_sibling(); - let has_prev_node = prev.is_some(); + let prev_unnamed = node.prev_sibling(); + let has_prev_node_else_keyword = prev_unnamed.map(|n| n.kind() == "else").unwrap_or(false); + let has_leading_content = if let Some(prev_node) = prev { node.start_position().row == prev_node.end_position().row } else { false }; + let next = node.next_named_sibling(); let has_trailing_content = match comment_type { CommentType::Line => false, CommentType::Block => { @@ -214,6 +221,7 @@ impl CommentMetadata { has_empty_line_above, has_empty_line_below, has_prev_node, + has_prev_node_else_keyword, is_followed_by_bracket_composite_node, } } diff --git a/src/utility.rs b/src/utility.rs index bcf09095..dc08b324 100644 --- a/src/utility.rs +++ b/src/utility.rs @@ -357,7 +357,13 @@ pub fn handle_pre_comments<'a>( // if it's in group(), then multi-line mode is selected in fits() // otherwise, do nothing docs.push(b.force_break()); + // 1st element heading logic is handled in the preceding node; + // except the preceding is an unnamed node like `else` + if comment.has_prev_node_else_keyword() { + docs.push(b.nl()); + } + if i != 0 { if comment.has_newline_above() { docs.push(b.empty_new_line()); diff --git a/tests/to-do/twice_format_issue3.in b/tests/to-do/twice_format_issue3.in new file mode 100644 index 00000000..1fbf6c90 --- /dev/null +++ b/tests/to-do/twice_format_issue3.in @@ -0,0 +1,7 @@ +class TestClass { + { + if (true) + // comment 1 + {} + } +}