printing fixes

This commit is contained in:
ProgramSnail 2023-07-26 11:13:26 +03:00
parent 469cb3581f
commit 18d7bdf5c1

View file

@ -4,8 +4,18 @@
#include "expression_nodes.hpp" #include "expression_nodes.hpp"
#include "tokens.hpp" #include "tokens.hpp"
#include "type_printers.hpp" #include "type_printers.hpp"
#include "utils.hpp"
namespace printers { namespace printers {
namespace utils {
bool is_block_expression(const nodes::Expression &expression) {
return expression.get<nodes::Container>().has_value() &&
expression.get<nodes::Container>().value()->get_type() ==
nodes::Container::BLOCK;
}
} // namespace utils
void print_expression(const nodes::Expression &expression, void print_expression(const nodes::Expression &expression,
printers::Printer &printer) { printers::Printer &printer) {
@ -125,10 +135,17 @@ void print_condition(const nodes::Condition &expression,
printers::Printer &printer) { printers::Printer &printer) {
for (size_t i = 0; i < expression.cases_size(); ++i) { for (size_t i = 0; i < expression.cases_size(); ++i) {
if (i > 0) {
if (utils::is_block_expression(*expression.get_case(i - 1).second)) {
printer.space();
} else {
printer.new_indent_line();
}
}
if (i == 0) { if (i == 0) {
printer.print(printer.print_words_instead_of_symbols() ? "if " : "?? "); printer.print(printer.print_words_instead_of_symbols() ? "if " : "?? ");
} else { } else {
printer.new_indent_line();
printer.print(printer.print_words_instead_of_symbols() ? "elif " : "!! "); printer.print(printer.print_words_instead_of_symbols() ? "elif " : "!! ");
} }
@ -139,8 +156,18 @@ void print_condition(const nodes::Condition &expression,
print_expression(*expression.get_case(i).second, printer); print_expression(*expression.get_case(i).second, printer);
} }
if (expression.cases_size() == 0) {
error_handling::handle_general_error(
"Condition with zero cases"); // TODO ??
}
if (expression.get_else_case().has_value()) { if (expression.get_else_case().has_value()) {
printer.new_indent_line(); if (utils::is_block_expression(
*expression.get_case(expression.cases_size() - 1).second)) {
printer.space();
} else {
printer.new_indent_line();
}
printer.print(printer.print_words_instead_of_symbols() ? "else " : "!!=> "); printer.print(printer.print_words_instead_of_symbols() ? "else " : "!!=> ");
print_expression(*expression.get_else_case().value(), printer); print_expression(*expression.get_else_case().value(), printer);
} }
@ -186,7 +213,8 @@ void print_container(const nodes::Container &expression,
} }
for (size_t i = 0; i < expression.expressions_size(); ++i) { for (size_t i = 0; i < expression.expressions_size(); ++i) {
bool is_empty_lines_expression = expression.get_expression(i)->get<nodes::EmptyLines>().has_value(); bool is_empty_lines_expression =
expression.get_expression(i)->get<nodes::EmptyLines>().has_value();
if (!is_array && !is_empty_lines_expression) { if (!is_array && !is_empty_lines_expression) {
printer.new_indent_line(); printer.new_indent_line();
@ -352,11 +380,16 @@ void print_modifier_expression(const nodes::ModifierExpression &expression,
void print_name_expression(const nodes::NameExpression &expression, void print_name_expression(const nodes::NameExpression &expression,
printers::Printer &printer) { printers::Printer &printer) {
bool is_comma_operator = (*expression.get_name()->get() == ",");
bool is_range_operator = (*expression.get_name()->get() == "..");
if (expression.is_operator_call() || expression.is_point_call()) { if (expression.is_operator_call() || expression.is_point_call()) {
print_expression(*expression.get_argument_value(0), printer); print_expression(*expression.get_argument_value(0), printer);
if (expression.is_point_call()) { if (expression.is_point_call()) {
printer.print("."); printer.print(".");
} else if (*expression.get_name()->get() != ",") {
// not comma operator and not range operator
} else if (!is_comma_operator && !is_range_operator) {
printer.space(); printer.space();
} }
} else if (expression.get_prefix().has_value()) { } else if (expression.get_prefix().has_value()) {
@ -385,7 +418,9 @@ void print_name_expression(const nodes::NameExpression &expression,
for (size_t i = for (size_t i =
expression.is_operator_call() || expression.is_point_call() ? 1 : 0; expression.is_operator_call() || expression.is_point_call() ? 1 : 0;
i < expression.arguments_size(); ++i) { i < expression.arguments_size(); ++i) {
printer.space(); if (!expression.is_operator_call() || !is_range_operator || i > 1) {
printer.space();
}
if (expression.get_argument_annotation(i).has_value()) { if (expression.get_argument_annotation(i).has_value()) {
print_annotation(*expression.get_argument_annotation(i).value(), printer); print_annotation(*expression.get_argument_annotation(i).value(), printer);
@ -414,7 +449,7 @@ void print_constructor(const nodes::Constructor &expression,
} // IN PROGRESS } // IN PROGRESS
void print_lambda(const nodes::Lambda &expression, printers::Printer &printer) { void print_lambda(const nodes::Lambda &expression, printers::Printer &printer) {
printer.print(printer.print_words_instead_of_symbols() ? "lambda " : "\\"); printer.print(printer.print_words_instead_of_symbols() ? "lambda " : "\\ ");
for (size_t i = 0; i < expression.arguments_size(); ++i) { for (size_t i = 0; i < expression.arguments_size(); ++i) {
print_identifier(*expression.get_argument(i), printer); print_identifier(*expression.get_argument(i), printer);