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 | |
parent | 6a89e51d47a705be9354d29e14cedef2371fa18c (diff) |
fix bug in function types
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | code/main.felan | 6 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 48 |
3 files changed, 36 insertions, 22 deletions
@@ -18,9 +18,9 @@ NC := \033[0m INC_DIRS := $(SRC_DIR) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) -CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3 +# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3 # CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -Oz -# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g +CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g EXEC_FILE := $(BUILD_DIR)/$(PROJECT_NAME) diff --git a/code/main.felan b/code/main.felan index d463464..b059d04 100644 --- a/code/main.felan +++ b/code/main.felan @@ -1,3 +1,7 @@ main :: () -> void { - print_u64 2; + f(3); +}; + +f :(u64)->void: (a:u64)->void{ + print_u64 a; }; 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; } |