From ce2826be98067111a57495fbf1cf33521d9cffa7 Mon Sep 17 00:00:00 2001 From: Kevin Amado Date: Mon, 28 Feb 2022 00:35:09 -0500 Subject: [PATCH] refactor: bin-op --- src/alejandra_engine/src/builder.rs | 5 +- src/alejandra_engine/src/parsers/bin_op.rs | 66 ++++++++++++++++ src/alejandra_engine/src/parsers/mod.rs | 1 + .../src/rules/bin_op_and_or_default.rs | 76 +++++++++---------- src/alejandra_engine/src/rules/mod.rs | 4 +- src/alejandra_engine/src/rules/string.rs | 2 +- 6 files changed, 109 insertions(+), 45 deletions(-) create mode 100644 src/alejandra_engine/src/parsers/bin_op.rs diff --git a/src/alejandra_engine/src/builder.rs b/src/alejandra_engine/src/builder.rs index becd99a..029b269 100644 --- a/src/alejandra_engine/src/builder.rs +++ b/src/alejandra_engine/src/builder.rs @@ -261,8 +261,9 @@ fn format( builder.finish_node(); } rnix::SyntaxElement::Token(token) => { - add_token(builder, build_ctx, kind, token.text()); - build_ctx.pos_old.update(token.text()); + let text = token.text(); + add_token(builder, build_ctx, kind, text); + build_ctx.pos_old.update(text); } } } diff --git a/src/alejandra_engine/src/parsers/bin_op.rs b/src/alejandra_engine/src/parsers/bin_op.rs new file mode 100644 index 0000000..3087294 --- /dev/null +++ b/src/alejandra_engine/src/parsers/bin_op.rs @@ -0,0 +1,66 @@ +use std::collections::LinkedList; + +#[derive(Debug)] +pub(crate) struct BinOp { + pub left_expression: rnix::SyntaxElement, + pub comments_before_operator: LinkedList, + pub has_newlines_before_operator: bool, + pub operator: rnix::SyntaxElement, + pub comments_after_operator: LinkedList, + pub has_newlines_after_operator: bool, + pub right_expression: rnix::SyntaxElement, +} + +impl BinOp { + pub(crate) fn parse( + build_ctx: &crate::builder::BuildCtx, + node: &rnix::SyntaxNode, + ) -> BinOp { + let mut children = crate::children::Children::new(build_ctx, node); + + // left_expression + let left_expression = children.get_next().unwrap(); + + // comments_before_operator + let mut comments_before_operator = LinkedList::new(); + let mut has_newlines_before_operator = false; + children.drain_trivia(|element| match element { + crate::children::Trivia::Comment(text) => { + comments_before_operator.push_back(text); + } + crate::children::Trivia::Whitespace(text) => { + has_newlines_before_operator = has_newlines_before_operator + || crate::utils::count_newlines(&text) > 0; + } + }); + + // operator + let operator = children.get_next().unwrap(); + + // comments_after_operator + let mut comments_after_operator = LinkedList::new(); + let mut has_newlines_after_operator = false; + children.drain_trivia(|element| match element { + crate::children::Trivia::Comment(text) => { + comments_after_operator.push_back(text); + } + crate::children::Trivia::Whitespace(text) => { + has_newlines_after_operator = has_newlines_after_operator + || crate::utils::count_newlines(&text) > 0; + } + }); + + // right_expression + let right_expression = children.get_next().unwrap(); + + BinOp { + left_expression, + comments_before_operator, + has_newlines_before_operator, + operator, + comments_after_operator, + has_newlines_after_operator, + right_expression, + } + } +} diff --git a/src/alejandra_engine/src/parsers/mod.rs b/src/alejandra_engine/src/parsers/mod.rs index 284ac4d..d8fb6bc 100644 --- a/src/alejandra_engine/src/parsers/mod.rs +++ b/src/alejandra_engine/src/parsers/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod apply; pub(crate) mod assert_or_with; +pub(crate) mod bin_op; pub(crate) mod if_else; pub(crate) mod pattern; diff --git a/src/alejandra_engine/src/rules/bin_op_and_or_default.rs b/src/alejandra_engine/src/rules/bin_op_and_or_default.rs index 7a3f936..ecac24c 100644 --- a/src/alejandra_engine/src/rules/bin_op_and_or_default.rs +++ b/src/alejandra_engine/src/rules/bin_op_and_or_default.rs @@ -12,16 +12,17 @@ pub(crate) fn rule_with_configuration( ) -> std::collections::LinkedList { let mut steps = std::collections::LinkedList::new(); - let mut children = crate::children::Children::new(build_ctx, node); + let parsed = crate::parsers::bin_op::BinOp::parse(build_ctx, node); - let vertical = children.has_comments() - || children.has_newlines() - || build_ctx.vertical; + let vertical = build_ctx.vertical + || !parsed.comments_before_operator.is_empty() + || parsed.has_newlines_before_operator + || !parsed.comments_after_operator.is_empty() + || parsed.has_newlines_after_operator; - // expr - let child = children.get_next().unwrap(); + // left_expression if vertical { - let kind = child.kind(); + let kind = parsed.left_expression.kind(); if (parent_kind == "bin_op_and_or_default" && matches!( @@ -32,58 +33,55 @@ pub(crate) fn rule_with_configuration( || (parent_kind == "select" && matches!(kind, rnix::SyntaxKind::NODE_SELECT)) { - steps.push_back(crate::builder::Step::Format(child)); + steps.push_back(crate::builder::Step::Format( + parsed.left_expression, + )); } else { - steps.push_back(crate::builder::Step::FormatWider(child)); + steps.push_back(crate::builder::Step::FormatWider( + parsed.left_expression, + )); } steps.push_back(crate::builder::Step::NewLine); steps.push_back(crate::builder::Step::Pad); } else { - steps.push_back(crate::builder::Step::Format(child)); + steps.push_back(crate::builder::Step::Format(parsed.left_expression)); } - // /**/ - children.drain_trivia(|element| match element { - crate::children::Trivia::Comment(text) => { - steps.push_back(crate::builder::Step::Comment(text)); - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - } - crate::children::Trivia::Whitespace(_) => {} - }); + // comments_before_operator + for text in parsed.comments_before_operator { + steps.push_back(crate::builder::Step::Comment(text)); + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } // operator - let child = children.get_next().unwrap(); if !vertical && parent_kind == "bin_op_and_or_default" { steps.push_back(crate::builder::Step::Whitespace); } - steps.push_back(crate::builder::Step::Format(child)); + steps.push_back(crate::builder::Step::Format(parsed.operator)); - // /**/ - let mut comment = false; - children.drain_trivia(|element| match element { - crate::children::Trivia::Comment(text) => { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - steps.push_back(crate::builder::Step::Comment(text)); - comment = true; + // comments_before_operator + if parsed.comments_after_operator.is_empty() { + if parent_kind == "bin_op_and_or_default" { + steps.push_back(crate::builder::Step::Whitespace); } - crate::children::Trivia::Whitespace(_) => {} - }); - - if comment { + } else { steps.push_back(crate::builder::Step::NewLine); steps.push_back(crate::builder::Step::Pad); - } else if parent_kind == "bin_op_and_or_default" { - steps.push_back(crate::builder::Step::Whitespace); + for text in parsed.comments_after_operator { + steps.push_back(crate::builder::Step::Comment(text)); + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } } - // expr - let child = children.get_next().unwrap(); + // right_expression if vertical { - steps.push_back(crate::builder::Step::FormatWider(child)); + steps.push_back(crate::builder::Step::FormatWider( + parsed.right_expression, + )); } else { - steps.push_back(crate::builder::Step::Format(child)); + steps.push_back(crate::builder::Step::Format(parsed.right_expression)); } steps diff --git a/src/alejandra_engine/src/rules/mod.rs b/src/alejandra_engine/src/rules/mod.rs index d02243d..971b12b 100644 --- a/src/alejandra_engine/src/rules/mod.rs +++ b/src/alejandra_engine/src/rules/mod.rs @@ -22,7 +22,5 @@ pub(crate) fn default( _: &crate::builder::BuildCtx, node: &rnix::SyntaxNode, ) -> std::collections::LinkedList { - node.children_with_tokens() - .map(|child| crate::builder::Step::Format(child)) - .collect() + node.children_with_tokens().map(crate::builder::Step::Format).collect() } diff --git a/src/alejandra_engine/src/rules/string.rs b/src/alejandra_engine/src/rules/string.rs index 558184f..a276204 100644 --- a/src/alejandra_engine/src/rules/string.rs +++ b/src/alejandra_engine/src/rules/string.rs @@ -27,7 +27,7 @@ pub(crate) fn rule( } } else { let elements: Vec = - children.get_remaining().iter().cloned().collect(); + children.get_remaining().to_vec(); let mut interpolations = elements .iter()