lang/src/printers/statement_printers.cpp

215 lines
6.2 KiB
C++
Raw Normal View History

2023-07-24 22:50:18 +03:00
#include "statement_printers.hpp"
#include "basic_nodes.hpp"
2023-07-24 22:50:18 +03:00
#include "basic_printers.hpp"
2023-07-24 23:55:11 +03:00
#include "doc_printers.hpp"
#include "expression_nodes.hpp"
2023-07-24 22:50:18 +03:00
#include "expression_printers.hpp"
2023-07-28 19:42:09 +03:00
#include "statement_nodes.hpp"
2023-07-24 23:55:11 +03:00
#include "type_printers.hpp"
2023-07-24 22:50:18 +03:00
namespace printers {
2023-07-26 14:21:33 +03:00
void print_source_file(const std::vector<nodes::Statement> &statements,
Printer &printer) {
for (auto &statement : statements) {
print_statement(statement, printer);
}
}
void print_statement(const nodes::Statement &statement, Printer &printer) {
switch (statement.get_any()->index()) {
case 0: // Import
print_import(*statement.get<nodes::Import>().value(), printer);
printer.new_indent_line();
break;
case 1: // TypeDefinition
print_type_definition(*statement.get<nodes::TypeDefinition>().value(),
printer);
printer.new_indent_line();
break;
case 2: // FunctionDefinition
print_function_definition(
*statement.get<nodes::FunctionDefinition>().value(), printer);
printer.new_indent_line();
break;
case 3: // Extra
print_extra(*statement.get<nodes::Extra>().value(), printer);
2023-07-26 14:21:33 +03:00
printer.new_indent_line();
break;
case 4: // EmptyLines
print_empty_lines(*statement.get<nodes::EmptyLines>().value(), printer);
break;
}
}
2023-07-24 22:50:18 +03:00
void print_import(const nodes::Import &statement, Printer &printer) {
printer.print(":: ");
print_identifier(*statement.get_import_name(), printer);
if (*statement.get_import_name()->get() !=
*statement.get_module_name()->get()) {
printer.print(" = ");
print_identifier(*statement.get_module_name(), printer);
}
if (statement.symbols_size() > 0) {
printer.print(" :");
for (size_t i = 0; i < statement.symbols_size(); ++i) {
printer.space();
bool identifier_is_operator =
(statement.get_symbol(i)->get_type() == nodes::Identifier::OPERATOR);
if (identifier_is_operator) {
printer.print("( ");
}
2023-07-24 22:50:18 +03:00
print_identifier(*statement.get_symbol(i), printer);
if (identifier_is_operator) {
printer.print(" )");
}
2023-07-24 22:50:18 +03:00
}
}
printer.print(";");
} // IN PROGRESS
void print_constraint(const nodes::Constraint &statement, Printer &printer) {
printer.print("? ");
print_expression(*statement.get_expression(), printer);
printer.print(";");
}
void print_type_definition(const nodes::TypeDefinition &statement,
Printer &printer) {
print_docs(*statement.get_docs(), printer);
2023-07-24 23:55:11 +03:00
if (statement.is_on_heap()) {
printer.print("^");
}
print_identifier(*statement.get_name(), printer);
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
printer.space();
print_identifier(*statement.get_argument(i), printer);
}
if (statement.get_type().has_value()) {
printer.print(" = ");
2023-07-25 21:33:57 +03:00
size_t previous_indentation_level = printer.get_indentation_level();
2023-07-24 23:55:11 +03:00
2023-07-25 21:33:57 +03:00
printer.set_indentation_level(printer.get_current_position() - 2);
2023-07-24 23:55:11 +03:00
print_variant_type(*statement.get_type().value(), printer);
2023-07-25 21:33:57 +03:00
printer.set_indentation_level(previous_indentation_level);
2023-07-24 23:55:11 +03:00
}
printer.print(";");
2023-07-24 22:50:18 +03:00
} // IN PROGRESS
// TODO: do not print prefix type for names
2023-07-24 22:50:18 +03:00
void print_function_definition(const nodes::FunctionDefinition &statement,
Printer &printer) {
print_docs(*statement.get_docs(), printer);
2023-07-24 23:55:11 +03:00
for (size_t i = 0; i < statement.get_constraints_size(); ++i) {
print_constraint(*statement.get_constraint(i), printer);
printer.new_indent_line();
}
if (statement.is_method()) {
printer.print(".");
2023-07-24 23:55:11 +03:00
}
bool identifier_is_operator =
2023-07-25 21:33:57 +03:00
(statement.get_name()->get_type() == nodes::Identifier::OPERATOR);
if (identifier_is_operator) {
2023-07-25 21:33:57 +03:00
printer.print("( ");
}
2023-07-24 23:55:11 +03:00
print_identifier(*statement.get_name(), printer);
if (identifier_is_operator) {
2023-07-25 21:33:57 +03:00
printer.print(" )");
}
print_modifier(statement.get_return_modifier(), printer); // ! or ?
2023-07-24 23:55:11 +03:00
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
if (!statement.get_argument(i)->get_name().has_value()) {
break;
}
2023-07-25 21:33:57 +03:00
printer.space();
// all arguments are typed or are untyped in the same time
if (!statement.get_argument(i)->get_type().has_value()) {
// print annotation
if (!statement.are_annotations_same_to_names() &&
statement.get_argument(i)->get_annotation().has_value()) {
print_annotation(*statement.get_argument(i)->get_annotation().value(),
2023-07-24 23:55:11 +03:00
printer);
printer.space();
}
print_modifier(statement.get_argument(i)->get_before_modifier(), printer,
true);
2023-07-24 23:55:11 +03:00
}
print_identifier(*statement.get_argument(i)->get_name().value(), printer);
2023-07-24 23:55:11 +03:00
// all arguments are typed or are untyped in the same time
if (!statement.get_argument(i)->get_type().has_value()) {
print_modifier(statement.get_argument(i)->get_after_modifier(), printer);
2023-07-24 23:55:11 +03:00
}
}
// all arguments are typed or are untyped in the same time
if (statement.get_arguments_size() > 0 &&
statement.get_argument(0)->get_type().has_value()) {
2023-07-24 23:55:11 +03:00
printer.print(" :");
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
2023-07-24 23:55:11 +03:00
printer.space();
if (statement.get_argument(i)->get_annotation().has_value()) {
print_annotation(*statement.get_argument(i)->get_annotation().value(),
2023-07-24 23:55:11 +03:00
printer);
printer.space();
}
print_modifier(statement.get_argument(i)->get_before_modifier(), printer,
true);
2023-07-24 23:55:11 +03:00
print_type(*statement.get_argument(i)->get_type().value(), printer);
2023-07-24 23:55:11 +03:00
}
}
if (statement.get_expression().has_value()) {
bool expression_is_container =
statement.get_expression().value()->get<nodes::Container>().has_value();
2023-07-24 23:55:11 +03:00
printer.print(" = ");
size_t previous_indentation_level = printer.get_indentation_level();
if (!expression_is_container) {
printer.set_indentation_level(printer.current_position());
}
2023-07-24 23:55:11 +03:00
print_expression(*statement.get_expression().value(), printer);
if (!expression_is_container) {
printer.set_indentation_level(previous_indentation_level);
2023-07-25 21:33:57 +03:00
printer.print(";");
}
2023-07-24 23:55:11 +03:00
} else {
printer.print(";");
}
2023-07-24 22:50:18 +03:00
} // IN PROGRESS
} // namespace printers