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 "tokens.hpp"
#include "type_printers.hpp"
#include "utils.hpp"
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,
printers::Printer &printer) {
@ -125,10 +135,17 @@ void print_condition(const nodes::Condition &expression,
printers::Printer &printer) {
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) {
printer.print(printer.print_words_instead_of_symbols() ? "if " : "?? ");
} else {
printer.new_indent_line();
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);
}
if (expression.cases_size() == 0) {
error_handling::handle_general_error(
"Condition with zero cases"); // TODO ??
}
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 " : "!!=> ");
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) {
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) {
printer.new_indent_line();
@ -352,11 +380,16 @@ void print_modifier_expression(const nodes::ModifierExpression &expression,
void print_name_expression(const nodes::NameExpression &expression,
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()) {
print_expression(*expression.get_argument_value(0), printer);
if (expression.is_point_call()) {
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();
}
} else if (expression.get_prefix().has_value()) {
@ -385,7 +418,9 @@ void print_name_expression(const nodes::NameExpression &expression,
for (size_t i =
expression.is_operator_call() || expression.is_point_call() ? 1 : 0;
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()) {
print_annotation(*expression.get_argument_annotation(i).value(), printer);
@ -414,7 +449,7 @@ void print_constructor(const nodes::Constructor &expression,
} // IN PROGRESS
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) {
print_identifier(*expression.get_argument(i), printer);