mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-05 22:48:43 +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 "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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue