diff --git a/CHANGELOG.md b/CHANGELOG.md index ee590d0..323f26c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,15 @@ Types of changes + then v x.${a} y.${a} # both have attr, use merge func + else x.${a} # only x has attr ``` +- Inline comments support for `inherit` expressions: + ```diff + inherit + (callPackage ../development/tools/ocaml/ocamlformat {}) + - ocamlformat + - # latest version + + ocamlformat # latest version + ocamlformat_0_11_0 + ``` ### Changed diff --git a/src/alejandra_engine/src/rules/paren.rs b/src/alejandra_engine/src/rules/paren.rs index c8fa951..9792a85 100644 --- a/src/alejandra_engine/src/rules/paren.rs +++ b/src/alejandra_engine/src/rules/paren.rs @@ -4,60 +4,76 @@ pub(crate) 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::children2::new(build_ctx, node); - let has_comments_or_newlines = - children.has_comments() || children.has_newlines(); + let opener = children.next().unwrap(); + let expression = children.next().unwrap(); + let closer = children.next().unwrap(); - let vertical = has_comments_or_newlines || build_ctx.vertical; + let vertical = opener.has_inline_comment + || opener.has_trivialities + || expression.has_inline_comment + || expression.has_trivialities + || closer.has_inline_comment + || closer.has_trivialities; - // ( - let child = children.get_next().unwrap(); - steps.push_back(crate::builder::Step::Format(child)); - if vertical && has_comments_or_newlines { + // opener + steps.push_back(crate::builder::Step::Format(opener.element)); + if vertical { steps.push_back(crate::builder::Step::Indent); } - // /**/ - 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)); - } - crate::children::Trivia::Whitespace(_) => {} - }); - - // expr - let child = children.get_next().unwrap(); - if vertical { - if has_comments_or_newlines { - steps.push_back(crate::builder::Step::NewLine); - steps.push_back(crate::builder::Step::Pad); - } - steps.push_back(crate::builder::Step::FormatWider(child)); - } else { - steps.push_back(crate::builder::Step::Format(child)); + if let Some(text) = opener.inline_comment { + steps.push_back(crate::builder::Step::Whitespace); + steps.push_back(crate::builder::Step::Comment(text)); + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); + } else if vertical { + steps.push_back(crate::builder::Step::NewLine); + steps.push_back(crate::builder::Step::Pad); } - // /**/ - 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)); + for trivia in opener.trivialities { + match trivia { + crate::children2::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::children2::Trivia::Newlines(_) => {} } - crate::children::Trivia::Whitespace(_) => {} - }); + } - // ) - let child = children.get_next().unwrap(); - if vertical && has_comments_or_newlines { + // expression + if vertical { + steps.push_back(crate::builder::Step::FormatWider(expression.element)); + } else { + steps.push_back(crate::builder::Step::Format(expression.element)); + } + + if let Some(text) = expression.inline_comment { + steps.push_back(crate::builder::Step::Whitespace); + steps.push_back(crate::builder::Step::Comment(text)); + } + + for trivia in expression.trivialities { + match trivia { + crate::children2::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)); + } + crate::children2::Trivia::Newlines(_) => {} + } + } + + // closer + if vertical { steps.push_back(crate::builder::Step::Dedent); steps.push_back(crate::builder::Step::NewLine); steps.push_back(crate::builder::Step::Pad); } - steps.push_back(crate::builder::Step::Format(child)); + steps.push_back(crate::builder::Step::Format(closer.element)); steps } diff --git a/src/alejandra_engine/tests/cases/paren/in b/src/alejandra_engine/tests/cases/paren/in index 2d677b2..ec1b51d 100644 --- a/src/alejandra_engine/tests/cases/paren/in +++ b/src/alejandra_engine/tests/cases/paren/in @@ -1,4 +1,7 @@ ( + ( # test + a # test + ) ( ( c ) ) ( ( c )/*e*/) ( ( c/*d*/) ) diff --git a/src/alejandra_engine/tests/cases/paren/out b/src/alejandra_engine/tests/cases/paren/out index 1074504..d7b2e21 100644 --- a/src/alejandra_engine/tests/cases/paren/out +++ b/src/alejandra_engine/tests/cases/paren/out @@ -1,4 +1,7 @@ ( + ( # test + a # test + ) ((c)) ( (c)