diff options
-rw-r--r-- | src/compiler/ast-tree.c | 24 | ||||
-rw-r--r-- | src/compiler/parser.c | 2 | ||||
-rw-r--r-- | test/main.felan | 8 |
3 files changed, 25 insertions, 9 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index eab847d..ee0fe3a 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -605,6 +605,10 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, for (size_t i = 0; i < node_arguments->size; ++i) { ParserNode *arg = node_arguments->data[i]; + if (arg->token == PARSER_TOKEN_SYMBOL_COMMA) { + arg = (ParserNodeSingleChildMetadata *)arg->metadata; + } + ParserNodeVariableMetadata *arg_metadata = arg->metadata; if (arg_metadata->value != NULL) { printLog("arguments can't have default values (for now)"); @@ -689,8 +693,13 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode, typeFunction->arguments_size = 0; for (size_t i = 0; i < node_arguments->size; ++i) { - ParserNodeVariableMetadata *arg_metadata = - node_arguments->data[i]->metadata; + ParserNode *argument = node_arguments->data[i]; + + if (argument->token == PARSER_TOKEN_SYMBOL_COMMA) { + argument = (ParserNodeSingleChildMetadata *)argument->metadata; + } + + ParserNodeVariableMetadata *arg_metadata = argument->metadata; if (arg_metadata->value != NULL) { printLog("arguments can't have default values (for now)"); goto RETURN_ERROR; @@ -746,8 +755,12 @@ AstTree *astTreeParseFunctionCall(ParserNode *parserNode, metadata->parameters_size = node_metadata->params->size; for (size_t i = 0; i < metadata->parameters_size; ++i) { + ParserNode *param = node_metadata->params->data[i]; + if (param->token == PARSER_TOKEN_SYMBOL_COMMA) { + param = (ParserNodeSingleChildMetadata *)param->metadata; + } metadata->parameters[i] = - astTreeParse(node_metadata->params->data[i], variables, variables_size); + astTreeParse(param, variables, variables_size); } return newAstTree(AST_TREE_TOKEN_FUNCTION_CALL, metadata, NULL); @@ -1342,7 +1355,10 @@ bool astTreeCleanFunction(AstTree *tree) { AstTreeFunction *metadata = tree->metadata; for (size_t i = 0; i < metadata->arguments.size; ++i) { - // TODO: do it + if (metadata->arguments.data[i]->value != NULL && + !astTreeClean(metadata->arguments.data[i]->value)) { + return false; + } } if (!astTreeClean(metadata->returnType)) { diff --git a/src/compiler/parser.c b/src/compiler/parser.c index ced3b6a..dce8731 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -977,6 +977,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_OPERATOR_ASSIGN: case PARSER_TOKEN_OPERATOR_SUM: + case PARSER_TOKEN_VALUE_U64: return true; case PARSER_TOKEN_ROOT: case PARSER_TOKEN_TYPE_TYPE: @@ -986,7 +987,6 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_SYMBOL_EOL: case PARSER_TOKEN_SYMBOL_CURLY_BRACKET: case PARSER_TOKEN_SYMBOL_COMMA: - case PARSER_TOKEN_VALUE_U64: return false; case PARSER_TOKEN_NONE: } diff --git a/test/main.felan b/test/main.felan index 0bd20fa..c1d3e49 100644 --- a/test/main.felan +++ b/test/main.felan @@ -1,9 +1,9 @@ main :: () -> void { - a : u64 = fun(2); - print_u64 a + 5; + a : u64 = fun(2,3); + print_u64 a; }; -fun :: (b:u64)->u64 { - return b+1; +fun :: (a:u64,b:u64)->u64 { + return a+b+1; }; |