use super::{SyntaxElement, TokenKind, parse};
pub(super) fn meaning(source: &str) -> (Vec<String>, Vec<String>) {
let parsed = parse(source);
let mut tree = Vec::new();
let mut comments = Vec::new();
let mut stack = vec![SyntaxElement::Node(parsed.tree.root())];
while let Some(element) = stack.pop() {
match element {
SyntaxElement::Node(node) => {
tree.push(format!("{:?}", node.kind()));
let children: Vec<_> = node.children_with_tokens().collect();
stack.extend(children.into_iter().rev());
}
SyntaxElement::Token(token) => match token.kind() {
TokenKind::Comment | TokenKind::DocComment => {
comments.push(token.text().trim_end().to_owned());
}
TokenKind::Whitespace | TokenKind::Newline | TokenKind::Comma => {}
TokenKind::Pipe if tree.last().is_some_and(|last| last == "=") => {}
_ => tree.push(token.text().to_owned()),
},
}
}
(tree, comments)
}