/* * Copyright (C) 2023 Riyyi * * SPDX-License-Identifier: MIT */ #include "ruc/format/print.h" #include "printer.h" #include "types.h" namespace blaze { Printer::Printer(ASTNode* node) : m_node(node) { } Printer::~Printer() { delete m_node; } // ----------------------------------------- void Printer::dump() { if (m_node == nullptr) { return; } dumpImpl(m_node); print("\n"); } void Printer::dumpImpl(ASTNode* node) { auto printSpacing = [this]() { if (!m_firstNode && !m_previousNodeIsList) { print(" "); } }; if (is(node)) { printSpacing(); print("("); m_firstNode = false; m_previousNodeIsList = true; List* list = static_cast(node); for (size_t i = 0; i < list->nodes().size(); ++i) { dumpImpl(list->nodes()[i]); m_previousNodeIsList = false; } print(")"); } else if (is(node)) { printSpacing(); print("\"{}\"", static_cast(node)->data()); } else if (is(node)) { printSpacing(); print("{}", static_cast(node)->number()); } else if (is(node)) { printSpacing(); print("{}", static_cast(node)->symbol()); } } } // namespace blaze