From 595a59c3655faa39c3d4ca03e897110872f812f2 Mon Sep 17 00:00:00 2001 From: Kevin Amado Date: Sun, 6 Feb 2022 22:24:53 -0500 Subject: [PATCH] feat: keep lists new lines --- src/rules/attr_set.rs | 20 ++++----- src/rules/let_in.rs | 2 - src/rules/list.rs | 49 ++++++++++++-------- tests/cases/attr_set/in | 34 ++++++++++++++ tests/cases/attr_set/out | 34 ++++++++++++++ tests/cases/comment/out | 11 +++++ tests/cases/lists/in | 46 +++++++++++++++++++ tests/cases/lists/out | 96 ++++++++++++++++++++++++++++++++++++++++ tests/cases/pat_bind/out | 1 + tests/cases/pattern/out | 2 + tests/cases/string/out | 1 + 11 files changed, 264 insertions(+), 32 deletions(-) create mode 100644 tests/cases/lists/in create mode 100644 tests/cases/lists/out diff --git a/src/rules/attr_set.rs b/src/rules/attr_set.rs index 4504185..8b5dc2b 100644 --- a/src/rules/attr_set.rs +++ b/src/rules/attr_set.rs @@ -9,13 +9,20 @@ pub fn rule( ); let items_count = node - .children() + .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 + }) .filter(|element| { matches!( element.kind(), rnix::SyntaxKind::NODE_KEY_VALUE | rnix::SyntaxKind::NODE_INHERIT | rnix::SyntaxKind::NODE_INHERIT_FROM + | rnix::SyntaxKind::TOKEN_COMMENT ) }) .count(); @@ -66,16 +73,6 @@ pub fn rule( crate::config::Layout::Wide => {} } - // /**/ - 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(_) => {} - }); - let mut item_index: usize = 0; loop { @@ -85,6 +82,7 @@ pub fn rule( steps.push_back(crate::builder::Step::NewLine); steps.push_back(crate::builder::Step::Pad); steps.push_back(crate::builder::Step::Comment(text)); + item_index += 1; } crate::children::DrainCommentOrNewline::Newline(_) => { if item_index > 0 && item_index < items_count { diff --git a/src/rules/let_in.rs b/src/rules/let_in.rs index 7dd76fa..a9a5e07 100644 --- a/src/rules/let_in.rs +++ b/src/rules/let_in.rs @@ -77,8 +77,6 @@ pub fn rule( } children.move_next(); - } else { - break; } } diff --git a/src/rules/list.rs b/src/rules/list.rs index 9625851..f626538 100644 --- a/src/rules/list.rs +++ b/src/rules/list.rs @@ -4,9 +4,19 @@ 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 layout = if children.has_comments() { + let items_count = node + .children_with_tokens() + .filter(|element| { + !matches!(element.kind(), rnix::SyntaxKind::TOKEN_WHITESPACE) + }) + .count() + - 2; + + let layout = if children.has_comments() || children.has_newlines() { &crate::config::Layout::Tall } else { build_ctx.config.layout() @@ -22,24 +32,34 @@ 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)); + item_index += 1; + } + 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_SQUARE_B_CLOSE = kind + if let rnix::SyntaxKind::TOKEN_SQUARE_B_CLOSE = child.element.kind() { break; } // item + item_index += 1; match layout { crate::config::Layout::Tall => { steps.push_back(crate::builder::Step::NewLine); @@ -56,18 +76,9 @@ pub fn rule( } children.move_next(); - } else { - break; } } - // /**/ - 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)); - }); - // ] let child = children.get_next().unwrap(); match layout { diff --git a/tests/cases/attr_set/in b/tests/cases/attr_set/in index 2a42177..8b55224 100644 --- a/tests/cases/attr_set/in +++ b/tests/cases/attr_set/in @@ -2,6 +2,8 @@ {} {/*a*/} {a=1;} + {a=1; + } { b=1; } { b=1; /*c*/ } @@ -18,4 +20,36 @@ rec /*a*/ { /*b*/ c=1; /*d*/ } {a=rec {a={a=rec {a={a=rec {a={a=rec {a={a=rec {a={};};};};};};};};};};} + + rec { + + c=1; + + + e=1; + + + } + + rec + /*a*/ + { + + + /*b*/ + + + c=1; + + + /*d*/ + + + e=1; + + + /*f*/ + + + } ] diff --git a/tests/cases/attr_set/out b/tests/cases/attr_set/out index 5d8211e..ab1c249 100644 --- a/tests/cases/attr_set/out +++ b/tests/cases/attr_set/out @@ -6,6 +6,10 @@ */ } { a = 1; } + { + a = 1; + } + { b = 1; } { b = 1; @@ -28,6 +32,7 @@ c */ } + rec { c = 1; } rec { c = 1; @@ -90,6 +95,7 @@ d */ } + { a = rec { a = { @@ -101,4 +107,32 @@ }; }; } + + rec { + c = 1; + + e = 1; + } + + rec + /* + a + */ + { + /* + b + */ + + c = 1; + + /* + d + */ + + e = 1; + + /* + f + */ + } ] diff --git a/tests/cases/comment/out b/tests/cases/comment/out index fea61d8..dbeb4e0 100644 --- a/tests/cases/comment/out +++ b/tests/cases/comment/out @@ -1,38 +1,49 @@ [ /**/ /**/ + /**/ + /**/ + /**/ + /**/ + /* @ */ + /* * @ * */ + /* @ @ @ */ + /* @ @ @ */ + /* @ @ @ */ + /* @ @ @ */ + /* test * test diff --git a/tests/cases/lists/in b/tests/cases/lists/in new file mode 100644 index 0000000..bf96dfb --- /dev/null +++ b/tests/cases/lists/in @@ -0,0 +1,46 @@ +[ + [ 1 ] + + [ 1 + ] + + [ b d ] + [ b d /*e*/ ] + [ b /*c*/ d ] + [ b /*c*/ d /*e*/ ] + [ /*a*/ b d ] + [ /*a*/ b d /*e*/ ] + [ /*a*/ b /*c*/ d ] + [ /*a*/ b /*c*/ d /*e*/ ] + + [ + + + b + + + d + + + ] + [ + + + /*a*/ + + + b + + + /*c*/ + + + d + + + /*e*/ + + + ] + +] diff --git a/tests/cases/lists/out b/tests/cases/lists/out new file mode 100644 index 0000000..f97478d --- /dev/null +++ b/tests/cases/lists/out @@ -0,0 +1,96 @@ +[ + [ 1 ] + + [ + 1 + ] + + [ b d ] + [ + b + d + /* + e + */ + ] + [ + b + /* + c + */ + d + ] + [ + b + /* + c + */ + d + /* + e + */ + ] + [ + /* + a + */ + b + d + ] + [ + /* + a + */ + b + d + /* + e + */ + ] + [ + /* + a + */ + b + /* + c + */ + d + ] + [ + /* + a + */ + b + /* + c + */ + d + /* + e + */ + ] + + [ + b + + d + ] + [ + /* + a + */ + + b + + /* + c + */ + + d + + /* + e + */ + ] +] diff --git a/tests/cases/pat_bind/out b/tests/cases/pat_bind/out index 89000ab..b484bcb 100644 --- a/tests/cases/pat_bind/out +++ b/tests/cases/pat_bind/out @@ -20,6 +20,7 @@ a: _ ) + (a @ { }: _) ( a @ diff --git a/tests/cases/pattern/out b/tests/cases/pattern/out index a3da858..a09a076 100644 --- a/tests/cases/pattern/out +++ b/tests/cases/pattern/out @@ -26,6 +26,7 @@ }: _ ) + ( { b , e @@ -1050,6 +1051,7 @@ }: _ ) + ({ a ? null }: _) ( { /* diff --git a/tests/cases/string/out b/tests/cases/string/out index a65d364..4c6f927 100644 --- a/tests/cases/string/out +++ b/tests/cases/string/out @@ -29,6 +29,7 @@ '' a '' ### + '' a '' ###