use crate::parser::CstDocument;
use crate::syntax::SyntaxNode;
#[must_use]
pub fn print(doc: &CstDocument) -> String {
print_node(&doc.root())
}
#[must_use]
pub fn print_node(node: &SyntaxNode) -> String {
node.text()
}
#[cfg(test)]
mod tests {
use super::*;
use crate::parser::parse;
fn assert_roundtrip(src: &str) {
let doc = parse(src);
assert_eq!(print(&doc), src, "round-trip identity for {src:?}");
}
fn assert_idempotent(src: &str) {
let first = print(&parse(src));
let second = print(&parse(&first));
assert_eq!(second, first, "idempotent print for {src:?}");
}
#[test]
fn round_trip_identity() {
for src in [
"",
" ",
"// c\n",
"Foo(x: 1, y: 2.0) // trailing\n",
"[1, 2, 3,]",
"{ 'a': 1, 2: \"b\", }",
"r#\"raw\"#",
"#![enable(implicit_some)]\nSome(())",
"\u{FEFF}true",
"1\r\n2",
] {
assert_roundtrip(src);
}
}
#[test]
fn idempotent_print() {
for src in [
"Foo(x: 1)",
"[1, 2, 3]",
"{ \"k\": 'v' }",
"#![enable(implicit_some)]\nSome(5)",
" spaced out ",
] {
assert_idempotent(src);
}
}
}