From 3cd991101465064211094ee372a9b1a59fe1d63e Mon Sep 17 00:00:00 2001 From: Kevin Amado Date: Tue, 1 Mar 2022 14:50:27 -0500 Subject: [PATCH] feat: even more simplification --- src/alejandra_engine/src/builder.rs | 2 +- src/alejandra_engine/src/children.rs | 88 ++++++++++++------- .../src/rules/inherit_from.rs | 6 -- src/alejandra_engine/src/rules/key_value.rs | 2 + src/alejandra_engine/src/rules/mod.rs | 1 - src/alejandra_engine/src/rules/paren.rs | 31 ------- src/alejandra_engine/tests/cases/key_value/in | 1 + .../tests/cases/key_value/out | 1 + 8 files changed, 63 insertions(+), 69 deletions(-) delete mode 100644 src/alejandra_engine/src/rules/inherit_from.rs diff --git a/src/alejandra_engine/src/builder.rs b/src/alejandra_engine/src/builder.rs index 2d8aefe..915f590 100644 --- a/src/alejandra_engine/src/builder.rs +++ b/src/alejandra_engine/src/builder.rs @@ -191,7 +191,7 @@ fn format( rnix::SyntaxKind::NODE_INHERIT => crate::rules::inherit::rule, // ( a ) rnix::SyntaxKind::NODE_INHERIT_FROM => { - crate::rules::inherit_from::rule + crate::rules::paren::rule } rnix::SyntaxKind::NODE_KEY => crate::rules::default, // a = b; diff --git a/src/alejandra_engine/src/children.rs b/src/alejandra_engine/src/children.rs index 6675d2a..413f016 100644 --- a/src/alejandra_engine/src/children.rs +++ b/src/alejandra_engine/src/children.rs @@ -26,42 +26,70 @@ impl Children { }; for child in node.children_with_tokens() { - match child { - rnix::SyntaxElement::Node(node) => { - children.push(node.clone().into()); + let text: String = child.to_string(); - if pos.is_some() { - pos.as_mut().unwrap().update(&node.text().to_string()); - } - } - rnix::SyntaxElement::Token(token) => { - match token.kind() { - rnix::SyntaxKind::TOKEN_COMMENT => { - children.push( - crate::builder::make_isolated_token( - rnix::SyntaxKind::TOKEN_COMMENT, - &dedent_comment( - pos.as_ref().unwrap(), - token.text(), - ), - ) - .into(), - ); - } - rnix::SyntaxKind::TOKEN_WHITESPACE => { - if crate::utils::count_newlines(token.text()) > 0 { - children.push(token.clone().into()); - } - } - _ => { - children.push(token.clone().into()); + match child.kind() { + rnix::SyntaxKind::NODE_PAREN => { + let mut simplified = child.into_node().unwrap(); + + while matches!( + simplified.kind(), + rnix::SyntaxKind::NODE_PAREN + ) { + let mut children = + crate::children2::new(build_ctx, &simplified); + + let opener = children.next().unwrap(); + let expression = children.next().unwrap(); + let closer = children.next().unwrap(); + + if !opener.has_inline_comment + && !opener.has_comments + && !expression.has_inline_comment + && !expression.has_comments + && !closer.has_inline_comment + && !closer.has_comments + && matches!( + expression.element.kind(), + rnix::SyntaxKind::NODE_ATTR_SET + | rnix::SyntaxKind::NODE_IDENT + | rnix::SyntaxKind::NODE_LIST + | rnix::SyntaxKind::NODE_LITERAL + | rnix::SyntaxKind::NODE_PAREN + | rnix::SyntaxKind::NODE_PATH_WITH_INTERPOL + | rnix::SyntaxKind::NODE_STRING + ) + { + simplified = + expression.element.into_node().unwrap(); + } else { + break; } } - if pos.is_some() { - pos.as_mut().unwrap().update(token.text()); + children.push(simplified.into()); + } + rnix::SyntaxKind::TOKEN_COMMENT => { + children.push( + crate::builder::make_isolated_token( + rnix::SyntaxKind::TOKEN_COMMENT, + &dedent_comment(pos.as_ref().unwrap(), &text), + ) + .into(), + ); + } + rnix::SyntaxKind::TOKEN_WHITESPACE => { + if crate::utils::count_newlines(&text) > 0 { + children.push(child); } } + _ => { + children.push(child); + } + } + + if pos.is_some() { + pos.as_mut().unwrap().update(&text); } } diff --git a/src/alejandra_engine/src/rules/inherit_from.rs b/src/alejandra_engine/src/rules/inherit_from.rs deleted file mode 100644 index cc41c1b..0000000 --- a/src/alejandra_engine/src/rules/inherit_from.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub(crate) fn rule( - build_ctx: &crate::builder::BuildCtx, - node: &rnix::SyntaxNode, -) -> std::collections::LinkedList { - crate::rules::paren::rule_with_configuration(build_ctx, node, false) -} diff --git a/src/alejandra_engine/src/rules/key_value.rs b/src/alejandra_engine/src/rules/key_value.rs index fee527a..b8494f9 100644 --- a/src/alejandra_engine/src/rules/key_value.rs +++ b/src/alejandra_engine/src/rules/key_value.rs @@ -55,6 +55,8 @@ pub(crate) fn rule( // peek: expr let child_expr = children.get_next().unwrap(); + + // Superfluous parens can be removed: `a = (x);` -> `a = x;` let child_expr = if matches!(child_expr.kind(), rnix::SyntaxKind::NODE_PAREN) { let mut children: Vec = diff --git a/src/alejandra_engine/src/rules/mod.rs b/src/alejandra_engine/src/rules/mod.rs index 016b518..f8ed50a 100644 --- a/src/alejandra_engine/src/rules/mod.rs +++ b/src/alejandra_engine/src/rules/mod.rs @@ -4,7 +4,6 @@ pub(crate) mod bin_op; pub(crate) mod dynamic; pub(crate) mod if_else; pub(crate) mod inherit; -pub(crate) mod inherit_from; pub(crate) mod key_value; pub(crate) mod lambda; pub(crate) mod let_in; diff --git a/src/alejandra_engine/src/rules/paren.rs b/src/alejandra_engine/src/rules/paren.rs index 00c48c9..9792a85 100644 --- a/src/alejandra_engine/src/rules/paren.rs +++ b/src/alejandra_engine/src/rules/paren.rs @@ -1,14 +1,6 @@ pub(crate) fn rule( build_ctx: &crate::builder::BuildCtx, node: &rnix::SyntaxNode, -) -> std::collections::LinkedList { - rule_with_configuration(build_ctx, node, true) -} - -pub(crate) fn rule_with_configuration( - build_ctx: &crate::builder::BuildCtx, - node: &rnix::SyntaxNode, - simplify: bool, ) -> std::collections::LinkedList { let mut steps = std::collections::LinkedList::new(); @@ -18,29 +10,6 @@ pub(crate) fn rule_with_configuration( let expression = children.next().unwrap(); let closer = children.next().unwrap(); - // Simplify this expression - if simplify - && !opener.has_inline_comment - && !opener.has_comments - && !expression.has_inline_comment - && !expression.has_comments - && !closer.has_inline_comment - && !closer.has_comments - && matches!( - expression.element.kind(), - rnix::SyntaxKind::NODE_ATTR_SET - | rnix::SyntaxKind::NODE_IDENT - | rnix::SyntaxKind::NODE_LIST - | rnix::SyntaxKind::NODE_LITERAL - | rnix::SyntaxKind::NODE_PAREN - | rnix::SyntaxKind::NODE_PATH_WITH_INTERPOL - | rnix::SyntaxKind::NODE_STRING - ) - { - steps.push_back(crate::builder::Step::Format(expression.element)); - return steps; - } - let vertical = opener.has_inline_comment || opener.has_trivialities || expression.has_inline_comment diff --git a/src/alejandra_engine/tests/cases/key_value/in b/src/alejandra_engine/tests/cases/key_value/in index 75c2bf9..1b58a06 100644 --- a/src/alejandra_engine/tests/cases/key_value/in +++ b/src/alejandra_engine/tests/cases/key_value/in @@ -1,6 +1,7 @@ rec /**/ { a = (((4))); + a = (((a: b))); a = {a = 1 ;}; diff --git a/src/alejandra_engine/tests/cases/key_value/out b/src/alejandra_engine/tests/cases/key_value/out index 8a9f4a8..01cbc97 100644 --- a/src/alejandra_engine/tests/cases/key_value/out +++ b/src/alejandra_engine/tests/cases/key_value/out @@ -2,6 +2,7 @@ rec /**/ { a = 4; + a = a: b; a = {a = 1;};