aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-31 06:26:48 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-31 06:26:48 +0330
commit3c53293e9b2c2f9106da805d26b5eab9dff56225 (patch)
treed88cff685789812698e16711bb61e35e2918b110 /src/compiler/ast-tree.c
parentfaf462fe49bf642866175d842a98d721f8f66208 (diff)
function with exact types are prefered to shape shifters
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 08c8091..0563086 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -7652,7 +7652,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
const char *name_end,
AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall) {
- AstTreeVariable *variable = NULL;
+ struct {
+ AstTreeVariable *var;
+ int op;
+ } variable = {
+ .var = NULL,
+ .op = 10,
+ };
const char *str = name_begin;
const size_t str_size = name_end - name_begin;
@@ -7672,7 +7678,8 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
break;
}
} else {
@@ -7750,13 +7757,17 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
goto CONTINUE_OUTER;
}
}
- if (variable != NULL) {
+ if (variable.var != NULL && variable.op == 0) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
} else if (var->type->token == AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER) {
+ if (variable.op < 1) {
+ continue;
+ }
AstTreeShapeShifter *shapeShifter = var->value->metadata;
AstTreeFunction *function = shapeShifter->function;
@@ -7863,12 +7874,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
}
free(arguments.data);
- if (variable != NULL) {
+ if (variable.var != NULL) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 1;
continue;
CONTINUE_OUTER1:
for (size_t i = 0; i < arguments.size; ++i) {
@@ -7936,23 +7948,24 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
goto CONTINUE_OUTER;
}
}
- if (variable != NULL) {
+ if (variable.var != NULL && variable.op == 0) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
}
CONTINUE_OUTER:
}
}
- if (variable == NULL) {
+ if (variable.var == NULL) {
printError(name_begin, name_end, "No candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- return variable;
+ return variable.var;
}
AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata,