printing fixes, simple type annotations fix, Function and Array type shortcuts removed, '=' in function definition for block/array removed

This commit is contained in:
ProgramSnail 2024-02-23 16:20:02 +03:00
parent d7f1b6c377
commit d8ef39b2bd
11 changed files with 56 additions and 77 deletions

View file

@ -519,8 +519,6 @@ build_name_expression(parser::ParseTree::Node parser_node,
tokens::Type::VARIANT_TYPE ||
tokens::string_to_type(current_node.get_type()) ==
tokens::Type::TUPLE_TYPE ||
tokens::string_to_type(current_node.get_type()) ==
tokens::Type::ARRAY_TYPE ||
tokens::string_to_type(current_node.get_type()) ==
tokens::Type::REFERENCE_TYPE ||
tokens::string_to_type(current_node.get_type()) ==

View file

@ -217,7 +217,6 @@ nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
break;
case tokens::Type::VARIANT_TYPE:
case tokens::Type::TUPLE_TYPE:
case tokens::Type::ARRAY_TYPE:
case tokens::Type::REFERENCE_TYPE:
case tokens::Type::MODIFIED_TYPE:
case tokens::Type::SIMPLE_TYPE:
@ -274,7 +273,7 @@ nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
// definition_info? annotation_info* (constraint ';')* '.'? (simple_name
// | '(' operator ')') (annotation? _reference_? argument_name '?'?)* (:
// (annotation? _reference_ type)+)?
// ('=' (block | expression ';') | ';')
// (((block | array) | '=' expression ';') | ';')
nodes::FunctionDefinition build_function_definition(
parser::ParseTree::Node parser_node,
const std::optional<nodes::Identifier> &last_defined_type_name,
@ -382,8 +381,6 @@ nodes::FunctionDefinition build_function_definition(
break;
case tokens::Type::VARIANT_TYPE:
case tokens::Type::TUPLE_TYPE:
case tokens::Type::FUNCTION_TYPE:
case tokens::Type::ARRAY_TYPE:
case tokens::Type::REFERENCE_TYPE:
case tokens::Type::MODIFIED_TYPE:
case tokens::Type::SIMPLE_TYPE:

View file

@ -23,10 +23,6 @@ nodes::TypeProxy build_type(parser::ParseTree::Node parser_node,
return build_variant_type(parser_node, type_storage);
case tokens::Type::TUPLE_TYPE:
return build_tuple_type(parser_node, type_storage);
case tokens::Type::FUNCTION_TYPE:
return build_function_type(parser_node, type_storage);
case tokens::Type::ARRAY_TYPE:
return build_array_type(parser_node, type_storage);
case tokens::Type::REFERENCE_TYPE:
return build_reference_type(parser_node, type_storage);
case tokens::Type::MODIFIED_TYPE:
@ -41,14 +37,14 @@ nodes::TypeProxy build_type(parser::ParseTree::Node parser_node,
exit(1); // unreachable
}
nodes::TypeProxy build_container_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage,
builtin::types::Type container) {
std::vector<nodes::TypeProxy>
collect_parameters(parser::ParseTree::Node first_node,
nodes::TypeStorage &type_storage) {
std::vector<nodes::TypeProxy> parameters;
std::optional<std::string> current_annotation;
auto current_node = parser_node.nth_named_child(0);
auto current_node = first_node;
while (!current_node.is_null()) {
if (tokens::string_to_type(current_node.get_type()) ==
tokens::Type::ANNOTATION_IDENTIFIER) {
@ -62,6 +58,15 @@ nodes::TypeProxy build_container_type(parser::ParseTree::Node parser_node,
current_node = current_node.next_named_sibling();
}
return parameters;
}
nodes::TypeProxy build_container_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage,
builtin::types::Type container) {
std::vector<nodes::TypeProxy> parameters =
collect_parameters(parser_node.nth_named_child(0), type_storage);
return type_storage.add_container_of(std::move(parameters), container,
build_node(parser_node));
}
@ -80,22 +85,6 @@ nodes::TypeProxy build_tuple_type(parser::ParseTree::Node parser_node,
builtin::types::Type::TUPLE);
}
// '((' (annotation? type)+ '))'
nodes::TypeProxy build_function_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage) {
return build_container_type(parser_node, type_storage,
builtin::types::Type::FUNCTION);
}
// '[[' type ']]'
nodes::TypeProxy build_array_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage) {
return type_storage.add_array_of(
build_type(parser_node.nth_named_child(0), type_storage),
build_node(parser_node));
}
// _reference_ type
nodes::TypeProxy build_reference_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage) {
@ -136,18 +125,13 @@ nodes::TypeProxy build_modified_type(parser::ParseTree::Node parser_node,
std::move(parameters)));
}
// type_identifier ('[' type+ ']')?
// type_identifier ('[' (annotation? type)+ ']')?
nodes::TypeProxy build_simple_type(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage) {
std::vector<nodes::TypeProxy> parameters;
auto name_node = parser_node.child_by_field_name("name");
auto current_node = name_node.next_named_sibling();
while (!current_node.is_null()) {
parameters.push_back(build_type(current_node, type_storage));
current_node = current_node.next_named_sibling();
}
std::vector<nodes::TypeProxy> parameters =
collect_parameters(name_node.next_named_sibling(), type_storage);
return type_storage.add_type(
nodes::Type(build_identifier(name_node), std::move(parameters)));

View file

@ -127,7 +127,7 @@ void print_literal(const nodes::Literal &literal, Printer &printer) {
printer.print("\'\'u");
return;
case 9: // bool
printer.print(literal.get<bool>().value() ? "true" : "false");
printer.print(*literal.get<bool>().value() ? "true" : "false");
return;
case 10: // unit
printer.print("()");

View file

@ -195,7 +195,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
bool expression_is_container =
statement.get_expression().value()->get<nodes::Container>().has_value();
printer.print(" = ");
printer.print(expression_is_container ? " " : " = ");
size_t previous_indentation_level = printer.get_indentation_level();
if (!expression_is_container) {

View file

@ -7,15 +7,15 @@ namespace printers {
// TODO: better printing format for builtin types
void print_type(const nodes::Type &type, printers::Printer &printer) {
if (type.get_modifier() != nodes::Modifier::CONST) {
print_modifier(type.get_modifier(), printer);
}
if (type.get_annotation().has_value()) {
print_annotation(*type.get_annotation().value(), printer);
printer.space();
}
if (type.get_modifier() != nodes::Modifier::CONST) {
print_modifier(type.get_modifier(), printer);
}
print_identifier(*type.get_name(), printer);
if (type.parameters_size() > 0) {