diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-21 02:37:44 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-21 02:37:44 +0330 |
commit | 62cd39836fd1237c5f432a629542eb511e5f9cb7 (patch) | |
tree | 2ed60df94ececdebe9cecb4a57ce9d04247210ae /src/compiler/ast-tree.c | |
parent | 6a89e51d47a705be9354d29e14cedef2371fa18c (diff) |
fix bug in function types
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r-- | src/compiler/ast-tree.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 1437767..890d159 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -1329,22 +1329,30 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode, typeFunction->arguments_size = 0; for (size_t i = 0; i < node_arguments->size; ++i) { - ParserNode *argument = node_arguments->data[i]; + ParserNode *node_argument = node_arguments->data[i]; - if (argument->token == PARSER_TOKEN_SYMBOL_COMMA) { - argument = (ParserNodeSingleChildMetadata *)argument->metadata; + if (node_argument->token == PARSER_TOKEN_SYMBOL_COMMA) { + node_argument = (ParserNodeSingleChildMetadata *)node_argument->metadata; } - ParserNodeVariableMetadata *arg_metadata = argument->metadata; - if (arg_metadata->value != NULL) { - printError(argument->str_begin, argument->str_end, - "arguments can't have default values (for now)"); - goto RETURN_ERROR; - } + AstTree *argument; - AstTree *type = astTreeParse(arg_metadata->type, helper); - if (type == NULL) { - goto RETURN_ERROR; + if (node_argument->token == PARSER_TOKEN_VARIABLE) { + argument = NULL; + printError(node_argument->str_begin, node_argument->str_end, + "Not yet supported"); + UNREACHABLE; + } else { + argument = astTreeParse(node_argument, helper); + if (argument == NULL) { + return NULL; + } + + if (!typeIsEqual(argument->type, &AST_TREE_TYPE_TYPE)) { + printError(argument->str_begin, argument->str_end, + "Not yet supported"); + return NULL; + } } if (typeFunction->arguments_size == arguments_size) { @@ -1354,7 +1362,7 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode, arguments_size * sizeof(*typeFunction->arguments)); } - typeFunction->arguments[typeFunction->arguments_size] = type; + typeFunction->arguments[typeFunction->arguments_size] = argument; typeFunction->arguments_size += 1; } @@ -2662,8 +2670,13 @@ bool setTypesTypeFunction(AstTree *tree, AstTreeSetTypesHelper helper) { AstTreeTypeFunction *metadata = tree->metadata; for (size_t i = 0; i < metadata->arguments_size; ++i) { - printError(tree->str_begin, tree->str_end, "Not yet supported"); - return false; + AstTree *arg = metadata->arguments[i]; + if (!setAllTypes(arg, helper, NULL)) { + return false; + } else if (!typeIsEqual(arg->type, &AST_TREE_TYPE_TYPE)) { + printError(arg->str_begin, arg->str_end, "Expected a type"); + return false; + } } if (!setAllTypes(metadata->returnType, helper, NULL)) { @@ -2680,10 +2693,7 @@ bool setTypesTypeFunction(AstTree *tree, AstTreeSetTypesHelper helper) { bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper helper) { AstTreeFunctionCall *metadata = tree->metadata; - if (metadata->function->token != AST_TREE_TOKEN_VARIABLE) { - printError(tree->str_begin, tree->str_end, "Not yet supported"); - return false; - } else if (!setAllTypes(metadata->function, helper, NULL)) { + if (!setAllTypes(metadata->function, helper, NULL)) { return false; } |