summaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-08 01:44:37 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-08 01:44:37 +0330
commit1b8c8fb55ae5a2bc48951b65b01eb83d75ab4715 (patch)
tree8eeaa2f7dde63223b67375e1411ad3d5c9d246e3 /src/compiler/ast-tree.c
parent79360f43b87cbb0e7ec3abca4c08406866fbf26a (diff)
fix some bugs for return
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index b340d20..3ea860e 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -340,10 +340,12 @@ AstTree *copyAstTree(AstTree *tree) {
AstTreeTypeFunction *metadata = tree->metadata;
AstTreeTypeFunction *new_metadata = a404m_malloc(sizeof(*new_metadata));
new_metadata->returnType = copyAstTree(metadata->returnType);
+ new_metadata->arguments = NULL;
+ new_metadata->arguments_size = 0;
if (metadata->arguments_size != 0) {
UNREACHABLE;
}
- return newAstTree(tree->token, new_metadata, copyAstTree(tree->type));
+ return newAstTree(tree->token, new_metadata, &AST_TREE_TYPE_TYPE);
}
case AST_TREE_TOKEN_OPERATOR_ASSIGN:
case AST_TREE_TOKEN_OPERATOR_SUM:
@@ -636,6 +638,10 @@ AstTree *astTreeParseFunction(ParserNode *parserNode,
if (!astTreeParseConstant(node, variables, variables_size)) {
goto RETURN_ERROR;
}
+ } else if (node->token == PARSER_TOKEN_VARIABLE) {
+ if (!astTreeParseConstant(node, variables, variables_size)) {
+ goto RETURN_ERROR;
+ }
} else {
AstTree *tree = astTreeParse(node, variables, variables_size);
@@ -1030,14 +1036,14 @@ AstTree *makeTypeOf(AstTree *value) {
}
case AST_TREE_TOKEN_OPERATOR_ASSIGN: {
AstTreeInfix *metadata = value->metadata;
- return makeTypeOf(&metadata->left);
+ return copyAstTree(metadata->left.type);
}
case AST_TREE_TOKEN_OPERATOR_SUM: {
AstTreeInfix *metadata = value->metadata;
// TODO: find a better way
- return makeTypeOf(&metadata->left);
+ return copyAstTree(metadata->left.type);
}
case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
@@ -1149,6 +1155,8 @@ bool setTypesFunction(AstTree *tree) {
return false;
}
+ tree->type = makeTypeOf(tree);
+
for (size_t i = 0; i < metadata->scope.expressions_size; ++i) {
AstTree *expression = &metadata->scope.expressions[i];
if (!setAllTypes(expression, metadata)) {
@@ -1162,8 +1170,7 @@ bool setTypesFunction(AstTree *tree) {
}
}
- tree->type = makeTypeOf(tree);
- return tree->type != NULL;
+ return true;
}
bool setTypesPrintU64(AstTree *tree) {
@@ -1278,15 +1285,20 @@ bool setTypesOperatorSum(AstTree *tree) {
bool setTypesAstVariable(AstTreeVariable *variable) {
if (!setAllTypes(variable->value, NULL)) {
return false;
- } else if (variable->type == NULL &&
- (variable->type = makeTypeOf(variable->value)) == NULL) {
+ }
+
+ if (variable->type == NULL) {
+ variable->type = copyAstTree(variable->value->type);
+ }
+
+ if (variable->type == NULL) {
return false;
} else if (!typeIsEqual(variable->value->type, variable->type)) {
printLog("Type mismatch");
return false;
- } else {
- return true;
}
+
+ return true;
}
bool setTypesAstInfix(AstTreeInfix *infix) {