mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-25 00:08:45 +00:00
or references, prining improvements, comments now printed, fixes
This commit is contained in:
parent
73263193a9
commit
5e70f0015f
19 changed files with 354 additions and 429 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#include "statement_printers.hpp"
|
||||
|
||||
#include "basic_nodes.hpp"
|
||||
#include "basic_printers.hpp"
|
||||
#include "doc_printers.hpp"
|
||||
#include "expression_nodes.hpp"
|
||||
|
|
@ -32,9 +33,8 @@ void print_statement(const nodes::Statement &statement, Printer &printer) {
|
|||
*statement.get<nodes::FunctionDefinition>().value(), printer);
|
||||
printer.new_indent_line();
|
||||
break;
|
||||
case 3: // TypeclassDefinition
|
||||
print_typeclass_definition(
|
||||
*statement.get<nodes::TypeclassDefinition>().value(), printer);
|
||||
case 3: // Extra
|
||||
print_extra(*statement.get<nodes::Extra>().value(), printer);
|
||||
printer.new_indent_line();
|
||||
break;
|
||||
case 4: // EmptyLines
|
||||
|
|
@ -82,28 +82,6 @@ void print_constraint(const nodes::Constraint &statement, Printer &printer) {
|
|||
printer.print(";");
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void print_statement_methods(const T &statement, Printer &printer) {
|
||||
if (statement.get_methods_size() > 0) {
|
||||
printer.print(" {");
|
||||
printer.indent();
|
||||
|
||||
for (size_t i = 0; i < statement.get_methods_size(); ++i) {
|
||||
printer.new_indent_line();
|
||||
print_function_definition(*statement.get_method(i), printer);
|
||||
if (i + 1 < statement.get_methods_size()) {
|
||||
printer.new_indent_line();
|
||||
}
|
||||
}
|
||||
|
||||
printer.deindent();
|
||||
printer.new_indent_line();
|
||||
printer.print("}");
|
||||
} else {
|
||||
printer.print(";");
|
||||
}
|
||||
}
|
||||
|
||||
void print_type_definition(const nodes::TypeDefinition &statement,
|
||||
Printer &printer) {
|
||||
print_docs(*statement.get_docs(), printer);
|
||||
|
|
@ -130,10 +108,10 @@ void print_type_definition(const nodes::TypeDefinition &statement,
|
|||
|
||||
printer.set_indentation_level(previous_indentation_level);
|
||||
}
|
||||
|
||||
print_statement_methods(statement, printer);
|
||||
printer.print(";");
|
||||
} // IN PROGRESS
|
||||
|
||||
// TODO: do not print prefix type for names
|
||||
void print_function_definition(const nodes::FunctionDefinition &statement,
|
||||
Printer &printer) {
|
||||
print_docs(*statement.get_docs(), printer);
|
||||
|
|
@ -143,17 +121,8 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
printer.new_indent_line();
|
||||
}
|
||||
|
||||
switch (statement.get_method_modifier()) {
|
||||
case nodes::FunctionDefinition::STATIC:
|
||||
break;
|
||||
case nodes::FunctionDefinition::LET:
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "let " : "%");
|
||||
break;
|
||||
case nodes::FunctionDefinition::VAR:
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "var " : "$");
|
||||
break;
|
||||
default: // remove ??
|
||||
break;
|
||||
if (statement.is_method()) {
|
||||
printer.print(".");
|
||||
}
|
||||
|
||||
bool identifier_is_operator =
|
||||
|
|
@ -169,7 +138,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
printer.print(" )");
|
||||
}
|
||||
|
||||
print_modifier(statement.get_return_modifier(), printer);
|
||||
print_modifier(statement.get_return_modifier(), printer); // ! or ?
|
||||
|
||||
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
|
||||
if (!statement.get_argument(i)->get_name().has_value()) {
|
||||
|
|
@ -189,7 +158,8 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
printer.space();
|
||||
}
|
||||
|
||||
print_modifier(statement.get_argument(i)->get_before_modifier(), printer);
|
||||
print_modifier(statement.get_argument(i)->get_before_modifier(), printer,
|
||||
true);
|
||||
}
|
||||
|
||||
print_identifier(*statement.get_argument(i)->get_name().value(), printer);
|
||||
|
|
@ -214,19 +184,26 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
printer.space();
|
||||
}
|
||||
|
||||
print_modifier(statement.get_argument(i)->get_before_modifier(), printer);
|
||||
print_modifier(statement.get_argument(i)->get_before_modifier(), printer,
|
||||
true);
|
||||
|
||||
print_type(*statement.get_argument(i)->get_type().value(), printer);
|
||||
}
|
||||
}
|
||||
|
||||
if (statement.get_expression().has_value()) {
|
||||
bool expression_is_container =
|
||||
statement.get_expression().value()->get<nodes::Container>().has_value();
|
||||
|
||||
printer.print(" = ");
|
||||
|
||||
size_t previous_indentation_level = printer.get_indentation_level();
|
||||
if (!expression_is_container) {
|
||||
printer.set_indentation_level(printer.current_position());
|
||||
}
|
||||
print_expression(*statement.get_expression().value(), printer);
|
||||
if (!statement.get_expression()
|
||||
.value()
|
||||
->get<nodes::Container>()
|
||||
.has_value()) {
|
||||
if (!expression_is_container) {
|
||||
printer.set_indentation_level(previous_indentation_level);
|
||||
printer.print(";");
|
||||
}
|
||||
} else {
|
||||
|
|
@ -234,21 +211,4 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
}
|
||||
} // IN PROGRESS
|
||||
|
||||
void print_typeclass_definition(const nodes::TypeclassDefinition &statement,
|
||||
Printer &printer) {
|
||||
print_docs(*statement.get_docs(), printer);
|
||||
|
||||
print_identifier(*statement.get_name(), printer);
|
||||
|
||||
if (statement.get_base_typeclasses_size() > 0) {
|
||||
printer.print(" :");
|
||||
for (size_t i = 0; i < statement.get_base_typeclasses_size(); ++i) {
|
||||
printer.space();
|
||||
print_identifier(*statement.get_base_typeclass(i), printer);
|
||||
}
|
||||
}
|
||||
|
||||
print_statement_methods(statement, printer);
|
||||
} // IN PROGRESS
|
||||
|
||||
} // namespace printers
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue