result / optional return type modifiers for functions (one for all returns)

This commit is contained in:
ProgramSnail 2023-07-29 14:48:45 +03:00
parent 68463509d8
commit 195a26f9b7
10 changed files with 74 additions and 36 deletions

View file

@ -263,16 +263,28 @@ build_function_definition(parser::ParseTree::Node parser_node,
auto name_node = current_node;
nodes::FunctionDefinition::ModifierType modifier =
nodes::FunctionDefinition::MethodModifier method_modifier =
nodes::FunctionDefinition::STATIC;
current_node = name_node.previous_sibling();
if (!current_node.is_null() && !current_node.is_named()) {
std::string modifier_str = current_node.get_value();
if (modifier_str == "%" || modifier_str == "let") {
modifier = nodes::FunctionDefinition::LET;
method_modifier = nodes::FunctionDefinition::LET;
} else if (modifier_str == "$" || modifier_str == "var") {
modifier = nodes::FunctionDefinition::VAR;
method_modifier = nodes::FunctionDefinition::VAR;
}
}
nodes::Modifier return_modifier = nodes::Modifier::NONE;
current_node = name_node.next_sibling();
if (!current_node.is_null() && !current_node.is_named()) {
return_modifier = build_modifier(current_node);
// only optional, result allowed
if (!utils::is_suffix_modifier(return_modifier)) {
return_modifier = nodes::Modifier::NONE;
}
}
@ -297,8 +309,7 @@ build_function_definition(parser::ParseTree::Node parser_node,
last_before_modifier = build_modifier(maybe_reference_node);
// only out, in, ref allowed
if (last_before_modifier == nodes::Modifier::OPTIONAL ||
last_before_modifier == nodes::Modifier::RESULT) {
if (utils::is_suffix_modifier(last_before_modifier)) {
last_before_modifier = nodes::Modifier::NONE;
}
}
@ -314,8 +325,7 @@ build_function_definition(parser::ParseTree::Node parser_node,
last_after_modifier = build_modifier(maybe_reference_node);
// only optional, result allowed
if (last_after_modifier != nodes::Modifier::OPTIONAL &&
last_after_modifier != nodes::Modifier::RESULT) {
if (!utils::is_suffix_modifier(last_after_modifier)) {
last_after_modifier = nodes::Modifier::NONE;
}
}
@ -401,8 +411,9 @@ build_function_definition(parser::ParseTree::Node parser_node,
return nodes::FunctionDefinition(
build_node(parser_node),
build_symbol_docs(description_node, annotation_nodes, annotations_set),
std::move(constraints), modifier, build_identifier(name_node),
std::move(arguments), are_annotations_same_to_names,
std::move(constraints), return_modifier, method_modifier,
build_identifier(name_node), std::move(arguments),
are_annotations_same_to_names,
expression_node.has_value()
? build_expression(expression_node.value(), expression_storage,
type_storage)

View file

@ -22,9 +22,13 @@ FunctionDefinition::combine(FunctionDefinition &&other_function_definition) {
if (*name_.get() != *other_function_definition.name_.get()) {
return CombineResult::DIFFERENT_NAME_ERROR;
}
if (modifier_ != other_function_definition.modifier_) {
if (return_modifier_ != other_function_definition.return_modifier_) {
return CombineResult::DIFFERNENT_MODIFIER_ERROR;
}
if (method_modifier_ != other_function_definition.method_modifier_) {
return CombineResult::DIFFERNENT_MODIFIER_ERROR;
}
if (are_annotations_same_to_names_ !=
other_function_definition.are_annotations_same_to_names_) {
return CombineResult::ARGUMENTS_ERROR;
@ -158,7 +162,7 @@ FunctionDefinition::combine(FunctionDefinition &&other_function_definition) {
error_handling::handle_internal_error(
"Function arguments are not properly checked before merging "
"during combination",
this);
*this);
}
}
} else {

View file

@ -143,7 +143,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
printer.new_indent_line();
}
switch (statement.get_modifier()) {
switch (statement.get_method_modifier()) {
case nodes::FunctionDefinition::STATIC:
break;
case nodes::FunctionDefinition::LET:
@ -169,6 +169,8 @@ void print_function_definition(const nodes::FunctionDefinition &statement,
printer.print(" )");
}
print_modifier(statement.get_return_modifier(), printer);
for (size_t i = 0; i < statement.get_arguments_size(); ++i) {
if (!statement.get_argument(i)->get_name().has_value()) {
break;

View file

@ -24,8 +24,7 @@ nodes::TypeProxy build_type(parser::ParseTree::Node parse_node,
modifier = build_modifier(current_node);
// only optional, result allowed
if (modifier != nodes::Modifier::OPTIONAL &&
modifier != nodes::Modifier::RESULT) {
if (!utils::is_suffix_modifier(modifier)) {
modifier = nodes::Modifier::NONE;
}
}