mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-25 08:18:45 +00:00
printing fixes, simple type annotations fix, Function and Array type shortcuts removed, '=' in function definition for block/array removed
This commit is contained in:
parent
d7f1b6c377
commit
d8ef39b2bd
11 changed files with 56 additions and 77 deletions
|
|
@ -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()) ==
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
|
|
|
|||
|
|
@ -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("()");
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue