diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/ast-tree.c | 24 | ||||
-rw-r--r-- | src/compiler/parser.c | 2 |
2 files changed, 21 insertions, 5 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: } |