mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-07 23:48:44 +00:00
printing fixes
This commit is contained in:
parent
0bb72e0b10
commit
469cb3581f
23 changed files with 318 additions and 151 deletions
|
|
@ -28,9 +28,6 @@ void print_import(const nodes::Import &statement, Printer &printer) {
|
|||
}
|
||||
}
|
||||
printer.print(";");
|
||||
|
||||
printer.new_indent_line();
|
||||
printer.new_indent_line();
|
||||
} // IN PROGRESS
|
||||
|
||||
void print_constraint(const nodes::Constraint &statement, Printer &printer) {
|
||||
|
|
@ -39,6 +36,28 @@ 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); // TODO
|
||||
|
|
@ -57,33 +76,16 @@ void print_type_definition(const nodes::TypeDefinition &statement,
|
|||
if (statement.get_type().has_value()) {
|
||||
printer.print(" = ");
|
||||
|
||||
size_t previous_indentation_level = printer.get_current_indentation_level();
|
||||
size_t previous_indentation_level = printer.get_indentation_level();
|
||||
|
||||
printer.set_current_indentation_level(printer.get_current_position());
|
||||
printer.set_indentation_level(printer.get_current_position() - 2);
|
||||
|
||||
print_variant_type(*statement.get_type().value(), printer);
|
||||
|
||||
printer.set_current_indentation_level(previous_indentation_level);
|
||||
}
|
||||
|
||||
// TODO: same to typeclass, make separated function
|
||||
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);
|
||||
printer.new_indent_line();
|
||||
}
|
||||
|
||||
printer.deindent();
|
||||
printer.new_indent_line();
|
||||
printer.print("} ");
|
||||
} else {
|
||||
printer.print(";");
|
||||
printer.set_indentation_level(previous_indentation_level);
|
||||
}
|
||||
|
||||
print_statement_methods(statement, printer);
|
||||
} // IN PROGRESS
|
||||
|
||||
void print_function_definition(const nodes::FunctionDefinition &statement,
|
||||
|
|
@ -99,22 +101,36 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
case nodes::FunctionDefinition::STATIC:
|
||||
break;
|
||||
case nodes::FunctionDefinition::LET:
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "let " : "% ");
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "let " : "%");
|
||||
break;
|
||||
case nodes::FunctionDefinition::VAR:
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "var " : "$ ");
|
||||
printer.print(printer.print_words_instead_of_symbols() ? "var " : "$");
|
||||
break;
|
||||
default: // remove ??
|
||||
break;
|
||||
}
|
||||
|
||||
bool operator_called_as_function =
|
||||
(statement.get_name()->get_type() == nodes::Identifier::OPERATOR);
|
||||
|
||||
if (operator_called_as_function) {
|
||||
printer.print("( ");
|
||||
}
|
||||
|
||||
print_identifier(*statement.get_name(), printer);
|
||||
|
||||
if (operator_called_as_function) {
|
||||
printer.print(" )");
|
||||
}
|
||||
|
||||
// TODO: same fragments with function type, maybe better make separated
|
||||
// function
|
||||
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
|
||||
printer.space();
|
||||
|
||||
if (statement.get_argument_types_size() == 0) {
|
||||
if (statement.get_argument_annotation(i).has_value()) {
|
||||
if (!statement.is_annotations_same_to_names() &&
|
||||
statement.get_argument_annotation(i).has_value()) {
|
||||
print_annotation(*statement.get_argument_annotation(i).value(),
|
||||
printer);
|
||||
printer.space();
|
||||
|
|
@ -154,7 +170,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
}
|
||||
}
|
||||
|
||||
if (statement.get_argument_types_size() > 0) { // TODO
|
||||
if (statement.get_argument_types_size() > 0) {
|
||||
printer.print(" :");
|
||||
for (size_t i = 0; i < statement.get_argument_types_size(); ++i) {
|
||||
printer.space();
|
||||
|
|
@ -183,22 +199,18 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
|
|||
}
|
||||
|
||||
print_type(*statement.get_argument_type(i), printer);
|
||||
|
||||
// TODO: can't be optional and result in same time
|
||||
|
||||
if (statement.is_argument_optional(i)) {
|
||||
printer.print("?");
|
||||
}
|
||||
|
||||
if (statement.is_argument_result(i)) {
|
||||
printer.print("!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (statement.get_expression().has_value()) {
|
||||
printer.print(" = ");
|
||||
print_expression(*statement.get_expression().value(), printer);
|
||||
if (!statement.get_expression()
|
||||
.value()
|
||||
->get<nodes::Container>()
|
||||
.has_value()) {
|
||||
printer.print(";");
|
||||
}
|
||||
} else {
|
||||
printer.print(";");
|
||||
}
|
||||
|
|
@ -218,25 +230,7 @@ void print_typeclass_definition(const nodes::TypeclassDefinition &statement,
|
|||
}
|
||||
}
|
||||
|
||||
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);
|
||||
printer.new_indent_line();
|
||||
}
|
||||
|
||||
printer.deindent();
|
||||
printer.new_indent_line();
|
||||
printer.print("} ");
|
||||
} else {
|
||||
printer.print(";");
|
||||
}
|
||||
|
||||
printer.new_indent_line();
|
||||
printer.new_indent_line();
|
||||
print_statement_methods(statement, printer);
|
||||
} // IN PROGRESS
|
||||
|
||||
} // namespace printers
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue