alejandra 1.5.0

The Uncompromising Nix Code Formatter
Documentation
use std::collections::LinkedList;

pub(crate) enum Trivia {
    Comment(String),
    Newlines(usize),
}

pub(crate) struct Child {
    pub element: rnix::SyntaxElement,

    pub inline_comment:     Option<String>,
    pub has_inline_comment: bool,

    pub trivialities:     LinkedList<Trivia>,
    pub has_comments:     bool,
    pub has_trivialities: bool,
}

pub(crate) fn new(
    build_ctx: &crate::builder::BuildCtx,
    node: &rnix::SyntaxNode,
) -> std::collections::linked_list::IntoIter<Child> {
    let mut children = crate::children::Children::new(build_ctx, node);

    let mut elements = LinkedList::new();

    while let Some(element) = children.get_next() {
        let mut inline_comment = None;
        let mut trivialities = LinkedList::new();

        let mut skip_next_newline = false;
        children.drain_trivia(|element| match element {
            crate::children::Trivia::Comment(text) => {
                if inline_comment.is_none()
                    && trivialities.is_empty()
                    && text.starts_with('#')
                {
                    inline_comment = Some(text);
                    skip_next_newline = true;
                } else {
                    trivialities.push_back(Trivia::Comment(text));
                }
            }
            crate::children::Trivia::Whitespace(text) => {
                let mut newlines = crate::utils::count_newlines(&text);

                if skip_next_newline && newlines > 0 {
                    newlines -= 1;
                    skip_next_newline = false;
                }

                if newlines > 0 {
                    trivialities.push_back(Trivia::Newlines(newlines))
                }
            }
        });

        let has_inline_comment = inline_comment.is_some();
        let has_comments = trivialities
            .iter()
            .any(|trivia| matches!(trivia, Trivia::Comment(_)));
        let has_trivialities = !trivialities.is_empty();

        elements.push_back(Child {
            element,

            inline_comment,
            has_inline_comment,

            trivialities,
            has_comments,
            has_trivialities,
        })
    }

    elements.into_iter()
}