lang/src/basic_printers.cpp

94 lines
2.5 KiB
C++
Raw Normal View History

#include "basic_printers.hpp"
#include "error_handling.hpp"
2023-07-24 21:23:18 +03:00
#include <string>
2023-07-24 21:23:18 +03:00
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;
2023-07-29 12:19:37 +03:00
case nodes::Modifier::OR_OUT:
printer.print(printer.print_words_instead_of_symbols() ? "or_out "
: "|-> ");
break;
case nodes::Modifier::OR_IN:
printer.print(printer.print_words_instead_of_symbols() ? "or_in " : "<-| ");
break;
2023-07-28 19:42:09 +03:00
case nodes::Modifier::OPTIONAL:
printer.print("?");
break;
2023-07-28 19:42:09 +03:00
case nodes::Modifier::RESULT:
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 ??
2023-07-24 21:23:18 +03:00
printer.print(std::to_string(*literal.get<double>().value()));
return;
case 1: // long long
2023-07-24 21:23:18 +03:00
printer.print(std::to_string(*literal.get<long long>().value()));
return;
case 2: // std::string
2023-07-24 21:23:18 +03:00
printer.print("\"");
printer.print_converted(
*literal.get<std::string>()
.value()); // special symbols are converted inside
printer.print("\"");
return;
case 3: // char
printer.print("\'\'");
2023-07-24 21:23:18 +03:00
printer.print_converted(std::string(1, *literal.get<char>().value()));
printer.print("\'\'");
return;
case 4: // bool
printer.print(literal.get<bool>().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) {
2023-07-24 21:23:18 +03:00
printer.print(*identifier.get());
}
void print_annotation(const std::string &annotation, Printer &printer) {
2023-07-24 21:23:18 +03:00
printer.print("@");
printer.print(annotation);
}
2023-07-25 21:33:57 +03:00
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