From 8564225506f16ca93bed123c417da30402deafee Mon Sep 17 00:00:00 2001 From: Kevin Amado Date: Sun, 6 Feb 2022 20:51:22 -0500 Subject: [PATCH] feat: keep let-in new lines --- src/rules/let_in.rs | 53 +++++++++++++++++++++++------------------- tests/cases/let_in/in | 12 ++++++++++ tests/cases/let_in/out | 2 ++ 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/rules/let_in.rs b/src/rules/let_in.rs index 7aa5b01..7dd76fa 100644 --- a/src/rules/let_in.rs +++ b/src/rules/let_in.rs @@ -4,7 +4,9 @@ pub fn rule( ) -> std::collections::LinkedList { let mut steps = std::collections::LinkedList::new(); - let mut children = crate::children::Children::new(build_ctx, node); + let mut children = crate::children::Children::new_with_configuration( + build_ctx, node, true, + ); let items_count = node .children() @@ -16,9 +18,10 @@ pub fn rule( }) .count(); - let layout = if children.has_comments() { - &crate::config::Layout::Tall - } else if items_count > 1 { + let layout = if items_count > 1 + || children.has_comments() + || children.has_newlines() + { &crate::config::Layout::Tall } else { build_ctx.config.layout() @@ -34,24 +37,30 @@ pub fn rule( crate::config::Layout::Wide => {} } + let mut item_index: usize = 0; + loop { // /**/ - children.drain_comments(|text| { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - steps.push_back(crate::builder::Step::Comment(text)); + children.drain_comments_and_newlines(|element| match element { + crate::children::DrainCommentOrNewline::Comment(text) => { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + steps.push_back(crate::builder::Step::Comment(text)); + } + crate::children::DrainCommentOrNewline::Newline(_) => { + if item_index > 0 && item_index < items_count { + steps.push_back(crate::builder::Step::NewLine); + } + } }); if let Some(child) = children.peek_next() { - let kind = child.element.kind(); - - if let rnix::SyntaxKind::TOKEN_COMMENT - | rnix::SyntaxKind::TOKEN_IN = kind - { + if let rnix::SyntaxKind::TOKEN_IN = child.element.kind() { break; } // expr + item_index += 1; match layout { crate::config::Layout::Tall => { steps.push_back(crate::builder::Step::NewLine); @@ -73,13 +82,6 @@ pub fn rule( } } - // /**/ - children.drain_comments(|text| { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - steps.push_back(crate::builder::Step::Comment(text)); - }); - // in let child = children.get_next().unwrap(); let indent = build_ctx.pos_new.column > 1; @@ -104,10 +106,13 @@ pub fn rule( } // /**/ - children.drain_comments(|text| { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - steps.push_back(crate::builder::Step::Comment(text)); + children.drain_comments_and_newlines(|element| match element { + crate::children::DrainCommentOrNewline::Comment(text) => { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + steps.push_back(crate::builder::Step::Comment(text)); + } + crate::children::DrainCommentOrNewline::Newline(_) => {} }); // expr diff --git a/tests/cases/let_in/in b/tests/cases/let_in/in index c08f7f9..9051301 100644 --- a/tests/cases/let_in/in +++ b/tests/cases/let_in/in @@ -1,13 +1,19 @@ let + + /**/ a = let b=2; c=3; in d; /**/ a = let c=1; in f; + + /**/ a = let c=1; in /*e*/ f; /**/ a = let c=1; /*d*/ in f; /**/ + + a = let c=1; /*d*/ in /*e*/ f; /**/ a = let /*b*/ c=1; in f; @@ -18,6 +24,12 @@ let /**/ a = let /*b*/ c=1; /*d*/ in /*e*/ f; /**/ + + in + + /**/ + + a diff --git a/tests/cases/let_in/out b/tests/cases/let_in/out index 2f1583f..92dfc09 100644 --- a/tests/cases/let_in/out +++ b/tests/cases/let_in/out @@ -8,6 +8,7 @@ let d; /**/ a = let c = 1; in f; + /**/ a = let @@ -27,6 +28,7 @@ let in f; /**/ + a = let c = 1;