diff --git a/src/rules/attr_set.rs b/src/rules/attr_set.rs index 8458951..fd5eb2b 100644 --- a/src/rules/attr_set.rs +++ b/src/rules/attr_set.rs @@ -10,7 +10,7 @@ pub fn rule( &crate::config::Layout::Tall } else if node .children() - .filter(|node| match node.kind() { + .filter(|element| match element.kind() { rnix::SyntaxKind::NODE_KEY_VALUE | rnix::SyntaxKind::NODE_INHERIT | rnix::SyntaxKind::NODE_INHERIT_FROM => true, diff --git a/src/rules/pattern.rs b/src/rules/pattern.rs index 31bf5fe..e2876a5 100644 --- a/src/rules/pattern.rs +++ b/src/rules/pattern.rs @@ -6,7 +6,27 @@ pub fn rule( let mut children = crate::children::Children::new(build_ctx, node); - let layout = if children.has_comments() { + let has_comments = children.has_comments(); + let has_comments_between_curly_b = node + .children_with_tokens() + .skip_while(|element| { + element.kind() != rnix::SyntaxKind::TOKEN_CURLY_B_OPEN + }) + .take_while(|element| { + element.kind() != rnix::SyntaxKind::TOKEN_CURLY_B_CLOSE + }) + .any(|element| element.kind() == rnix::SyntaxKind::TOKEN_COMMENT); + + let items_count = node + .children_with_tokens() + .filter(|element| match element.kind() { + rnix::SyntaxKind::TOKEN_ELLIPSIS + | rnix::SyntaxKind::NODE_PAT_ENTRY => true, + _ => false, + }) + .count(); + + let layout = if has_comments { &crate::config::Layout::Tall } else { build_ctx.config.layout() @@ -20,8 +40,12 @@ pub fn rule( steps.push_back(crate::builder::Step::FormatWider( child.element, )); - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); + if !has_comments && items_count <= 1 { + steps.push_back(crate::builder::Step::Whitespace); + } else { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } } crate::config::Layout::Wide => { steps.push_back(crate::builder::Step::Format(child.element)); @@ -130,8 +154,12 @@ pub fn rule( let child = children.get_next().unwrap(); match layout { crate::config::Layout::Tall => { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); + if !has_comments_between_curly_b && items_count <= 1 { + steps.push_back(crate::builder::Step::Whitespace); + } else { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } } crate::config::Layout::Wide => { steps.push_back(crate::builder::Step::Whitespace); @@ -151,8 +179,12 @@ pub fn rule( if let rnix::SyntaxKind::NODE_PAT_BIND = child.element.kind() { match layout { crate::config::Layout::Tall => { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); + if !has_comments && items_count <= 1 { + steps.push_back(crate::builder::Step::Whitespace); + } else { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } steps.push_back(crate::builder::Step::FormatWider( child.element, )); diff --git a/tests/cases/pat_bind/out b/tests/cases/pat_bind/out index 344cf31..89000ab 100644 --- a/tests/cases/pat_bind/out +++ b/tests/cases/pat_bind/out @@ -1,23 +1,19 @@ [ ({ } @ a: _) ( - { - } - @ + { } @ /**/ a: _ ) ( - { - } + { } /**/ @ a: _ ) ( - { - } + { } /**/ @ /**/ @@ -28,16 +24,13 @@ ( a @ /**/ - { - }: + { }: _ ) ( a /**/ - @ - { - }: + @ { }: _ ) ( @@ -45,8 +38,7 @@ /**/ @ /**/ - { - }: + { }: _ ) ] diff --git a/tests/cases/pattern/in b/tests/cases/pattern/in index 439788f..7afd85b 100644 --- a/tests/cases/pattern/in +++ b/tests/cases/pattern/in @@ -1,5 +1,6 @@ [ ({}: _) + ({ a }: _) ({ /**/ }: _) ({ ... }: _) ({ ... /**/}: _) diff --git a/tests/cases/pattern/out b/tests/cases/pattern/out index e701f07..2f081af 100644 --- a/tests/cases/pattern/out +++ b/tests/cases/pattern/out @@ -1,5 +1,6 @@ [ ({ }: _) + ({ a }: _) ( { /**/ }: