mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2026-01-25 13:07:13 +00:00
printing fixes
This commit is contained in:
parent
469cb3581f
commit
18d7bdf5c1
1 changed files with 41 additions and 6 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue