use crate::ast::ExprAst;
use super::{Printer, TokenKind};
pub(crate) fn print_expr_ast<T>(p: &mut Printer<'_>, ast: &ExprAst<T>) {
match ast {
ExprAst::Integer { value, .. } => p.emit(TokenKind::Number, &value.to_string()),
ExprAst::String { value, .. } => {
let mut buf = String::with_capacity(value.len() + 2);
buf.push('"');
buf.push_str(value);
buf.push('"');
p.emit(TokenKind::String, &buf);
}
ExprAst::Macro { text, .. } => p.emit(TokenKind::MacroRef, text),
ExprAst::Identifier { name, .. } => p.raw(name),
ExprAst::Paren { inner, .. } => {
p.raw_char('(');
print_expr_ast(p, inner);
p.raw_char(')');
}
ExprAst::Not { inner, .. } => {
p.emit(TokenKind::Operator, "!");
print_expr_ast(p, inner);
}
ExprAst::Binary { kind, lhs, rhs, .. } => {
print_expr_ast(p, lhs);
p.raw_char(' ');
p.emit(TokenKind::Operator, kind.as_str());
p.raw_char(' ');
print_expr_ast(p, rhs);
}
}
}