#include "basic_printers.hpp" #include "error_handling.hpp" #include namespace printers { void print_modifier(const nodes::Modifier &modifier, Printer &printer) { switch (modifier) { case nodes::Modifier::OUT: printer.print(printer.print_words_instead_of_symbols() ? "out " : "-> "); break; case nodes::Modifier::IN: printer.print(printer.print_words_instead_of_symbols() ? "in " : "<- "); break; case nodes::Modifier::REF: printer.print(printer.print_words_instead_of_symbols() ? "ref " : "<> "); break; case nodes::Modifier::OR_FALSE: printer.print("?"); break; case nodes::Modifier::OR_RETURN: printer.print("!"); break; case nodes::Modifier::NONE: break; default: break; } } void print_literal(const nodes::Literal &literal, Printer &printer) { switch (literal.get_any()->index()) { case 0: // double // print in parseable form ?? printer.print(std::to_string(*literal.get().value())); return; case 1: // long long printer.print(std::to_string(*literal.get().value())); return; case 2: // std::string printer.print("\""); printer.print_converted( *literal.get() .value()); // special symbols are converted inside printer.print("\""); return; case 3: // char printer.print("\'\'"); printer.print_converted(std::string(1, *literal.get().value())); printer.print("\'\'"); return; case 4: // bool printer.print(literal.get().value() ? "true" : "false"); return; case 5: // unit printer.print("()"); return; case 6: // null printer.print("null"); return; default: break; } error_handling::handle_general_error("Unreachable"); exit(1); // unreachable } void print_identifier(const nodes::Identifier &identifier, Printer &printer) { printer.print(*identifier.get()); } void print_annotation(const std::string &annotation, Printer &printer) { printer.print("@"); printer.print(annotation); } void print_empty_lines(const nodes::EmptyLines &empty_lines, Printer &printer) { for (size_t i = 0; i < empty_lines.size(); ++i) { printer.new_indent_line(); } } } // namespace printers